backpatch出问题
对于下面的测试用例
// Use complex expression in if structure
int main () {
if(1 || 0 && 0){
putint(1);
}
return 0;
}
产生下面的LLVM IR代码:
define i32 @main( ) {
block0:
%0 = icmp ne i32 1, 0
br i1 %0, label %block2, label %block1 // 这里应该是跳转到block2
block1:
%1 = icmp ne i32 0, 0
br i1 %1, label %block2, label %block4
block2:
%2 = icmp ne i32 0, 0
br i1 %2, label %block3, label %block4
block3:
call void @putint(i32 noundef 1)
br label %block4
block4:
br label %block5
block5:
%3 = phi i32 [0, %block4]
ret i32 %3
}
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)