[llvm] r284917 - [ARM] Fix crash in ConstantIslands

James Molloy via llvm-commits llvm-commits at lists.llvm.org
Sat Oct 22 02:58:37 PDT 2016


Author: jamesm
Date: Sat Oct 22 04:58:37 2016
New Revision: 284917

URL: http://llvm.org/viewvc/llvm-project?rev=284917&view=rev
Log:
[ARM] Fix crash in ConstantIslands

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

Added:
    llvm/trunk/test/CodeGen/ARM/constant-island-crash.ll
Modified:
    llvm/trunk/lib/Target/ARM/ARMConstantIslandPass.cpp

Modified: llvm/trunk/lib/Target/ARM/ARMConstantIslandPass.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMConstantIslandPass.cpp?rev=284917&r1=284916&r2=284917&view=diff
==============================================================================
--- llvm/trunk/lib/Target/ARM/ARMConstantIslandPass.cpp (original)
+++ llvm/trunk/lib/Target/ARM/ARMConstantIslandPass.cpp Sat Oct 22 04:58:37 2016
@@ -2048,7 +2048,9 @@ bool ARMConstantIslands::optimizeThumb2J
       //   %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 ||

Added: llvm/trunk/test/CodeGen/ARM/constant-island-crash.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/constant-island-crash.ll?rev=284917&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/ARM/constant-island-crash.ll (added)
+++ llvm/trunk/test/CodeGen/ARM/constant-island-crash.ll Sat Oct 22 04:58:37 2016
@@ -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
+}




More information about the llvm-commits mailing list