我正在尝试使用全局指令选择来运行llc
,但是不幸的是,它在任何移位指令(例如shl
)上均失败。
这是使用llc -global-isel=true -filetype=asm sample.ll
表示的方式:
define i64 @test_advance(i1 %nullify, i64 %iaoq) {
entry:
%cache = alloca i64
store i64 %iaoq, i64* %cache
br i1 %nullify, label %cond_true, label %cond_false
cond_false:
%iaoq.1 = load i64, i64* %cache
%iaoq.2 = add i64 %iaoq.1, 4
%iaoq.x = shl i64 %iaoq.2, 13
store i64 %iaoq.x, i64* %cache
br label %next_insn
cond_true:
%iaoq.3 = load i64, i64* %cache
%iaoq.4 = add i64 %iaoq.3, 8
store i64 %iaoq.4, i64* %cache
br label %after_next_insn
next_insn:
%iaoq.5 = load i64, i64* %cache
%iaoq.6 = add i64 %iaoq.5, 4
store i64 %iaoq.6, i64* %cache
br label %after_next_insn
after_next_insn:
%res = load i64, i64* %cache
ret i64 %res
}
为什么会有如此奇怪的行为?轮班有什么奇怪的地方?我的平台是x86。
编辑
在release_70中,此问题已解决,不幸的是global-isel无法处理uadd_with_overflow的合法化:
define i64 @test_advance(i1 %nullify, i64 %iaoq) {
entry:
%0 = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 %iaoq, i64 %iaoq)
%sum_64_7949 = extractvalue { i64, i1 } %0, 0
ret i64 %sum_64_7949
}
; Function Attrs: nounwind readnone speculatable
declare { i64, i1 } @llvm.uadd.with.overflow.i64(i64, i64) #0
它得到相同的错误:
LLVM ERROR: unable to legalize instruction: %3:_(s64), %4:_(s1) = G_UADDE %1:_, %1:_, %5:_ (in function: test_advance)