Make SPU backend not assert on jump tables.
authorKalle Raiskila <kalle.raiskila@nokia.com>
Tue, 11 May 2010 11:00:02 +0000 (11:00 +0000)
committerKalle Raiskila <kalle.raiskila@nokia.com>
Tue, 11 May 2010 11:00:02 +0000 (11:00 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@103466 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/CellSPU/SPUInstrInfo.cpp
test/CodeGen/CellSPU/jumptable.ll [new file with mode: 0644]

index 066c5b0614050888d5b72098534b772fae57e389..4c53c988d336e781995ed6232e7a5d9f869397dc 100644 (file)
@@ -467,6 +467,9 @@ SPUInstrInfo::AnalyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB,
   // If there is only one terminator instruction, process it.
   if (I == MBB.begin() || !isUnpredicatedTerminator(--I)) {
     if (isUncondBranch(LastInst)) {
+      // Check for jump tables
+      if (!LastInst->getOperand(0).isMBB())
+        return true;
       TBB = LastInst->getOperand(0).getMBB();
       return false;
     } else if (isCondBranch(LastInst)) {
diff --git a/test/CodeGen/CellSPU/jumptable.ll b/test/CodeGen/CellSPU/jumptable.ll
new file mode 100644 (file)
index 0000000..d7d1ef4
--- /dev/null
@@ -0,0 +1,21 @@
+;RUN: llc --march=cellspu %s -o - | FileCheck %s
+; This is to check that emitting jumptables doesn't crash llc
+define i32 @test(i32 %param) {
+entry:
+;CHECK:        ai      $4, $3, -1
+;CHECK:        clgti   $5, $4, 3
+;CHECK:        brnz    $5,.LBB0_2
+  switch i32 %param, label %bb1 [
+    i32 1, label %bb3
+    i32 2, label %bb2
+    i32 3, label %bb3
+    i32 4, label %bb1
+  ]
+
+bb1:                                            
+  ret i32 1
+bb2:      
+  ret i32 2
+bb3:     
+  ret i32 3
+}