编译器-条件/循环代码生成

条件判断语句的代码生成

st1
if(r1<r2)
    st2
else 
    st3
st4

                st1

BB1        com_LT r1,r2 → r3

               cbr r3 → L1,L2

        L1 : st2

BB2        jumpI L3

BB3        L2 : st3

BB4        L3 : st4

这里的com_LT是比较less than 如果r1比r2小 返回true到r3
cbr是condition branch 如果r3是true 走L1 否则走L2

BB代表的basic block 这里遇到分支branch 或 jump 或 一个新的label 都是一个basic block

Control Flow Graph(CFG) 

在优化代码的时候 划分成这些basic block会使逻辑更加清晰 使得优化工作更加简单
在得到AST之后 编译器会构建这样的一个CFG作为一部分中间表达 每一个baisc block里面有一些线性的汇编指令

循环的代码生成

st1
while(r1==r2)
    st2
st3

第一种写法: 

                st1

BB1        com_EQ r1,r2 → r3

               cbr r3 → L1,L2

               L1 : st2

BB3        com_EQ r1,r2 → r3

               cbr r3 → L1,L2

BB3        L2 : st3

CFG:
 

 第二种写法

BB1        st1

BB2        L0 : com_EQ r1,r2 → r3

               cbr r3 → L1,L2

BB3        L1 : st2

               jumpI L0

BB4        L2 : st3

因为L0 这时候就有4个basic block
CFG:

boolean类型

a > b && c==d || e<=f

loadAI rarp,@a → r1

loadAI rarp,@b → r2

comp_GT r1,r2 → r3

loadAI rarp,@c → r4

loadAI rarp,@d → r5

cmp_EQ r4,r5 → r6

and r3,r6 → r7

loadAI rarp,@e → r8

loadAI rarp,@f → r9

cmp_LE r8,r9 → r10

or r7,r10 → r11

 嵌套循环:

st1;
while(r1>r2)
{
    st2;
    while(r3<=r4)
    {
        st3;
    }
    st4;
}
st5;

 L1_B : Loop body
 L1_O : Loop out
 L1_C : Loop condition

            st1

L1_C : cmp_GT r1,r2 → r5

            cbr r5 → L1_B,L1_O

L1_B   st2

L1_C   cmp_LE r3,r4 → r6

            cbr r6 → L2_B,L2_O

L2_B : st3

            jumpI L2_C

L2_O : st4

            jumpI L1_C

L1_O : st5

猜你喜欢

转载自blog.csdn.net/weixin_43754049/article/details/126339166