mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 03:33:20 +01:00
0eb976c493
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. llvm-svn: 238680
48 lines
819 B
LLVM
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)
|