6.1中间语言 6.1.4静态单赋值形式(SSA) ,一种便于某些代码优化的中间表示 和三地址代码的主要区别 一所有赋值指令都是对不同名字的变量进行赋值 三地址代码 静态单赋值形式 p=a+b P=a +b q=p-c 41 P1-c p=q*d P2=q1 d p=e-p P3=e-p2 q=p+q q2=p3+q1
6 1. 中 间 语 言 6.1.4 静态单赋值形式(SSA) • 一种便于某些代码优化的中间表示 • 和三地址代码的主要区别 – 所有赋值指令都是对不同名字的变量进行赋值 三地址代码 静态单赋值形式 p = a +b p1 = a +b q = p c q1 = p1 c p q = d p2 = q1 d p = e p p3 = e p2 q=p+q q2 = p3 + q1
6.1中间语言 6.1.4静态单赋值形式(SSA) 一种便于某些代码优化的中间表示 和三地址代码的主要区别 一所有赋值指令都是对不同名字的变量进行赋值 ·一个变量在不同路径上都被定值的解决办法 if (flag)x =-1;else x 1; y=x*a; 的条件语句改成 if (flag)x1 =-1;else x2 1; x3=p(K1,X2)月 /由flag的值决定用x还是x2
6 1. 中 间 语 言 6.1.4 静态单赋值形式(SSA) • 一种便于某些代码优化的中间表示 • 和三地址代码的主要区别 – 所有赋值指令都是对不同名字的变量进行赋值 – 一个变量在不同路径上都被定值的解决办法 if (flag) x = 1; else x = 1; y = x a; 的条件语句改成 if (flag) x1 = 1; else x2 = 1; x3 = (x1, x2); //由flag的值决定用x1还是x2
6.2声明语句 本节介绍 ·为局部名字建立符号表条目 为局部名字分配存储单元 符号表中包含名字的类型和分配给它的存储 单元的相对地址等信息
6 2. 声 明 语 句 本节介绍 • 为局部名字建立符号表条目 • 为局部名字分配存储单元 • 符号表中包含名字的类型和分配给它的存储 单元的相对地址等信息
6.2声明语句 6.2.1过程中的声明
6 2. 声 明 语 句 6.2.1 过程中的声明
6.2声明语句 计算被声明名字的类型和相对地址 P→ offset =0)D;S D→D;D D->id T fenter id.lexeme,T.type,offset); offset offset T.width T->integer {T.type integer;T.width 4; T->real {T.type real;T.width 8; T-→array【num of T {T.type array (num.val,T.type); T.width num.val x T.width;) T-→个T,{T.ype=pointer(T1.ype);T.width=4
6 2. 声 明 语 句 计算被声明名字的类型和相对地址 P {offset = 0} D; S D D ; D D id : T {enter ( id.lexeme, T.type, offset); offset = offset + T.width } T i t n eger {T.type = i t n eger; T.wid ht = 4; } T real {T.type = real; T.width = 8; } T array [ num ] of T1 {T.type = array (num.val, T1 {T.type array (num.val, T .type); 1.type); T.width = num.val T1.width;} T T {T t i t (T t ) T idth 4 } 1 {T.type = pointer (T1.type); T.width = 4;}