1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-21 03:53:04 +02:00

[ARM] Fix crash in ConstantIslands

tPCRelJT may not be the first instruction in a block. Check that instead of dereferencing a broken iterator.

llvm-svn: 284917
This commit is contained in:
James Molloy 2016-10-22 09:58:37 +00:00
parent 7bd3ab8a94
commit 3bb4aed2c3
2 changed files with 46 additions and 1 deletions

View File

@ -2048,7 +2048,9 @@ bool ARMConstantIslands::optimizeThumb2JumpTables() {
// %base = tLEApcrelJT
// %t = tLDRr %idx, %base
unsigned BaseReg = User.MI->getOperand(0).getReg();
if (User.MI->getIterator() == User.MI->getParent()->begin())
continue;
MachineInstr *Shift = User.MI->getPrevNode();
if (Shift->getOpcode() != ARM::tLSLri ||
Shift->getOperand(3).getImm() != 2 ||

View File

@ -0,0 +1,43 @@
; RUN: llc < %s
; No FileCheck - testing for crash.
target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
target triple = "thumbv5e-none-linux-gnueabi"
%struct.blam = type { [4 x %struct.eggs], [6 x [15 x i16]], [6 x i32], i32, i32, i32, i32, i32, i32, %struct.eggs, [4 x %struct.eggs], [4 x %struct.eggs], [4 x i32], i32, i32, i32, [4 x %struct.eggs], [4 x %struct.eggs], i32, %struct.eggs, i32 }
%struct.eggs = type { i32, i32 }
define void @spam(%struct.blam* %arg, i32 %arg1) {
bb:
%tmp = getelementptr inbounds %struct.blam, %struct.blam* %arg, i32 undef, i32 2, i32 %arg1
switch i32 %arg1, label %bb8 [
i32 0, label %bb2
i32 1, label %bb3
i32 2, label %bb4
i32 3, label %bb5
i32 4, label %bb6
i32 5, label %bb7
]
bb2: ; preds = %bb
unreachable
bb3: ; preds = %bb
unreachable
bb4: ; preds = %bb
unreachable
bb5: ; preds = %bb
unreachable
bb6: ; preds = %bb
unreachable
bb7: ; preds = %bb
unreachable
bb8: ; preds = %bb
store i32 1, i32* %tmp, align 4
unreachable
}