[llvm] c0b25f4 - [InstCombine] Test cast support in simplifyUsingControlFlow (NFC)

Andreas Jonson via llvm-commits llvm-commits at lists.llvm.org
Sat May 31 00:28:53 PDT 2025


Author: Andreas Jonson
Date: 2025-05-31T09:21:35+02:00
New Revision: c0b25f4e74c5eeab38d24d3aca0ebddc0d4132f0

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

LOG: [InstCombine] Test cast support in simplifyUsingControlFlow (NFC)

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 5501cb707e899..544ebaecaa752 100644
--- a/llvm/test/Transforms/InstCombine/simple_phi_condition.ll
+++ b/llvm/test/Transforms/InstCombine/simple_phi_condition.ll
@@ -266,9 +266,9 @@ 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:      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:%.*]]
@@ -309,9 +309,9 @@ 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:      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]]
@@ -347,9 +347,9 @@ define i8 @test_switch_duplicate_direct_edge(i8 %cond) {
 ; CHECK-LABEL: @test_switch_duplicate_direct_edge(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    switch i8 [[COND:%.*]], label [[DEFAULT:%.*]] [
-; CHECK-NEXT:    i8 1, label [[SW_1:%.*]]
-; CHECK-NEXT:    i8 7, label [[MERGE:%.*]]
-; CHECK-NEXT:    i8 19, label [[MERGE]]
+; CHECK-NEXT:      i8 1, label [[SW_1:%.*]]
+; CHECK-NEXT:      i8 7, label [[MERGE:%.*]]
+; CHECK-NEXT:      i8 19, label [[MERGE]]
 ; CHECK-NEXT:    ]
 ; CHECK:       sw.1:
 ; CHECK-NEXT:    br label [[MERGE]]
@@ -381,9 +381,9 @@ 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:      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:%.*]]
@@ -424,9 +424,9 @@ 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:      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:%.*]]
@@ -468,9 +468,9 @@ 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:      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:%.*]]
@@ -512,9 +512,9 @@ 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:      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:%.*]]
@@ -551,9 +551,9 @@ 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:      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]]
@@ -590,9 +590,9 @@ define i8 @test_switch_default_edge_direct(i8 %cond) {
 ; CHECK-LABEL: @test_switch_default_edge_direct(
 ; 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 [[MERGE]]
+; 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]]
@@ -621,9 +621,9 @@ define i8 @test_switch_default_edge_duplicate(i8 %cond) {
 ; CHECK-LABEL: @test_switch_default_edge_duplicate(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    switch i8 [[COND:%.*]], label [[SW_19:%.*]] [
-; CHECK-NEXT:    i8 1, label [[SW_1:%.*]]
-; CHECK-NEXT:    i8 7, label [[SW_7:%.*]]
-; CHECK-NEXT:    i8 19, label [[SW_19]]
+; 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:%.*]]
@@ -651,3 +651,296 @@ merge:
   %ret = phi i8 [ 1, %sw.1 ], [ 7, %sw.7 ], [ 19, %sw.19 ]
   ret i8 %ret
 }
