summaryrefslogtreecommitdiffstats
path: root/llvm/test/Transforms/SimplifyCFG/switch-table-bug.ll
diff options
context:
space:
mode:
authorManman Ren <manman.ren@gmail.com>2014-07-23 23:13:23 +0000
committerManman Ren <manman.ren@gmail.com>2014-07-23 23:13:23 +0000
commitedc60376edcc86bbfac132306581b10f3948af69 (patch)
tree4102cabcf104b8a2f87750c46266ab9fe730333a /llvm/test/Transforms/SimplifyCFG/switch-table-bug.ll
parent45bcf8a59c5415286efd587e0127f51e546fa772 (diff)
downloadbcm5719-llvm-edc60376edcc86bbfac132306581b10f3948af69.tar.gz
bcm5719-llvm-edc60376edcc86bbfac132306581b10f3948af69.zip
SimplifyCFG: fix a bug in switch to table conversion
We use gep to access the global array "switch.table", and the table index should be treated as unsigned. When the highest bit is 1, this commit zero-extends the index to an integer type with larger size. For a switch on i2, we used to generate: %switch.tableidx = sub i2 %0, -2 getelementptr inbounds [4 x i64]* @switch.table, i32 0, i2 %switch.tableidx It is incorrect when %switch.tableidx is 2 or 3. The fix is to generate %switch.tableidx = sub i2 %0, -2 %switch.tableidx.zext = zext i2 %switch.tableidx to i3 getelementptr inbounds [4 x i64]* @switch.table, i32 0, i3 %switch.tableidx.zext rdar://17735071 llvm-svn: 213815
Diffstat (limited to 'llvm/test/Transforms/SimplifyCFG/switch-table-bug.ll')
-rw-r--r--llvm/test/Transforms/SimplifyCFG/switch-table-bug.ll41
1 files changed, 41 insertions, 0 deletions
diff --git a/llvm/test/Transforms/SimplifyCFG/switch-table-bug.ll b/llvm/test/Transforms/SimplifyCFG/switch-table-bug.ll
new file mode 100644
index 00000000000..d2e19075935
--- /dev/null
+++ b/llvm/test/Transforms/SimplifyCFG/switch-table-bug.ll
@@ -0,0 +1,41 @@
+; RUN: opt -S -simplifycfg < %s | FileCheck %s
+; rdar://17735071
+target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-apple-darwin12.0.0"
+
+; When tableindex can't fit into i2, we should extend the type to i3.
+; CHECK-LABEL: @_TFO6reduce1E5toRawfS0_FT_Si
+; CHECK: entry:
+; CHECK-NEXT: sub i2 %0, -2
+; CHECK-NEXT: zext i2 %switch.tableidx to i3
+; CHECK-NEXT: getelementptr inbounds [4 x i64]* @switch.table, i32 0, i3 %switch.tableidx.zext
+; CHECK-NEXT: load i64* %switch.gep
+; CHECK-NEXT: ret i64 %switch.load
+define i64 @_TFO6reduce1E5toRawfS0_FT_Si(i2) {
+entry:
+ switch i2 %0, label %1 [
+ i2 0, label %2
+ i2 1, label %3
+ i2 -2, label %4
+ i2 -1, label %5
+ ]
+
+; <label>:1 ; preds = %entry
+ unreachable
+
+; <label>:2 ; preds = %2
+ br label %6
+
+; <label>:3 ; preds = %4
+ br label %6
+
+; <label>:4 ; preds = %6
+ br label %6
+
+; <label>:5 ; preds = %8
+ br label %6
+
+; <label>:6 ; preds = %3, %5, %7, %9
+ %7 = phi i64 [ 3, %5 ], [ 2, %4 ], [ 1, %3 ], [ 0, %2 ]
+ ret i64 %7
+}
OpenPOWER on IntegriCloud