LLVM全局指令选择失败

时间:2018-07-31 12:04:32

标签: llvm llvm-ir

我正在尝试使用全局指令选择来运行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)

0 个答案:

没有答案