diff --git a/llvm/test/Transforms/InstCombine/simple_phi_condition.ll b/llvm/test/Transforms/InstCombine/simple_phi_condition.ll index 87c864005784a3..a247a2e0b5305d 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 +}