+
+define i32 @test_phi_to_zext(i8 noundef %0) {
+; CHECK-LABEL: @test_phi_to_zext(
+; CHECK-NEXT:  start:
+; CHECK-NEXT:    switch i8 [[TMP0:%.*]], label [[BB2:%.*]] [
+; CHECK-NEXT:      i8 -1, label [[BB3:%.*]]
+; CHECK-NEXT:      i8 0, label [[BB4:%.*]]
+; CHECK-NEXT:      i8 1, label [[BB1:%.*]]
+; CHECK-NEXT:    ]
+; CHECK:       bb2:
+; CHECK-NEXT:    unreachable
+; CHECK:       bb3:
+; CHECK-NEXT:    br label [[BB5:%.*]]
+; CHECK:       bb4:
+; CHECK-NEXT:    br label [[BB5]]
+; CHECK:       bb1:
+; CHECK-NEXT:    br label [[BB5]]
+; CHECK:       bb5:
+; CHECK-NEXT:    [[DOT0:%.*]] = phi i32 [ 1, [[BB1]] ], [ 0, [[BB4]] ], [ 255, [[BB3]] ]
+; CHECK-NEXT:    ret i32 [[DOT0]]
+;
+start:
+  switch i8 %0, label %bb2 [
+  i8 -1, label %bb3
+  i8 0, label %bb4
+  i8 1, label %bb1
+  ]
+
+bb2:                                              ; preds = %start
+  unreachable
+
+bb3:                                              ; preds = %start
+  br label %bb5
+
+bb4:                                              ; preds = %start
+  br label %bb5
+
+bb1:                                              ; preds = %start
+  br label %bb5
+
+bb5:                                              ; preds = %bb1, %bb4, %bb3
+  %.0 = phi i32 [ 1, %bb1 ], [ 0, %bb4 ], [ 255, %bb3 ]
+  ret i32 %.0
+}
+
+define i32 @test_phi_to_sext(i8 noundef %0) {
+; CHECK-LABEL: @test_phi_to_sext(
+; CHECK-NEXT:  start:
+; CHECK-NEXT:    switch i8 [[TMP0:%.*]], label [[BB2:%.*]] [
+; CHECK-NEXT:      i8 -1, label [[BB3:%.*]]
+; CHECK-NEXT:      i8 0, label [[BB4:%.*]]
+; CHECK-NEXT:      i8 1, label [[BB1:%.*]]
+; CHECK-NEXT:    ]
+; CHECK:       bb2:
+; CHECK-NEXT:    unreachable
+; CHECK:       bb3:
+; CHECK-NEXT:    br label [[BB5:%.*]]
+; CHECK:       bb4:
+; CHECK-NEXT:    br label [[BB5]]
+; CHECK:       bb1:
+; CHECK-NEXT:    br label [[BB5]]
+; CHECK:       bb5:
+; CHECK-NEXT:    [[DOT0:%.*]] = phi i32 [ 1, [[BB1]] ], [ 0, [[BB4]] ], [ -1, [[BB3]] ]
+; CHECK-NEXT:    ret i32 [[DOT0]]
+;
+start:
+  switch i8 %0, label %bb2 [
+  i8 -1, label %bb3
+  i8 0, label %bb4
+  i8 1, label %bb1
+  ]
+
+bb2:                                              ; preds = %start
+  unreachable
+
+bb3:                                              ; preds = %start
+  br label %bb5
+
+bb4:                                              ; preds = %start
+  br label %bb5
+
+bb1:                                              ; preds = %start
+  br label %bb5
+
+bb5:                                              ; preds = %bb1, %bb4, %bb3
+  %.0 = phi i32 [ 1, %bb1 ], [ 0, %bb4 ], [ -1, %bb3 ]
+  ret i32 %.0
+}
+
+define i32 @test_phi_to_sext_inverted(i8 noundef %0) {
+; CHECK-LABEL: @test_phi_to_sext_inverted(
+; CHECK-NEXT:  start:
+; CHECK-NEXT:    switch i8 [[TMP0:%.*]], label [[BB2:%.*]] [
+; CHECK-NEXT:      i8 -1, label [[BB3:%.*]]
+; CHECK-NEXT:      i8 0, label [[BB4:%.*]]
+; CHECK-NEXT:      i8 1, label [[BB1:%.*]]
+; CHECK-NEXT:    ]
+; CHECK:       bb2:
+; CHECK-NEXT:    unreachable
+; CHECK:       bb3:
+; CHECK-NEXT:    br label [[BB5:%.*]]
+; CHECK:       bb4:
+; CHECK-NEXT:    br label [[BB5]]
+; CHECK:       bb1:
+; CHECK-NEXT:    br label [[BB5]]
+; CHECK:       bb5:
+; CHECK-NEXT:    [[DOT0:%.*]] = phi i32 [ -2, [[BB1]] ], [ -1, [[BB4]] ], [ 0, [[BB3]] ]
+; CHECK-NEXT:    ret i32 [[DOT0]]
+;
+start:
+  switch i8 %0, label %bb2 [
+  i8 -1, label %bb3
+  i8 0, label %bb4
+  i8 1, label %bb1
+  ]
+
+bb2:                                              ; preds = %start
+  unreachable
+
+bb3:                                              ; preds = %start
+  br label %bb5
+
+bb4:                                              ; preds = %start
+  br label %bb5
+
+bb1:                                              ; preds = %start
+  br label %bb5
+
+bb5:                                              ; preds = %bb1, %bb4, %bb3
+  %.0 = phi i32 [ -2, %bb1 ], [ -1, %bb4 ], [ 0, %bb3 ]
+  ret i32 %.0
+}
+
+define i32 @test_neg_value_not_possible_to_zext_or_sext(i8 noundef %0) {
+; CHECK-LABEL: @test_neg_value_not_possible_to_zext_or_sext(
+; CHECK-NEXT:  start:
+; CHECK-NEXT:    switch i8 [[TMP0:%.*]], label [[BB2:%.*]] [
+; CHECK-NEXT:      i8 -1, label [[BB3:%.*]]
+; CHECK-NEXT:      i8 0, label [[BB4:%.*]]
+; CHECK-NEXT:      i8 1, label [[BB1:%.*]]
+; CHECK-NEXT:    ]
+; CHECK:       bb2:
+; CHECK-NEXT:    unreachable
+; CHECK:       bb3:
+; CHECK-NEXT:    br label [[BB5:%.*]]
+; CHECK:       bb4:
+; CHECK-NEXT:    br label [[BB5]]
+; CHECK:       bb1:
+; CHECK-NEXT:    br label [[BB5]]
+; CHECK:       bb5:
+; CHECK-NEXT:    [[DOT0:%.*]] = phi i32 [ 1, [[BB1]] ], [ 0, [[BB4]] ], [ 511, [[BB3]] ]
+; CHECK-NEXT:    ret i32 [[DOT0]]
+;
+start:
+  switch i8 %0, label %bb2 [
+  i8 -1, label %bb3
+  i8 0, label %bb4
+  i8 1, label %bb1
+  ]
+
+bb2:                                              ; preds = %start
+  unreachable
+
+bb3:                                              ; preds = %start
+  br label %bb5
+
+bb4:                                              ; preds = %start
+  br label %bb5
+
+bb1:                                              ; preds = %start
+  br label %bb5
+
+bb5:                                              ; preds = %bb1, %bb4, %bb3
+  %.0 = phi i32 [ 1, %bb1 ], [ 0, %bb4 ], [ 511, %bb3 ]
+  ret i32 %.0
+}
+
+define i8 @test_phi_to_trunc(i32 %0) {
+; CHECK-LABEL: @test_phi_to_trunc(
+; CHECK-NEXT:  start:
+; CHECK-NEXT:    switch i32 [[TMP0:%.*]], label [[BB2:%.*]] [
+; CHECK-NEXT:      i32 0, label [[BB5:%.*]]
+; CHECK-NEXT:      i32 1, label [[BB4:%.*]]
+; CHECK-NEXT:      i32 255, label [[BB1:%.*]]
+; CHECK-NEXT:    ]
+; CHECK:       bb2:
+; CHECK-NEXT:    unreachable
+; CHECK:       bb4:
+; CHECK-NEXT:    br label [[BB5]]
+; CHECK:       bb1:
+; CHECK-NEXT:    br label [[BB5]]
+; CHECK:       bb5:
+; CHECK-NEXT:    [[DOT0:%.*]] = phi i8 [ -1, [[BB1]] ], [ 1, [[BB4]] ], [ 0, [[START:%.*]] ]
+; CHECK-NEXT:    ret i8 [[DOT0]]
+;
+start:
+  switch i32 %0, label %bb2 [
+  i32 0, label %bb5
+  i32 1, label %bb4
+  i32 255, label %bb1
+  ]
+
+bb2:                                              ; preds = %start
+  unreachable
+
+bb4:                                              ; preds = %start
+  br label %bb5
+
+bb1:                                              ; preds = %start
+  br label %bb5
+
+bb5:                                              ; preds = %start, %bb1, %bb4
+  %.0 = phi i8 [ -1, %bb1 ], [ 1, %bb4 ], [ 0, %start ]
+  ret i8 %.0
+}
+
+define i8 @test_phi_to_trunc_inverted(i32 %0) {
+; CHECK-LABEL: @test_phi_to_trunc_inverted(
+; CHECK-NEXT:  start:
+; CHECK-NEXT:    switch i32 [[TMP0:%.*]], label [[BB2:%.*]] [
+; CHECK-NEXT:      i32 0, label [[BB5:%.*]]
+; CHECK-NEXT:      i32 1, label [[BB4:%.*]]
+; CHECK-NEXT:      i32 255, label [[BB1:%.*]]
+; CHECK-NEXT:    ]
+; CHECK:       bb2:
+; CHECK-NEXT:    unreachable
+; CHECK:       bb4:
+; CHECK-NEXT:    br label [[BB5]]
+; CHECK:       bb1:
+; CHECK-NEXT:    br label [[BB5]]
+; CHECK:       bb5:
+; CHECK-NEXT:    [[DOT0:%.*]] = phi i8 [ 0, [[BB1]] ], [ -2, [[BB4]] ], [ -1, [[START:%.*]] ]
+; CHECK-NEXT:    ret i8 [[DOT0]]
+;
+start:
+  switch i32 %0, label %bb2 [
+  i32 0, label %bb5
+  i32 1, label %bb4
+  i32 255, label %bb1
+  ]
+
+bb2:                                              ; preds = %start
+  unreachable
+
+bb4:                                              ; preds = %start
+  br label %bb5
+
+bb1:                                              ; preds = %start
+  br label %bb5
+
+bb5:                                              ; preds = %start, %bb1, %bb4
+  %.0 = phi i8 [ 0, %bb1 ], [ -2, %bb4 ], [ -1, %start ]
+  ret i8 %.0
+}
+
+define i8 @test_neg_value_not_possible_to_trunc(i32 %0) {
+; CHECK-LABEL: @test_neg_value_not_possible_to_trunc(
+; CHECK-NEXT:  start:
+; CHECK-NEXT:    switch i32 [[TMP0:%.*]], label [[BB2:%.*]] [
+; CHECK-NEXT:      i32 0, label [[BB5:%.*]]
+; CHECK-NEXT:      i32 1, label [[BB4:%.*]]
+; CHECK-NEXT:      i32 511, label [[BB1:%.*]]
+; CHECK-NEXT:    ]
+; CHECK:       bb2:
+; CHECK-NEXT:    unreachable
+; CHECK:       bb4:
+; CHECK-NEXT:    br label [[BB5]]
+; CHECK:       bb1:
+; CHECK-NEXT:    br label [[BB5]]
+; CHECK:       bb5:
+; CHECK-NEXT:    [[DOT0:%.*]] = phi i8 [ -1, [[BB1]] ], [ 1, [[BB4]] ], [ 0, [[START:%.*]] ]
+; CHECK-NEXT:    ret i8 [[DOT0]]
+;
+start:
+  switch i32 %0, label %bb2 [
+  i32 0, label %bb5
+  i32 1, label %bb4
+  i32 511, label %bb1
+  ]
+
+bb2:                                              ; preds = %start
+  unreachable
+
+bb4:                                              ; preds = %start
+  br label %bb5
+
+bb1:                                              ; preds = %start
+  br label %bb5
+
+bb5:                                              ; preds = %start, %bb1, %bb4
+  %.0 = phi i8 [ 255, %bb1 ], [ 1, %bb4 ], [ 0, %start ]
+  ret i8 %.0
+}


        


More information about the llvm-commits mailing list