summaryrefslogtreecommitdiff
path: root/test/Transforms/LowerSwitch
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2015-05-27 18:44:32 +0000
committerDimitry Andric <dim@FreeBSD.org>2015-05-27 18:44:32 +0000
commit5a5ac124e1efaf208671f01c46edb15f29ed2a0b (patch)
treea6140557876943cdd800ee997c9317283394b22c /test/Transforms/LowerSwitch
parentf03b5bed27d0d2eafd68562ce14f8b5e3f1f0801 (diff)
Notes
Diffstat (limited to 'test/Transforms/LowerSwitch')
-rw-r--r--test/Transforms/LowerSwitch/2014-06-10-SwitchContiguousOpt.ll2
-rw-r--r--test/Transforms/LowerSwitch/2014-06-11-SwitchDefaultUnreachableOpt.ll11
-rw-r--r--test/Transforms/LowerSwitch/feature.ll60
-rw-r--r--test/Transforms/LowerSwitch/fold-popular-case-to-unreachable-default.ll110
4 files changed, 148 insertions, 35 deletions
diff --git a/test/Transforms/LowerSwitch/2014-06-10-SwitchContiguousOpt.ll b/test/Transforms/LowerSwitch/2014-06-10-SwitchContiguousOpt.ll
index 3673c04a8b81e..22173b492c4c5 100644
--- a/test/Transforms/LowerSwitch/2014-06-10-SwitchContiguousOpt.ll
+++ b/test/Transforms/LowerSwitch/2014-06-10-SwitchContiguousOpt.ll
@@ -6,7 +6,7 @@ entry:
%retval = alloca i32, align 4
%a.addr = alloca i32, align 4
store i32 %a, i32* %a.addr, align 4
- %0 = load i32* %a.addr, align 4
+ %0 = load i32, i32* %a.addr, align 4
switch i32 %0, label %sw.default [
i32 0, label %sw.bb
i32 1, label %sw.bb1
diff --git a/test/Transforms/LowerSwitch/2014-06-11-SwitchDefaultUnreachableOpt.ll b/test/Transforms/LowerSwitch/2014-06-11-SwitchDefaultUnreachableOpt.ll
index 0f737211f5985..2652a6cc5e090 100644
--- a/test/Transforms/LowerSwitch/2014-06-11-SwitchDefaultUnreachableOpt.ll
+++ b/test/Transforms/LowerSwitch/2014-06-11-SwitchDefaultUnreachableOpt.ll
@@ -1,5 +1,8 @@
; RUN: opt < %s -lowerswitch -S | FileCheck %s
-; CHECK-NOT: {{.*}}icmp eq{{.*}}
+;
+; The switch is lowered with a single icmp.
+; CHECK: icmp
+; CHECK-NOT: icmp
;
;int foo(int a) {
;
@@ -14,11 +17,11 @@
;
;}
-define i32 @foo(i32 %a) nounwind ssp uwtable {
+define i32 @foo(i32 %a) {
%1 = alloca i32, align 4
%2 = alloca i32, align 4
store i32 %a, i32* %2, align 4
- %3 = load i32* %2, align 4
+ %3 = load i32, i32* %2, align 4
switch i32 %3, label %6 [
i32 0, label %4
i32 1, label %5
@@ -36,6 +39,6 @@ define i32 @foo(i32 %a) nounwind ssp uwtable {
unreachable
; <label>:7
- %8 = load i32* %1
+ %8 = load i32, i32* %1
ret i32 %8
}
diff --git a/test/Transforms/LowerSwitch/feature.ll b/test/Transforms/LowerSwitch/feature.ll
index 09d25f0b06d44..b82d93455436b 100644
--- a/test/Transforms/LowerSwitch/feature.ll
+++ b/test/Transforms/LowerSwitch/feature.ll
@@ -4,49 +4,49 @@
; On output we should got binary comparison tree. Check that all is fine.
;CHECK: entry:
-;CHECK-NEXT: br label %NodeBlock19
+;CHECK-NEXT: br label %NodeBlock.19
-;CHECK: NodeBlock19: ; preds = %entry
-;CHECK-NEXT: %Pivot20 = icmp slt i32 %tmp158, 10
-;CHECK-NEXT: br i1 %Pivot20, label %NodeBlock5, label %NodeBlock17
+;CHECK: NodeBlock.19: ; preds = %entry
+;CHECK-NEXT: %Pivot.20 = icmp slt i32 %tmp158, 10
+;CHECK-NEXT: br i1 %Pivot.20, label %NodeBlock.5, label %NodeBlock.17
-;CHECK: NodeBlock17: ; preds = %NodeBlock19
-;CHECK-NEXT: %Pivot18 = icmp slt i32 %tmp158, 13
-;CHECK-NEXT: br i1 %Pivot18, label %NodeBlock9, label %NodeBlock15
+;CHECK: NodeBlock.17: ; preds = %NodeBlock.19
+;CHECK-NEXT: %Pivot.18 = icmp slt i32 %tmp158, 13
+;CHECK-NEXT: br i1 %Pivot.18, label %NodeBlock.9, label %NodeBlock.15
-;CHECK: NodeBlock15: ; preds = %NodeBlock17
-;CHECK-NEXT: %Pivot16 = icmp slt i32 %tmp158, 14
-;CHECK-NEXT: br i1 %Pivot16, label %bb330, label %NodeBlock13
+;CHECK: NodeBlock.15: ; preds = %NodeBlock.17
+;CHECK-NEXT: %Pivot.16 = icmp slt i32 %tmp158, 14
+;CHECK-NEXT: br i1 %Pivot.16, label %bb330, label %NodeBlock.13
-;CHECK: NodeBlock13: ; preds = %NodeBlock15
-;CHECK-NEXT: %Pivot14 = icmp slt i32 %tmp158, 15
-;CHECK-NEXT: br i1 %Pivot14, label %bb332, label %LeafBlock11
+;CHECK: NodeBlock.13: ; preds = %NodeBlock.15
+;CHECK-NEXT: %Pivot.14 = icmp slt i32 %tmp158, 15
+;CHECK-NEXT: br i1 %Pivot.14, label %bb332, label %LeafBlock.11
-;CHECK: LeafBlock11: ; preds = %NodeBlock13
+;CHECK: LeafBlock.11: ; preds = %NodeBlock.13
;CHECK-NEXT: %SwitchLeaf12 = icmp eq i32 %tmp158, 15
;CHECK-NEXT: br i1 %SwitchLeaf12, label %bb334, label %NewDefault
-;CHECK: NodeBlock9: ; preds = %NodeBlock17
-;CHECK-NEXT: %Pivot10 = icmp slt i32 %tmp158, 11
-;CHECK-NEXT: br i1 %Pivot10, label %bb324, label %NodeBlock7
+;CHECK: NodeBlock.9: ; preds = %NodeBlock.17
+;CHECK-NEXT: %Pivot.10 = icmp slt i32 %tmp158, 11
+;CHECK-NEXT: br i1 %Pivot.10, label %bb324, label %NodeBlock.7
-;CHECK: NodeBlock7: ; preds = %NodeBlock9
-;CHECK-NEXT: %Pivot8 = icmp slt i32 %tmp158, 12
-;CHECK-NEXT: br i1 %Pivot8, label %bb326, label %bb328
+;CHECK: NodeBlock.7: ; preds = %NodeBlock.9
+;CHECK-NEXT: %Pivot.8 = icmp slt i32 %tmp158, 12
+;CHECK-NEXT: br i1 %Pivot.8, label %bb326, label %bb328
-;CHECK: NodeBlock5: ; preds = %NodeBlock19
-;CHECK-NEXT: %Pivot6 = icmp slt i32 %tmp158, 7
-;CHECK-NEXT: br i1 %Pivot6, label %NodeBlock, label %NodeBlock3
+;CHECK: NodeBlock.5: ; preds = %NodeBlock.19
+;CHECK-NEXT: %Pivot.6 = icmp slt i32 %tmp158, 7
+;CHECK-NEXT: br i1 %Pivot.6, label %NodeBlock, label %NodeBlock.3
-;CHECK: NodeBlock3: ; preds = %NodeBlock5
-;CHECK-NEXT: %Pivot4 = icmp slt i32 %tmp158, 8
-;CHECK-NEXT: br i1 %Pivot4, label %bb, label %NodeBlock1
+;CHECK: NodeBlock.3: ; preds = %NodeBlock.5
+;CHECK-NEXT: %Pivot.4 = icmp slt i32 %tmp158, 8
+;CHECK-NEXT: br i1 %Pivot.4, label %bb, label %NodeBlock.1
-;CHECK: NodeBlock1: ; preds = %NodeBlock3
-;CHECK-NEXT: %Pivot2 = icmp slt i32 %tmp158, 9
-;CHECK-NEXT: br i1 %Pivot2, label %bb338, label %bb322
+;CHECK: NodeBlock.1: ; preds = %NodeBlock.3
+;CHECK-NEXT: %Pivot.2 = icmp slt i32 %tmp158, 9
+;CHECK-NEXT: br i1 %Pivot.2, label %bb338, label %bb322
-;CHECK: NodeBlock: ; preds = %NodeBlock5
+;CHECK: NodeBlock: ; preds = %NodeBlock.5
;CHECK-NEXT: %Pivot = icmp slt i32 %tmp158, 0
;CHECK-NEXT: br i1 %Pivot, label %LeafBlock, label %bb338
diff --git a/test/Transforms/LowerSwitch/fold-popular-case-to-unreachable-default.ll b/test/Transforms/LowerSwitch/fold-popular-case-to-unreachable-default.ll
new file mode 100644
index 0000000000000..54929c5bfca36
--- /dev/null
+++ b/test/Transforms/LowerSwitch/fold-popular-case-to-unreachable-default.ll
@@ -0,0 +1,110 @@
+; RUN: opt %s -lowerswitch -S | FileCheck %s
+
+define void @foo(i32 %x, i32* %p) {
+; Cases 2 and 4 are removed and become the new default case.
+; It is now enough to use two icmps to lower the switch.
+;
+; CHECK-LABEL: @foo
+; CHECK: icmp slt i32 %x, 5
+; CHECK: icmp eq i32 %x, 1
+; CHECK-NOT: icmp
+;
+entry:
+ switch i32 %x, label %default [
+ i32 1, label %bb0
+ i32 2, label %popular
+ i32 4, label %popular
+ i32 5, label %bb1
+ ]
+bb0:
+ store i32 0, i32* %p
+ br label %exit
+bb1:
+ store i32 1, i32* %p
+ br label %exit
+popular:
+ store i32 2, i32* %p
+ br label %exit
+exit:
+ ret void
+default:
+ unreachable
+}
+
+define void @unreachable_gap(i64 %x, i32* %p) {
+; Cases 6 and INT64_MAX become the new default, but we still exploit the fact
+; that 3-4 is unreachable, so four icmps is enough.
+
+; CHECK-LABEL: @unreachable_gap
+; CHECK: icmp slt i64 %x, 2
+; CHECK: icmp slt i64 %x, 5
+; CHECK: icmp eq i64 %x, 5
+; CHECK: icmp slt i64 %x, 1
+; CHECK-NOT: icmp
+
+entry:
+ switch i64 %x, label %default [
+ i64 -9223372036854775808, label %bb0
+ i64 1, label %bb1
+ i64 2, label %bb2
+ i64 5, label %bb3
+ i64 6, label %bb4
+ i64 9223372036854775807, label %bb4
+ ]
+bb0:
+ store i32 0, i32* %p
+ br label %exit
+bb1:
+ store i32 1, i32* %p
+ br label %exit
+bb2:
+ store i32 2, i32* %p
+ br label %exit
+bb3:
+ store i32 3, i32* %p
+ br label %exit
+bb4:
+ store i32 4, i32* %p
+ br label %exit
+exit:
+ ret void
+default:
+ unreachable
+}
+
+
+
+define void @nocases(i32 %x, i32* %p) {
+; Don't fall over when there are no cases.
+;
+; CHECK-LABEL: @nocases
+; CHECK-LABEL: entry
+; CHECK-NEXT: br label %default
+;
+entry:
+ switch i32 %x, label %default [
+ ]
+default:
+ unreachable
+}
+
+define void @nocasesleft(i32 %x, i32* %p) {
+; Cases 2 and 4 are removed and we are left with no cases.
+;
+; CHECK-LABEL: @nocasesleft
+; CHECK-LABEL: entry
+; CHECK-NEXT: br label %popular
+;
+entry:
+ switch i32 %x, label %default [
+ i32 2, label %popular
+ i32 4, label %popular
+ ]
+popular:
+ store i32 2, i32* %p
+ br label %exit
+exit:
+ ret void
+default:
+ unreachable
+}