条件判定文のコード生成
st1
if(r1<r2)
st2
else
st3
st4
st1
BB1 com_LT r1,r2 → r3
cbr r3 → L1,L2
L1 : st2
BB2ジャンプI L3
BB3 L2 : st3
BB4 L3 : st4
ここでの com_LT は未満です。r1 が r2 より小さい場合、r3 に true を返します。cbr
は条件分岐です。r3 が true の場合は L1 に進み、そうでない場合は L2 に進みます。
BBで表される基本ブロックは、分岐やジャンプ、あるいは新たなラベルに遭遇したときの基本ブロックである。
制御フローグラフ(CFG)
コードをこれらの基本ブロックに分割すると、ロジックがより明確になり、最適化作業が容易になります。AST を
取得した後、コンパイラは中間式の一部としてそのような CFG を構築します。各 baisc ブロックにはいくつかの線形アセンブリ命令があります。
循環コード生成
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:
2番目の書き方
BB1 st1
BB2 L0 : com_EQ r1,r2 → r3
cbr r3 → L1,L2
BB3 L1 : st2
ジャンプI L0
BB4 L2 : st3
現時点では、L0 には 4 つの基本ブロック CFG があるため、次のようになります。
ブール型
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
そしてr3、r6→r7
loadAI rarp,@e → r8
loadAI rarp,@f → r9
cmp_LE r8、r9 → r10
または r7、r10 → r11
ネストされたループ:
st1;
while(r1>r2)
{
st2;
while(r3<=r4)
{
st3;
}
st4;
}
st5;
L1_B : ループ本体
L1_O : ループアウト
L1_C : ループ条件
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
ジャンプI L2_C
L2_O : st4
ジャンプI L1_C
L1_O : st5