mirror of
https://github.com/RPCS3/llvm.git
synced 2025-02-01 00:02:16 +00:00
876dd978b8
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
41 lines
939 B
LLVM
41 lines
939 B
LLVM
; RUN: llc -mtriple=armv7-apple-ios8.0 -o - %s | FileCheck %s
|
|
|
|
%BigInt = type i5500
|
|
|
|
define %BigInt @test_moved_jumptable(i1 %tst, i32 %sw, %BigInt %l) {
|
|
; CHECK-LABEL: test_moved_jumptable:
|
|
|
|
; CHECK: adr {{r[0-9]+}}, [[JUMP_TABLE:LJTI[0-9]+_[0-9]+]]
|
|
; CHECK: b [[SKIP_TABLE:LBB[0-9]+_[0-9]+]]
|
|
|
|
; CHECK: [[JUMP_TABLE]]:
|
|
; CHECK: .data_region jt32
|
|
; CHECK: .long LBB{{[0-9]+_[0-9]+}}-[[JUMP_TABLE]]
|
|
|
|
; CHECK: [[SKIP_TABLE]]:
|
|
; CHECK: add pc, {{r[0-9]+}}, {{r[0-9]+}}
|
|
br i1 %tst, label %simple, label %complex
|
|
|
|
simple:
|
|
br label %end
|
|
|
|
complex:
|
|
switch i32 %sw, label %simple [ i32 0, label %other
|
|
i32 1, label %third
|
|
i32 5, label %end
|
|
i32 6, label %other ]
|
|
|
|
third:
|
|
ret %BigInt 0
|
|
|
|
other:
|
|
call void @bar()
|
|
unreachable
|
|
|
|
end:
|
|
%val = phi %BigInt [ %l, %complex ], [ -1, %simple ]
|
|
ret %BigInt %val
|
|
}
|
|
|
|
declare void @bar()
|