llvm/test/CodeGen/Thumb2/constant-islands-jump-table.ll
Tim Northover 876dd978b8 ARM: recommit r237590: allow jump tables to be placed as constant islands.
The original version didn't properly account for the base register
being modified before the final jump, so caused miscompilations in
Chromium and LLVM. I've fixed this and tested with an LLVM self-host
(I don't have the means to build & test Chromium).

The general idea remains the same: in pathological cases jump tables
can be too far away from the instructions referencing them (like other
constants) so they need to be movable.

Should fix PR23627.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@238680 91177308-0d34-0410-b5e6-96231b3b80d8
2015-05-31 19:22:07 +00:00

48 lines
819 B
LLVM

; RUN: llc < %s -mtriple=thumbv7-linux-gnueabihf -O1 %s -o - | FileCheck %s
; CHECK-LABEL: test_jump_table:
; CHECK: b{{.*}} .LBB
; CHECK-NOT: tbh
define i32 @test_jump_table(i32 %x, float %in) {
h1:
%b0 = fadd float %in, 1234.5
%b1 = fptoui float %b0 to i32
switch i32 %x, label %h2 [
i32 0, label %h3
i32 2, label %h4
i32 4, label %h5
i32 6, label %h6
]
h2:
%a0 = add i32 %x, 5
br label %h3
h3:
%d2 = phi i32 [%b1, %h1], [%a0, %h2]
%d3 = add i32 %d2, 3
br label %h4
h4:
%c2 = phi i32 [%b1, %h1], [%d3, %h3]
%c3 = add i32 %c2, 5
br label %h5
h5:
%a2 = phi i32 [%b1, %h1], [%c3, %h4]
%a3 = add i32 %a2, 6
br label %h6
h6:
%y = phi i32 [0, %h1], [%a3, %h5]
call i32 @llvm.arm.space(i32 2000, i32 undef)
ret i32 %y
}
declare i32 @llvm.arm.space(i32, i32)