diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2015-05-27 18:44:32 +0000 |
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2015-05-27 18:44:32 +0000 |
| commit | 5a5ac124e1efaf208671f01c46edb15f29ed2a0b (patch) | |
| tree | a6140557876943cdd800ee997c9317283394b22c /test/Transforms/LowerSwitch | |
| parent | f03b5bed27d0d2eafd68562ce14f8b5e3f1f0801 (diff) | |
Notes
Diffstat (limited to 'test/Transforms/LowerSwitch')
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 +} |
