样例73
样例73出现了phi函数没有操作数的问题
代码
const int ascii_0 = 48;
int my_getint()
{
int sum = 0, c;
while (1) {
c = getch() - ascii_0;
if (c < 0 || c > 9) {
continue;
} else {
break;
}
}
sum = c;
while (1) {
c = getch() - ascii_0;
if (c >= 0 && c <= 9) {
sum = sum * 10 + c;
} else {
break;
}
}
return sum;
}
void my_putint(int a)
{
int b[16], i = 0;
while (a > 0) {
b[i] = a % 10 + ascii_0;
a = a / 10;
i = i + 1;
}
while (i > 0) {
i = i - 1;
putch(b[i]);
}
}
int main()
{
int n = my_getint();
while (n > 0) {
int m = my_getint();
my_putint(m); putch(10);
n = n - 1;
}
return 0;
}
IR
@ascii_0 = dso_local global i32 48
define i32 @my_getint( ) {
block0:
br label %block1
block1:
%0 = phi i32 [0, %block0], [%6, %block4], [%7, %block6]
%1 = icmp ne i32 1, 0
br i1 %1, label %block2, label %block7
block2:
%2 = call noundef i32 @getch()
%3 = sub i32 %2, 48
%4 = icmp slt i32 %3, 0
br i1 %4, label %block4, label %block3
block3:
%5 = icmp sgt i32 %3, 9
br i1 %5, label %block4, label %block5
block4:
%6 = phi i32 [%3, %block2], [%3, %block3]
br label %block1
block5:
br label %block7
block6:
%7 = phi i32
br label %block1
block7:
%8 = phi i32 [%0, %block1], [%3, %block5]
br label %block8
block8:
%9 = phi i32 [%8, %block7], [%16, %block13]
%10 = icmp ne i32 1, 0
br i1 %10, label %block9, label %block14
block9:
%11 = call noundef i32 @getch()
%12 = sub i32 %11, 48
%13 = icmp sge i32 %12, 0
br i1 %13, label %block10, label %block12
block10:
%14 = icmp sle i32 %12, 9
br i1 %14, label %block11, label %block12
block11:
%15 = mul i32 %9, 10
%16 = add i32 %15, %12
br label %block13
block12:
%17 = phi i32 [%9, %block9], [%9, %block10]
br label %block14
block13:
br label %block8
block14:
%18 = phi i32 [%9, %block8], [%17, %block12]
br label %block15
block15:
%19 = phi i32 [%18, %block14]
ret i32 %19
}
define void @my_putint( i32 %0 ) {
block0:
%1 = alloca [16 x i32], align 16
br label %block1
block1:
%2 = phi i32 [%0, %block0], [%9, %block2]
%3 = phi i32* [%1, %block0], [%3, %block2]
%4 = phi i32 [0, %block0], [%10, %block2]
%5 = icmp sgt i32 %2, 0
br i1 %5, label %block2, label %block3
block2:
%6 = srem i32 %2, 10
%7 = add i32 %6, 48
%8 = getelementptr inbounds [16 x i32], ptr %3, i32 0, i32 %4
store i32 %7, i32* %8
%9 = sdiv i32 %2, 10
%10 = add i32 %4, 1
br label %block1
block3:
br label %block4
block4:
%11 = phi i32 [%4, %block3], [%14, %block5]
%12 = phi i32* [%3, %block3], [%12, %block5]
%13 = icmp sgt i32 %11, 0
br i1 %13, label %block5, label %block6
block5:
%14 = sub i32 %11, 1
%15 = getelementptr inbounds [16 x i32], ptr %12, i32 0, i32 %14
%16 = load i32, i32* %15
call void @putch(i32 noundef %16)
br label %block4
block6:
br label %block7
block7:
ret void
}
define i32 @main( ) {
block0:
%0 = call noundef i32 @my_getint()
br label %block1
block1:
%1 = phi i32 [%0, %block0], [%4, %block2]
%2 = icmp sgt i32 %1, 0
br i1 %2, label %block2, label %block3
block2:
%3 = call noundef i32 @my_getint()
call void @my_putint(i32 noundef %3)
call void @putch(i32 noundef 10)
%4 = sub i32 %1, 1
br label %block1
block3:
br label %block4
block4:
%5 = phi i32 [0, %block3]
ret i32 %5
}
declare i32 @getint()
declare i32 @getch()
declare float @getfloat()
declare i32 @getarray(i32* %0)
declare i32 @getfarray(float* %0)
declare void @putint(i32 %0)
declare void @putch(i32 %0)
declare void @putarray(i32 %0, i32* %1)
declare void @putfloat(float %0)
declare void @putfarray(i32 %0, float* %1)
declare void @putf(i8* %0, ...)
declare void @before_main()
declare void @after_main()
declare void @_sysy_starttime(i32 %0)
declare void @_sysy_stoptime(i32 %0)
declare void @llvm.memset.p0.i32(ptr nocapture writeonly, i8, i32, i1 immarg)
错误信息
llc: error: llc: tmp.ll:24:3: error: expected '[' in phi value list
br label %block1
^