[llvm] 85491fb - [InstCombine] Add tests for phi to cond with switch (NFC)

Nikita Popov via llvm-commits llvm-commits at lists.llvm.org
Wed Mar 2 02:06:25 PST 2022


Author: Nikita Popov
Date: 2022-03-02T11:06:15+01:00
New Revision: 85491fb6e4d1a7b285d1a0c4e44909fd6eb778f9

URL: https://github.com/llvm/llvm-project/commit/85491fb6e4d1a7b285d1a0c4e44909fd6eb778f9
DIFF: https://github.com/llvm/llvm-project/commit/85491fb6e4d1a7b285d1a0c4e44909fd6eb778f9.diff

LOG: [InstCombine] Add tests for phi to cond with switch (NFC)

Currently we only handle br but not switch in this fold.

Added: 
    

Modified: 
    llvm/test/Transforms/InstCombine/simple_phi_condition.ll

Removed: 
    


################################################################################
diff  --git a/llvm/test/Transforms/InstCombine/simple_phi_condition.ll b/llvm/test/Transforms/InstCombine/simple_phi_condition.ll
index 87c864005784a..a247a2e0b5305 100644
--- a/llvm/test/Transforms/InstCombine/simple_phi_condition.ll
+++ b/llvm/test/Transforms/InstCombine/simple_phi_condition.ll
@@ -261,3 +261,296 @@ merge:
   %ret = phi i1 [ true, %if.true ], [ false, %if2.true ], [ false, %if2.false ]
   ret i1 %ret
 }
