[llvm] b8a2cf6 - [SCCP] Extend test coverage in conditions-ranges.ll to false branches.

Florian Hahn via llvm-commits llvm-commits at lists.llvm.org
Mon Mar 23 05:32:59 PDT 2020


Author: Florian Hahn
Date: 2020-03-23T12:32:14Z
New Revision: b8a2cf6b5b9e2dfac4c1b6c5683664ca2c4cf700

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

LOG: [SCCP] Extend test coverage in conditions-ranges.ll to false branches.

Added: 
    

Modified: 
    llvm/test/Transforms/SCCP/conditions-ranges.ll

Removed: 
    


################################################################################
diff  --git a/llvm/test/Transforms/SCCP/conditions-ranges.ll b/llvm/test/Transforms/SCCP/conditions-ranges.ll
index f8a93f93ec69..4b060d577ca8 100644
--- a/llvm/test/Transforms/SCCP/conditions-ranges.ll
+++ b/llvm/test/Transforms/SCCP/conditions-ranges.ll
@@ -8,60 +8,137 @@ define void @f1(i32 %a, i32 %b) {
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    [[A_255:%.*]] = and i32 [[A:%.*]], 255
 ; CHECK-NEXT:    [[A_2:%.*]] = add i32 [[A_255]], 20
-; CHECK-NEXT:    [[C_1:%.*]] = icmp ugt i32 [[B:%.*]], [[A_2]]
-; CHECK-NEXT:    br i1 [[C_1]], label [[TRUE:%.*]], label [[FALSE:%.*]]
+; CHECK-NEXT:    [[BC:%.*]] = icmp ugt i32 [[B:%.*]], [[A_2]]
+; CHECK-NEXT:    br i1 [[BC]], label [[TRUE:%.*]], label [[FALSE:%.*]]
 ; CHECK:       true:
-; CHECK-NEXT:    [[C_2:%.*]] = icmp eq i32 [[B]], 0
+; CHECK-NEXT:    [[F_1:%.*]] = icmp eq i32 [[B]], 0
+; CHECK-NEXT:    call void @use(i1 [[F_1]])
+; CHECK-NEXT:    [[F_2:%.*]] = icmp eq i32 [[B]], 20
+; CHECK-NEXT:    call void @use(i1 [[F_2]])
+; CHECK-NEXT:    [[F_3:%.*]] = icmp ult i32 [[B]], 20
+; CHECK-NEXT:    call void @use(i1 [[F_3]])
+; CHECK-NEXT:    [[T_1:%.*]] = icmp ugt i32 [[B]], 5
+; CHECK-NEXT:    call void @use(i1 [[T_1]])
+; CHECK-NEXT:    [[T_2:%.*]] = icmp ne i32 [[B]], 20
+; CHECK-NEXT:    call void @use(i1 [[T_2]])
+; CHECK-NEXT:    [[C_1:%.*]] = icmp eq i32 [[B]], 21
+; CHECK-NEXT:    call void @use(i1 [[C_1]])
+; CHECK-NEXT:    [[C_2:%.*]] = icmp ugt i32 [[B]], 21
 ; CHECK-NEXT:    call void @use(i1 [[C_2]])
-; CHECK-NEXT:    [[C_3:%.*]] = icmp eq i32 [[B]], 20
+; CHECK-NEXT:    [[C_3:%.*]] = icmp ugt i32 [[B]], 255
 ; CHECK-NEXT:    call void @use(i1 [[C_3]])
-; CHECK-NEXT:    [[C_4:%.*]] = icmp eq i32 [[B]], 21
-; CHECK-NEXT:    call void @use(i1 [[C_4]])
 ; CHECK-NEXT:    ret void
 ; CHECK:       false:
+; CHECK-NEXT:    [[F_4:%.*]] = icmp eq i32 [[B]], 276
+; CHECK-NEXT:    call void @use(i1 [[F_4]])
+; CHECK-NEXT:    [[F_5:%.*]] = icmp ugt i32 [[B]], 275
+; CHECK-NEXT:    call void @use(i1 [[F_5]])
+; CHECK-NEXT:    [[T_3:%.*]] = icmp ne i32 [[B]], 276
+; CHECK-NEXT:    call void @use(i1 [[T_3]])
+; CHECK-NEXT:    [[T_4:%.*]] = icmp ule i32 [[B]], 275
+; CHECK-NEXT:    call void @use(i1 [[T_4]])
+; CHECK-NEXT:    [[C_4:%.*]] = icmp eq i32 [[B]], 21
+; CHECK-NEXT:    call void @use(i1 [[C_4]])
+; CHECK-NEXT:    [[C_5:%.*]] = icmp eq i32 [[B]], 275
+; CHECK-NEXT:    call void @use(i1 [[C_5]])
 ; CHECK-NEXT:    ret void
 ;
 entry:
   %a.255 = and i32 %a, 255
   %a.2 = add i32 %a.255, 20
-  %c.1 = icmp ugt i32 %b, %a.2
-  br i1 %c.1, label %true, label %false
-
-true:
-  %c.2 = icmp eq i32 %b, 0
+  %bc = icmp ugt i32 %b, %a.2
+  br i1 %bc, label %true, label %false
+
+true: ; %b in [21, 0)
+  ; Conditions below are false.
+  %f.1 = icmp eq i32 %b, 0
+  call void @use(i1 %f.1)
+  %f.2 = icmp eq i32 %b, 20
+  call void @use(i1 %f.2)
+  %f.3 = icmp ult i32 %b, 20
+  call void @use(i1 %f.3)
+
+  ; Conditions below are true.
+  %t.1 = icmp ugt i32 %b, 5
+  call void @use(i1 %t.1)
+  %t.2 = icmp ne i32 %b, 20
+  call void @use(i1 %t.2)
+
+  ; Conditions below cannot be simplified.
+  %c.1 = icmp eq i32 %b, 21
+  call void @use(i1 %c.1)
+  %c.2 = icmp ugt i32 %b, 21
   call void @use(i1 %c.2)
-  %c.3 = icmp eq i32 %b, 20
+  %c.3 = icmp ugt i32 %b, 255
   call void @use(i1 %c.3)
-  %c.4 = icmp eq i32 %b, 21
-  call void @use(i1 %c.4)
   ret void
 
-false:
+false: ;%b in [0, 276)
+  ; Conditions below are false;
+  %f.4 = icmp eq i32 %b, 276
+  call void @use(i1 %f.4)
+  %f.5 = icmp ugt i32 %b, 275
+  call void @use(i1 %f.5)
+
+  ; Conditions below are true;
+  %t.3 = icmp ne i32 %b, 276
+  call void @use(i1 %t.3)
+  %t.4 = icmp ule i32 %b, 275
+  call void @use(i1 %t.4)
+
+  ; Conditions below cannot be simplified.
+  %c.4 = icmp eq i32 %b, 21
+  call void @use(i1 %c.4)
+  %c.5 = icmp eq i32 %b, 275
+  call void @use(i1 %c.5)
   ret void
 }
 
