生成的LLVM IR的顺序错误
样例17怎么突然有else if
删掉
对于下面的sysY代码
下面的样例全都是block decl乱序问题
int main() {
int x = 10;
int y = 20;
int z = 0;
int i = 0;
while (i < 5) {
if (x < y) {
if (y > 15) {
z = z + x;
} else {
z = z - x;
}
} else {
z = z * y;
}
i = i+ 1;
}
return z;
}
SCNUCC产生了下面的LLVM IR
define i32 @main( ) {
block0:
br label %block1
block1:
%0 = phi i32 [0, %block0], [%18, %14]
%1 = phi i32 [10, %block0], [%15, %14]
%2 = phi i32 [20, %block0], [%16, %14]
%3 = phi i32 [0, %block0], [%17, %14]
%4 = icmp slt i32 %0, 5
br i1 %4, label %block2, label %block9
block2:
%5 = icmp slt i32 %1, %2
br i1 %5, label %block3, label %block7
block3:
%6 = icmp sgt i32 %2, 15
br i1 %6, label %block4, label %block5
block4:
%7 = add i32 %3, %1
br label %block6
block5:
%8 = sub i32 %3, %1
br label %block6
block6:
%9 = phi i32 [%0, %block4], [%0, %block5]
%10 = phi i32 [%1, %block4], [%1, %block5]
%11 = phi i32 [%2, %block4], [%2, %block5]
%12 = phi i32 [%7, %block4], [%8, %block5]
br label %block8
block7:
%13 = mul i32 %3, %2
br label %block8
%14 = phi i32 [%9, %block6], [%0, %block7]
block8:
%15 = phi i32 [%10, %block6], [%1, %block7]
%16 = phi i32 [%11, %block6], [%2, %block7]
%17 = phi i32 [%12, %block6], [%13, %block7]
%18 = add i32 %14, 1
br label %block1
block9:
br label %block10
block10:
%19 = phi i32 [%3, %block9]
ret i32 %19
}
可以看到,在block7中,莫名其妙地出现了差错,block8位于block7里面了
样例16
//单个if
int main(){
int a;
if(1) a=1;
return a;
}
define i32 @main( ) {
block0:
%0 = icmp ne i32 1, 0
br i1 %0, label %block1, label %block2
block1:
br label %block2
%1 = phi i32 [0.000000, %block0], [1, %block1]
block2:
br label %block3
block3:
%2 = phi i32 [%1, %1]
ret i32 %2
}
样例20
int main(){
int a = 3;
while(a>0){
if(a<3) break;
a = a - 1;
}
return a;
}
define i32 @main( ) {
block0:
br label %block1
block1:
%0 = phi i32 [3, %block0], [%3, %block4]
%1 = icmp sgt i32 %0, 0
br i1 %1, label %block2, label %block5
block2:
%2 = icmp slt i32 %0, 3
br i1 %2, label %block3, label %block4
block3:
br label %block5
block4:
%3 = sub i32 %0, 1
br label %block1
%4 = phi i32 [%0, %block1], [%0, %block3]
block5:
br label %block6
block6:
%5 = phi i32 [%4, %4]
ret i32 %5
}
样例28
int main(){
int a=1,b=0,c=1,d=0,e=1;
int flag = 0;
if(a-b*c!=d-a/c||a*b/c==e+d||a+b+c==d+e){
flag=1;
}
return flag;
}
define i32 @main( ) {
block0:
br i1 1, label %block3, label %block1
block1:
br i1 0, label %block3, label %block2
block2:
br i1 0, label %block3, label %block4
block3:
br label %block4
%0 = phi i32 [0, %block2], [1, %block3]
block4:
br label %block5
block5:
%1 = phi i32 [%0, %0]
ret i32 %1
}
样例29
int a = 1;
int b = 0;
int c = 1;
int d = 2;
int e = 4;
int main()
{
int flag=0;
if(a * b / c == e + d && a * (a + b) + c <= d + e || a - (b * c) == d - a / c)
{
flag=1;
}
return flag;
}
@a = global i32 0
@b = global i32 0
@c = global i32 0
@d = global i32 0
@e = global i32 0
@llvm.global_ctors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr @_GLOBAL__sub_I_example.cpp, ptr null }]
define internal void @init_a() #0 section ".text.startup" {
block0:
store i32 1, i32* @a
ret void
}
define internal void @init_b() #0 section ".text.startup" {
block0:
store i32 0, i32* @b
ret void
}
define internal void @init_c() #0 section ".text.startup" {
block0:
store i32 1, i32* @c
ret void
}
define internal void @init_d() #0 section ".text.startup" {
block0:
store i32 2, i32* @d
ret void
}
define internal void @init_e() #0 section ".text.startup" {
block0:
store i32 4, i32* @e
ret void
}
define internal void @_GLOBAL__sub_I_example.cpp() #1 section ".text.startup" {
call void @init_a()
call void @init_b()
call void @init_c()
call void @init_d()
call void @init_e()
ret void
}
define i32 @main( ) {
block0:
%0 = load i32, i32* @a
%1 = load i32, i32* @b
%2 = mul i32 %0, %1
%3 = load i32, i32* @c
%4 = sdiv i32 %2, %3
%5 = load i32, i32* @e
%6 = load i32, i32* @d
%7 = add i32 %5, %6
%8 = icmp eq i32 %4, %7
br i1 %8, label %block1, label %block2
block1:
%9 = load i32, i32* @a
%10 = load i32, i32* @a
%11 = load i32, i32* @b
%12 = add i32 %10, %11
%13 = mul i32 %9, %12
%14 = load i32, i32* @c
%15 = add i32 %13, %14
%16 = load i32, i32* @d
%17 = load i32, i32* @e
%18 = add i32 %16, %17
%19 = icmp sle i32 %15, %18
br i1 %19, label %block3, label %block2
block2:
%20 = phi i32 [0, %block0], [0, %block1]
%21 = load i32, i32* @a
%22 = load i32, i32* @b
%23 = load i32, i32* @c
%24 = mul i32 %22, %23
%25 = sub i32 %21, %24
%26 = load i32, i32* @d
%27 = load i32, i32* @a
%28 = load i32, i32* @c
%29 = sdiv i32 %27, %28
%30 = sub i32 %26, %29
%31 = icmp eq i32 %25, %30
br i1 %31, label %block3, label %block4
block3:
br label %block4
%32 = phi i32 [%20, %block2], [1, %block3]
block4:
br label %block5
block5:
%33 = phi i32 [%32, %32]
ret i32 %33
}