+
+define i8 @test_switch(i8 %cond) {
+; CHECK-LABEL: @test_switch(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    switch i8 [[COND:%.*]], label [[DEFAULT:%.*]] [
+; CHECK-NEXT:    i8 1, label [[SW_1:%.*]]
+; CHECK-NEXT:    i8 7, label [[SW_7:%.*]]
+; CHECK-NEXT:    i8 19, label [[SW_19:%.*]]
+; CHECK-NEXT:    ]
+; CHECK:       sw.1:
+; CHECK-NEXT:    br label [[MERGE:%.*]]
+; CHECK:       sw.7:
+; CHECK-NEXT:    br label [[MERGE]]
+; CHECK:       sw.19:
+; CHECK-NEXT:    br label [[MERGE]]
+; CHECK:       default:
+; CHECK-NEXT:    ret i8 42
+; CHECK:       merge:
+; CHECK-NEXT:    [[RET:%.*]] = phi i8 [ 1, [[SW_1]] ], [ 7, [[SW_7]] ], [ 19, [[SW_19]] ]
+; CHECK-NEXT:    ret i8 [[RET]]
+;
+entry:
+  switch i8 %cond, label %default [
+  i8 1, label %sw.1
+  i8 7, label %sw.7
+  i8 19, label %sw.19
+  ]
+
+sw.1:
+  br label %merge
+
+sw.7:
+  br label %merge
+
+sw.19:
+  br label %merge
+
+default:
+  ret i8 42
+
+merge:
+  %ret = phi i8 [ 1, %sw.1 ], [ 7, %sw.7 ], [ 19, %sw.19 ]
+  ret i8 %ret
+}
+
+define i8 @test_switch_direct_edge(i8 %cond) {
+; CHECK-LABEL: @test_switch_direct_edge(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    switch i8 [[COND:%.*]], label [[DEFAULT:%.*]] [
+; CHECK-NEXT:    i8 1, label [[SW_1:%.*]]
+; CHECK-NEXT:    i8 7, label [[SW_7:%.*]]
+; CHECK-NEXT:    i8 19, label [[MERGE:%.*]]
+; CHECK-NEXT:    ]
+; CHECK:       sw.1:
+; CHECK-NEXT:    br label [[MERGE]]
+; CHECK:       sw.7:
+; CHECK-NEXT:    br label [[MERGE]]
+; CHECK:       default:
+; CHECK-NEXT:    ret i8 42
+; CHECK:       merge:
+; CHECK-NEXT:    [[RET:%.*]] = phi i8 [ 1, [[SW_1]] ], [ 7, [[SW_7]] ], [ 19, [[ENTRY:%.*]] ]
+; CHECK-NEXT:    ret i8 [[RET]]
+;
+entry:
+  switch i8 %cond, label %default [
+  i8 1, label %sw.1
+  i8 7, label %sw.7
+  i8 19, label %merge
+  ]
+
+sw.1:
+  br label %merge
+
+sw.7:
+  br label %merge
+
+default:
+  ret i8 42
+
+merge:
+  %ret = phi i8 [ 1, %sw.1 ], [ 7, %sw.7 ], [ 19, %entry ]
+  ret i8 %ret
+}
+
+define i8 @test_switch_subset(i8 %cond) {
+; CHECK-LABEL: @test_switch_subset(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    switch i8 [[COND:%.*]], label [[DEFAULT:%.*]] [
+; CHECK-NEXT:    i8 1, label [[SW_1:%.*]]
+; CHECK-NEXT:    i8 7, label [[SW_7:%.*]]
+; CHECK-NEXT:    i8 19, label [[SW_19:%.*]]
+; CHECK-NEXT:    ]
+; CHECK:       sw.1:
+; CHECK-NEXT:    br label [[MERGE:%.*]]
+; CHECK:       sw.7:
+; CHECK-NEXT:    br label [[MERGE]]
+; CHECK:       sw.19:
+; CHECK-NEXT:    ret i8 24
+; CHECK:       default:
+; CHECK-NEXT:    ret i8 42
+; CHECK:       merge:
+; CHECK-NEXT:    [[RET:%.*]] = phi i8 [ 1, [[SW_1]] ], [ 7, [[SW_7]] ]
+; CHECK-NEXT:    ret i8 [[RET]]
+;
+entry:
+  switch i8 %cond, label %default [
+  i8 1, label %sw.1
+  i8 7, label %sw.7
+  i8 19, label %sw.19
+  ]
+
+sw.1:
+  br label %merge
+
+sw.7:
+  br label %merge
+
+sw.19:
+  ret i8 24
+
+default:
+  ret i8 42
+
+merge:
+  %ret = phi i8 [ 1, %sw.1 ], [ 7, %sw.7 ]
+  ret i8 %ret
+}
+
+define i8 @test_switch_wrong_value(i8 %cond) {
+; CHECK-LABEL: @test_switch_wrong_value(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    switch i8 [[COND:%.*]], label [[DEFAULT:%.*]] [
+; CHECK-NEXT:    i8 1, label [[SW_1:%.*]]
+; CHECK-NEXT:    i8 7, label [[SW_7:%.*]]
+; CHECK-NEXT:    i8 19, label [[SW_19:%.*]]
+; CHECK-NEXT:    ]
+; CHECK:       sw.1:
+; CHECK-NEXT:    br label [[MERGE:%.*]]
+; CHECK:       sw.7:
+; CHECK-NEXT:    br label [[MERGE]]
+; CHECK:       sw.19:
+; CHECK-NEXT:    br label [[MERGE]]
+; CHECK:       default:
+; CHECK-NEXT:    ret i8 42
+; CHECK:       merge:
+; CHECK-NEXT:    [[RET:%.*]] = phi i8 [ 1, [[SW_1]] ], [ 7, [[SW_7]] ], [ 10, [[SW_19]] ]
+; CHECK-NEXT:    ret i8 [[RET]]
+;
+entry:
+  switch i8 %cond, label %default [
+  i8 1, label %sw.1
+  i8 7, label %sw.7
+  i8 19, label %sw.19
+  ]
+
+sw.1:
+  br label %merge
+
+sw.7:
+  br label %merge
+
+sw.19:
+  br label %merge
+
+default:
+  ret i8 42
+
+merge:
+  %ret = phi i8 [ 1, %sw.1 ], [ 7, %sw.7 ], [ 10, %sw.19 ]
+  ret i8 %ret
+}
+
+define i8 @test_switch_inverted(i8 %cond) {
+; CHECK-LABEL: @test_switch_inverted(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    switch i8 [[COND:%.*]], label [[DEFAULT:%.*]] [
+; CHECK-NEXT:    i8 0, label [[SW_0:%.*]]
+; CHECK-NEXT:    i8 1, label [[SW_1:%.*]]
+; CHECK-NEXT:    i8 2, label [[SW_2:%.*]]
+; CHECK-NEXT:    ]
+; CHECK:       sw.0:
+; CHECK-NEXT:    br label [[MERGE:%.*]]
+; CHECK:       sw.1:
+; CHECK-NEXT:    br label [[MERGE]]
+; CHECK:       sw.2:
+; CHECK-NEXT:    br label [[MERGE]]
+; CHECK:       default:
+; CHECK-NEXT:    ret i8 42
+; CHECK:       merge:
+; CHECK-NEXT:    [[RET:%.*]] = phi i8 [ -1, [[SW_0]] ], [ -2, [[SW_1]] ], [ -3, [[SW_2]] ]
+; CHECK-NEXT:    ret i8 [[RET]]
+;
+entry:
+  switch i8 %cond, label %default [
+  i8 0, label %sw.0
+  i8 1, label %sw.1
+  i8 2, label %sw.2
+  ]
+
+sw.0:
+  br label %merge
+
+sw.1:
+  br label %merge
+
+sw.2:
+  br label %merge
+
+default:
+  ret i8 42
+
+merge:
+  %ret = phi i8 [ -1, %sw.0 ], [ -2, %sw.1 ], [ -3, %sw.2 ]
+  ret i8 %ret
+}
+
+define i8 @test_switch_duplicate_edge(i8 %cond) {
+; CHECK-LABEL: @test_switch_duplicate_edge(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    switch i8 [[COND:%.*]], label [[DEFAULT:%.*]] [
+; CHECK-NEXT:    i8 1, label [[SW_1:%.*]]
+; CHECK-NEXT:    i8 7, label [[SW_7:%.*]]
+; CHECK-NEXT:    i8 19, label [[SW_7]]
+; CHECK-NEXT:    ]
+; CHECK:       sw.1:
+; CHECK-NEXT:    br label [[MERGE:%.*]]
+; CHECK:       sw.7:
+; CHECK-NEXT:    br label [[MERGE]]
+; CHECK:       default:
+; CHECK-NEXT:    ret i8 42
+; CHECK:       merge:
+; CHECK-NEXT:    [[RET:%.*]] = phi i8 [ 1, [[SW_1]] ], [ 7, [[SW_7]] ]
+; CHECK-NEXT:    ret i8 [[RET]]
+;
+entry:
+  switch i8 %cond, label %default [
+  i8 1, label %sw.1
+  i8 7, label %sw.7
+  i8 19, label %sw.7
+  ]
+
+sw.1:
+  br label %merge
+
+sw.7:
+  br label %merge
+
+default:
+  ret i8 42
+
+merge:
+  %ret = phi i8 [ 1, %sw.1 ], [ 7, %sw.7 ]
+  ret i8 %ret
+}
+
+define i8 @test_switch_default_edge(i8 %cond) {
+; CHECK-LABEL: @test_switch_default_edge(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    switch i8 [[COND:%.*]], label [[MERGE:%.*]] [
+; CHECK-NEXT:    i8 1, label [[SW_1:%.*]]
+; CHECK-NEXT:    i8 7, label [[SW_7:%.*]]
+; CHECK-NEXT:    i8 19, label [[SW_19:%.*]]
+; CHECK-NEXT:    ]
+; CHECK:       sw.1:
+; CHECK-NEXT:    br label [[MERGE]]
+; CHECK:       sw.7:
+; CHECK-NEXT:    br label [[MERGE]]
+; CHECK:       sw.19:
+; CHECK-NEXT:    br label [[MERGE]]
+; CHECK:       merge:
+; CHECK-NEXT:    [[RET:%.*]] = phi i8 [ 1, [[SW_1]] ], [ 7, [[SW_7]] ], [ 19, [[SW_19]] ], [ 42, [[ENTRY:%.*]] ]
+; CHECK-NEXT:    ret i8 [[RET]]
+;
+entry:
+  switch i8 %cond, label %merge [
+  i8 1, label %sw.1
+  i8 7, label %sw.7
+  i8 19, label %sw.19
+  ]
+
+sw.1:
+  br label %merge
+
+sw.7:
+  br label %merge
+
+sw.19:
+  br label %merge
+
+merge:
+  %ret = phi i8 [ 1, %sw.1 ], [ 7, %sw.7 ], [ 19, %sw.19 ], [ 42, %entry ]
+  ret i8 %ret
+}


        


More information about the llvm-commits mailing list