-
-define void @f2(i8* %a) {
-; CHECK-LABEL: @f2(
+; TODO: Use information %a != 0 in false branch.
+define void @f2_ptr(i8* %a, i8* %b) {
+; CHECK-LABEL: @f2_ptr(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[C_1:%.*]] = icmp eq i8* [[A:%.*]], null
-; CHECK-NEXT:    br i1 [[C_1]], label [[TRUE:%.*]], label [[FALSE:%.*]]
+; CHECK-NEXT:    [[BC:%.*]] = icmp eq i8* [[A:%.*]], null
+; CHECK-NEXT:    br i1 [[BC]], label [[TRUE:%.*]], label [[FALSE:%.*]]
 ; CHECK:       true:
+; CHECK-NEXT:    call void @use(i1 false)
 ; CHECK-NEXT:    call void @use(i1 true)
+; CHECK-NEXT:    [[C_1:%.*]] = icmp eq i8* null, [[B:%.*]]
+; CHECK-NEXT:    call void @use(i1 [[C_1]])
 ; CHECK-NEXT:    ret void
 ; CHECK:       false:
+; CHECK-NEXT:    [[F_2:%.*]] = icmp eq i8* [[A]], null
+; CHECK-NEXT:    call void @use(i1 [[F_2]])
+; CHECK-NEXT:    [[T_2:%.*]] = icmp ne i8* [[A]], null
+; CHECK-NEXT:    call void @use(i1 [[T_2]])
+; CHECK-NEXT:    [[C_2:%.*]] = icmp eq i8* [[A]], [[B]]
+; CHECK-NEXT:    call void @use(i1 [[C_2]])
 ; CHECK-NEXT:    ret void
 ;
 entry:
-  %c.1 = icmp eq i8* %a, null
-  br i1 %c.1, label %true, label %false
+  %bc = icmp eq i8* %a, null
+  br i1 %bc, label %true, label %false
 
-true:
-  %c.2 = icmp eq i8*%a, null
-  call void @use(i1 %c.2)
+true: ; %a == 0
+  %f.1 = icmp ne i8* %a, null
+  call void @use(i1 %f.1)
+
+  %t.1 = icmp eq i8* %a, null
+  call void @use(i1 %t.1)
+
+  %c.1 = icmp eq i8* %a, %b
+  call void @use(i1 %c.1)
   ret void
 
-false:
+false: ; %a != 0
+  %f.2 = icmp eq i8* %a, null
+  call void @use(i1 %f.2)
+
+  %t.2 = icmp ne i8* %a, null
+  call void @use(i1 %t.2)
+
+  %c.2 = icmp eq i8* %a, %b
+  call void @use(i1 %c.2)
   ret void
 }
 
@@ -103,7 +180,6 @@ false:
   ret i8* null
 }
 
-
 define i32 @f5(i64 %sz) {
 ; CHECK-LABEL: @f5(
 ; CHECK-NEXT:  entry:
@@ -156,7 +232,6 @@ false:
   ret void
 }
 
-
 define void @loop.1() {
 entry:
   br label %for.cond
@@ -232,8 +307,8 @@ for.body14:
   br label %for.cond11
 }
 
-define i32 @foo(i64 %sz) {
-; CHECK-LABEL: @foo(
+define i32 @udiv_1(i64 %sz) {
+; CHECK-LABEL: @udiv_1(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i64 4088, [[SZ:%.*]]
 ; CHECK-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_END:%.*]]
@@ -259,8 +334,9 @@ cond.end:                                         ; preds = %entry, %cond.true
   ret i32 %conv
 }
 
-define i32 @bar(i64 %sz) {
-; CHECK-LABEL: @bar(
+; Same as @udiv_1, but with the condition switched.
+define i32 @udiv_2(i64 %sz) {
+; CHECK-LABEL: @udiv_2(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i64 [[SZ:%.*]], 4088
 ; CHECK-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_END:%.*]]
@@ -285,3 +361,285 @@ cond.end:                                         ; preds = %entry, %cond.true
   %conv = trunc i64 %cond to i32
   ret i32 %conv
 }
+
+; Test with 2 unrelated nested conditions.
+define void @f7_nested_conds(i32* %a, i32 %b) {
+; CHECK-LABEL: @f7_nested_conds(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[A_V:%.*]] = load i32, i32* [[A:%.*]]
+; CHECK-NEXT:    [[C_1:%.*]] = icmp ne i32 [[A_V]], 0
+; CHECK-NEXT:    br i1 [[C_1]], label [[TRUE:%.*]], label [[FALSE:%.*]]
+; CHECK:       false:
+; CHECK-NEXT:    br i1 true, label [[TRUE_2:%.*]], label [[TRUE]]
+; CHECK:       true.2:
+; CHECK-NEXT:    call void @use(i1 true)
+; CHECK-NEXT:    ret void
+; CHECK:       true:
+; CHECK-NEXT:    store i32 [[B:%.*]], i32* [[A]]
+; CHECK-NEXT:    ret void
+;
+entry:
+  %a.v = load i32, i32* %a
+  %c.1 = icmp ne i32 %a.v, 0
+  br i1 %c.1, label %true, label %false
+
+false:
+  %c.2 = icmp ult i32 %a.v, 3
+  br i1 %c.2, label %true.2, label %true
+
+true.2:
+  %c.3 = icmp eq i32 %a.v, 0
+  call void @use(i1 %c.3)
+  ret void
+
+true:
+  store i32 %b, i32* %a
+  ret void
+}
+
+; Test with 2 related nested conditions (%b > [20, 276) && %b < 255).
+define void @f8_nested_conds(i32 %a, i32 %b) {
+; CHECK-LABEL: @f8_nested_conds(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[A_255:%.*]] = and i32 [[A:%.*]], 255
+; CHECK-NEXT:    [[A_2:%.*]] = add i32 [[A_255]], 20
+; CHECK-NEXT:    [[BC_1:%.*]] = icmp ugt i32 [[B:%.*]], [[A_2]]
+; CHECK-NEXT:    br i1 [[BC_1]], label [[TRUE:%.*]], label [[FALSE:%.*]]
+; CHECK:       true:
+; CHECK-NEXT:    [[BC_2:%.*]] = icmp ult i32 [[B]], 255
+; CHECK-NEXT:    br i1 [[BC_2]], label [[TRUE_2:%.*]], label [[FALSE_2:%.*]]
+; CHECK:       true.2:
+; CHECK-NEXT:    [[F_1:%.*]] = icmp eq i32 [[B]], 0
+; CHECK-NEXT:    call void @use(i1 [[F_1]])
+; CHECK-NEXT:    [[F_2:%.*]] = icmp eq i32 [[B]], 20
+; CHECK-NEXT:    call void @use(i1 [[F_2]])
+; CHECK-NEXT:    [[F_3:%.*]] = icmp ult i32 [[B]], 20
+; CHECK-NEXT:    call void @use(i1 [[F_3]])
+; CHECK-NEXT:    [[F_4:%.*]] = icmp eq i32 [[B]], 255
+; CHECK-NEXT:    call void @use(i1 [[F_4]])
+; CHECK-NEXT:    [[F_5:%.*]] = icmp ugt i32 [[B]], 255
+; CHECK-NEXT:    call void @use(i1 [[F_5]])
+; CHECK-NEXT:    [[T_1:%.*]] = icmp ugt i32 [[B]], 5
+; CHECK-NEXT:    call void @use(i1 [[T_1]])
+; CHECK-NEXT:    [[T_2:%.*]] = icmp ne i32 [[B]], 20
+; CHECK-NEXT:    call void @use(i1 [[T_2]])
+; CHECK-NEXT:    [[T_3:%.*]] = icmp ult i32 [[B]], 255
+; CHECK-NEXT:    call void @use(i1 [[T_3]])
+; CHECK-NEXT:    [[T_4:%.*]] = icmp ne i32 [[B]], 300
+; CHECK-NEXT:    call void @use(i1 [[T_4]])
+; CHECK-NEXT:    [[C_1:%.*]] = icmp eq i32 [[B]], 21
+; CHECK-NEXT:    call void @use(i1 [[C_1]])
+; CHECK-NEXT:    [[C_2:%.*]] = icmp ugt i32 [[B]], 21
+; CHECK-NEXT:    call void @use(i1 [[C_2]])
+; CHECK-NEXT:    [[C_3:%.*]] = icmp ugt i32 [[B]], 34
+; CHECK-NEXT:    call void @use(i1 [[C_3]])
+; CHECK-NEXT:    ret void
+; CHECK:       false.2:
+; CHECK-NEXT:    [[F_6:%.*]] = icmp eq i32 [[B]], 254
+; CHECK-NEXT:    call void @use(i1 [[F_6]])
+; CHECK-NEXT:    [[F_7:%.*]] = icmp ugt i32 [[B]], 256
+; CHECK-NEXT:    call void @use(i1 [[F_7]])
+; CHECK-NEXT:    [[T_5:%.*]] = icmp ne i32 [[B]], 254
+; CHECK-NEXT:    call void @use(i1 [[T_5]])
+; CHECK-NEXT:    [[T_6:%.*]] = icmp uge i32 [[B]], 255
+; CHECK-NEXT:    call void @use(i1 [[T_6]])
+; CHECK-NEXT:    [[C_4:%.*]] = icmp eq i32 [[B]], 255
+; CHECK-NEXT:    call void @use(i1 [[C_4]])
+; CHECK-NEXT:    [[C_5:%.*]] = icmp ne i32 [[B]], 275
+; CHECK-NEXT:    call void @use(i1 [[C_5]])
+; CHECK-NEXT:    ret void
+; CHECK:       false:
+; CHECK-NEXT:    ret void
+;
+entry:
+  %a.255 = and i32 %a, 255
+  %a.2 = add i32 %a.255, 20
+  %bc.1 = icmp ugt i32 %b, %a.2
+  br i1 %bc.1, label %true, label %false
+
+true: ; %b in [21, 0)
+  %bc.2 = icmp ult i32 %b, 255
+  br i1 %bc.2, label %true.2, label %false.2
+
+true.2: ; %b in [21, 255)
+  ; Conditions below are false.
+  %f.1 = icmp eq i32 %b, 0
+  call void @use(i1 %f.1)
+  %f.2 = icmp eq i32 %b, 20
+  call void @use(i1 %f.2)
+  %f.3 = icmp ult i32 %b, 20
+  call void @use(i1 %f.3)
+  %f.4 = icmp eq i32 %b, 255
+  call void @use(i1 %f.4)
+  %f.5 = icmp ugt i32 %b, 255
+  call void @use(i1 %f.5)
+
+
+  ; Conditions below are true.
+  %t.1 = icmp ugt i32 %b, 5
+  call void @use(i1 %t.1)
+  %t.2 = icmp ne i32 %b, 20
+  call void @use(i1 %t.2)
+  %t.3 = icmp ult i32 %b, 255
+  call void @use(i1 %t.3)
+  %t.4 = icmp ne i32 %b,  300
+  call void @use(i1 %t.4)
+
+  ; Conditions below cannot be simplified.
+  %c.1 = icmp eq i32 %b, 21
+  call void @use(i1 %c.1)
+  %c.2 = icmp ugt i32 %b, 21
+  call void @use(i1 %c.2)
+  %c.3 = icmp ugt i32 %b, 34
+  call void @use(i1 %c.3)
+  ret void
+
+false.2: ;%b in [255, 0)
+  ; Conditions below are false;
+  %f.6 = icmp eq i32 %b, 254
+  call void @use(i1 %f.6)
+  %f.7 = icmp ugt i32 %b, 256
+  call void @use(i1 %f.7)
+
+  ; Conditions below are true;
+  %t.5 = icmp ne i32 %b, 254
+  call void @use(i1 %t.5)
+  %t.6 = icmp uge i32 %b, 255
+  call void @use(i1 %t.6)
+
+  ; Conditions below cannot be simplified.
+  %c.4 = icmp eq i32 %b, 255
+  call void @use(i1 %c.4)
+  %c.5 = icmp ne i32 %b, 275
+  call void @use(i1 %c.5)
+  ret void
+
+false:
+  ret void
+}
+
+; Test with with nested conditions where the second conditions is more limiting than the first one.
+define void @f9_nested_conds(i32 %a, i32 %b) {
+; CHECK-LABEL: @f9_nested_conds(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[BC_1:%.*]] = icmp ugt i32 [[B:%.*]], 10
+; CHECK-NEXT:    br i1 [[BC_1]], label [[TRUE:%.*]], label [[FALSE:%.*]]
+; CHECK:       true:
+; CHECK-NEXT:    [[F_1:%.*]] = icmp eq i32 [[B]], 0
+; CHECK-NEXT:    call void @use(i1 [[F_1]])
+; CHECK-NEXT:    [[F_2:%.*]] = icmp eq i32 [[B]], 10
+; CHECK-NEXT:    call void @use(i1 [[F_2]])
+; CHECK-NEXT:    [[T_1:%.*]] = icmp ugt i32 [[B]], 5
+; CHECK-NEXT:    call void @use(i1 [[T_1]])
+; CHECK-NEXT:    [[T_2:%.*]] = icmp ne i32 [[B]], 10
+; CHECK-NEXT:    call void @use(i1 [[T_2]])
+; CHECK-NEXT:    [[C_1:%.*]] = icmp eq i32 [[B]], 11
+; CHECK-NEXT:    call void @use(i1 [[C_1]])
+; CHECK-NEXT:    [[C_2:%.*]] = icmp ugt i32 [[B]], 11
+; CHECK-NEXT:    call void @use(i1 [[C_2]])
+; CHECK-NEXT:    [[BC_2:%.*]] = icmp ugt i32 [[B]], 20
+; CHECK-NEXT:    br i1 [[BC_2]], label [[TRUE_2:%.*]], label [[FALSE_2:%.*]]
+; CHECK:       true.2:
+; CHECK-NEXT:    [[F_3:%.*]] = icmp eq i32 [[B]], 11
+; CHECK-NEXT:    call void @use(i1 [[F_3]])
+; CHECK-NEXT:    [[F_4:%.*]] = icmp eq i32 [[B]], 20
+; CHECK-NEXT:    call void @use(i1 [[F_4]])
+; CHECK-NEXT:    [[T_3:%.*]] = icmp ugt i32 [[B]], 11
+; CHECK-NEXT:    call void @use(i1 [[T_3]])
+; CHECK-NEXT:    [[T_4:%.*]] = icmp ne i32 [[B]], 20
+; CHECK-NEXT:    call void @use(i1 [[T_4]])
+; CHECK-NEXT:    [[C_3:%.*]] = icmp eq i32 [[B]], 21
+; CHECK-NEXT:    call void @use(i1 [[C_3]])
+; CHECK-NEXT:    [[C_4:%.*]] = icmp ugt i32 [[B]], 21
+; CHECK-NEXT:    call void @use(i1 [[C_4]])
+; CHECK-NEXT:    [[C_5:%.*]] = icmp ugt i32 [[B]], 34
+; CHECK-NEXT:    call void @use(i1 [[C_5]])
+; CHECK-NEXT:    ret void
+; CHECK:       false.2:
+; CHECK-NEXT:    [[F_5:%.*]] = icmp eq i32 [[B]], 21
+; CHECK-NEXT:    call void @use(i1 [[F_5]])
+; CHECK-NEXT:    [[F_6:%.*]] = icmp ugt i32 [[B]], 21
+; CHECK-NEXT:    call void @use(i1 [[F_6]])
+; CHECK-NEXT:    [[T_5:%.*]] = icmp ne i32 [[B]], 21
+; CHECK-NEXT:    call void @use(i1 [[T_5]])
+; CHECK-NEXT:    [[T_6:%.*]] = icmp ult i32 [[B]], 21
+; CHECK-NEXT:    call void @use(i1 [[T_6]])
+; CHECK-NEXT:    [[C_6:%.*]] = icmp eq i32 [[B]], 11
+; CHECK-NEXT:    call void @use(i1 [[C_6]])
+; CHECK-NEXT:    [[C_7:%.*]] = icmp ne i32 [[B]], 5
+; CHECK-NEXT:    call void @use(i1 [[C_7]])
+; CHECK-NEXT:    ret void
+; CHECK:       false:
+; CHECK-NEXT:    ret void
+;
+entry:
+  %bc.1 = icmp ugt i32 %b, 10
+  br i1 %bc.1, label %true, label %false
+
+true: ; %b in [11, 0)
+  ; Conditions below are false.
+  %f.1 = icmp eq i32 %b, 0
+  call void @use(i1 %f.1)
+  %f.2 = icmp eq i32 %b, 10
+  call void @use(i1 %f.2)
+
+  ; Conditions below are true.
+  %t.1 = icmp ugt i32 %b, 5
+  call void @use(i1 %t.1)
+  %t.2 = icmp ne i32 %b, 10
+  call void @use(i1 %t.2)
+
+  ; Conditions below cannot be simplified.
+  %c.1 = icmp eq i32 %b, 11
+  call void @use(i1 %c.1)
+  %c.2 = icmp ugt i32 %b, 11
+  call void @use(i1 %c.2)
+
+  %bc.2 = icmp ugt i32 %b, 20
+  br i1 %bc.2, label %true.2, label %false.2
+
+true.2: ; %b in [21, 0)
+  ; Conditions below are false.
+  %f.3 = icmp eq i32 %b, 11
+  call void @use(i1 %f.3)
+  %f.4 = icmp eq i32 %b, 20
+  call void @use(i1 %f.4)
+
+  ; Conditions below are true.
+  %t.3 = icmp ugt i32 %b, 11
+  call void @use(i1 %t.3)
+  %t.4 = icmp ne i32 %b, 20
+  call void @use(i1 %t.4)
+
+  ; Conditions below cannot be simplified.
+  %c.3 = icmp eq i32 %b, 21
+  call void @use(i1 %c.3)
+  %c.4 = icmp ugt i32 %b, 21
+  call void @use(i1 %c.4)
+  %c.5 = icmp ugt i32 %b, 34
+  call void @use(i1 %c.5)
+  ret void
+
+false.2: ;%b in [0, 21)
+  ; Conditions below are false;
+  %f.5 = icmp eq i32 %b, 21
+  call void @use(i1 %f.5)
+  %f.6 = icmp ugt i32 %b, 21
+  call void @use(i1 %f.6)
+
+  ; Conditions below are true;
+  %t.5 = icmp ne i32 %b, 21
+  call void @use(i1 %t.5)
+  %t.6 = icmp ult i32 %b, 21
+  call void @use(i1 %t.6)
+
+  ; Conditions below cannot be simplified.
+  %c.6 = icmp eq i32 %b, 11
+  call void @use(i1 %c.6)
+  %c.7 = icmp ne i32 %b, 5
+  call void @use(i1 %c.7)
+  ret void
+
+false:
+  ret void
+}


        


More information about the llvm-commits mailing list