编译LLVM Bitcode时出现错误,请求协助排查
搞定你的LLVM IR编译错误!
先把你贴的代码放出来,方便定位问题:
define void @.datadiv_decode2604521171261794706() { ; <label>:0: br label %1 br label %6 ; <label>:1: ; preds = %1, %0 %2 = phi i32 [ 0, %0 ], [ %3, %1 ] %3 = add i32 %2, 1 %4 = icmp ult i32 %2, 12 %5 = icmp ne i1 %4, i32 0 br i1 %5, label %1, label %0 ; <label>:6: ; preds = %6, %0 %7 = phi i32 [ 0, %0 ], [ %8, %6 ] %8 = add i32 %7, 1 %9 = icmp ult i32 %7, 2 %10 = icmp ne i1 %9, i32 0 br i1 %10, label %6, label %0 }
一眼看穿的核心错误:类型不匹配
你代码里有两处犯了同一个低级错误:
- 看
%5 = icmp ne i1 %4, i32 0这行:%4是icmp ult返回的i1类型(LLVM里所有比较指令的结果都是1位整数,就是我们常说的布尔值),但你把它和i32类型的0做不等于比较。LLVM的icmp指令要求两个操作数必须是相同类型的整数,这种跨类型比较直接触发编译报错。 - 另一处
%10 = icmp ne i1 %9, i32 0也是一模一样的问题,%9是i1类型,右边是i32的0,完全不兼容。
最简单的修复方式:去掉多余的比较
其实这两处icmp ne完全是画蛇添足——icmp ult的结果本身就是布尔值,直接拿它当分支判断的条件就行,根本不需要再和0比较。比如%4的值为1(i1)时,就表示%2 < 12成立,直接跳回循环;为0时就退出循环。
修复后的代码如下:
define void @.datadiv_decode2604521171261794706() { ; <label>:0: br label %1 br label %6 ; <label>:1: ; preds = %1, %0 %2 = phi i32 [ 0, %0 ], [ %3, %1 ] %3 = add i32 %2, 1 %4 = icmp ult i32 %2, 12 ; 直接用%4作为分支条件,删掉多余的icmp ne br i1 %4, label %1, label %0 ; <label>:6: ; preds = %6, %0 %7 = phi i32 [ 0, %0 ], [ %8, %6 ] %8 = add i32 %7, 1 %9 = icmp ult i32 %7, 2 ; 同样直接用%9作为分支条件 br i1 %9, label %6, label %0 }
如果你非要保留icmp ne的写法(虽然真的没必要),也可以把右边的i32 0改成i1 0,比如:
%5 = icmp ne i1 %4, i1 0
但这和直接用%4的结果完全一样,属于多此一举,反而增加了不必要的指令,不如直接用原比较结果高效。
额外提醒:还有个控制流的坑
除了类型错误,你代码开头的基本块<label>:0:里有两个无条件分支指令:br label %1和br label %6。这在LLVM IR里是未定义行为——一个基本块的最后一条指令只能有一个控制流出口(要么是一个无条件分支,要么是条件分支,要么是返回/终止指令)。你当前的编译错误是先由类型不匹配触发的,等你修复类型问题后,这个控制流问题也会暴露出来,记得要调整逻辑,比如用条件分支选择跳转目标,或者拆分这个基本块。
内容的提问来源于stack exchange,提问作者Luba A
相关产品推荐
相关产品推荐

