1 ; RUN: opt -correlated-propagation -S < %s | FileCheck %s 2 3 declare i32 @foo() 4 5 define i32 @test1(i32 %a) nounwind { 6 %a.off = add i32 %a, -8 7 %cmp = icmp ult i32 %a.off, 8 8 br i1 %cmp, label %then, label %else 9 10 then: 11 %dead = icmp eq i32 %a, 7 12 br i1 %dead, label %end, label %else 13 14 else: 15 ret i32 1 16 17 end: 18 ret i32 2 19 20 ; CHECK-LABEL: @test1( 21 ; CHECK: then: 22 ; CHECK-NEXT: br i1 false, label %end, label %else 23 } 24 25 define i32 @test2(i32 %a) nounwind { 26 %a.off = add i32 %a, -8 27 %cmp = icmp ult i32 %a.off, 8 28 br i1 %cmp, label %then, label %else 29 30 then: 31 %dead = icmp ugt i32 %a, 15 32 br i1 %dead, label %end, label %else 33 34 else: 35 ret i32 1 36 37 end: 38 ret i32 2 39 40 ; CHECK-LABEL: @test2( 41 ; CHECK: then: 42 ; CHECK-NEXT: br i1 false, label %end, label %else 43 } 44 45 ; CHECK-LABEL: @test3( 46 define i32 @test3(i32 %c) nounwind { 47 %cmp = icmp slt i32 %c, 2 48 br i1 %cmp, label %if.then, label %if.end 49 50 if.then: 51 ret i32 1 52 53 if.end: 54 %cmp1 = icmp slt i32 %c, 3 55 br i1 %cmp1, label %if.then2, label %if.end8 56 57 ; CHECK: if.then2 58 if.then2: 59 %cmp2 = icmp eq i32 %c, 2 60 ; CHECK: br i1 true 61 br i1 %cmp2, label %if.then4, label %if.end6 62 63 ; CHECK: if.end6 64 if.end6: 65 ret i32 2 66 67 if.then4: 68 ret i32 3 69 70 if.end8: 71 ret i32 4 72 } 73 74 ; CHECK-LABEL: @test4( 75 define i32 @test4(i32 %c) nounwind { 76 switch i32 %c, label %sw.default [ 77 i32 1, label %sw.bb 78 i32 2, label %sw.bb 79 i32 4, label %sw.bb 80 ] 81 82 ; CHECK: sw.bb 83 sw.bb: 84 %cmp = icmp sge i32 %c, 1 85 ; CHECK: br i1 true 86 br i1 %cmp, label %if.then, label %if.end 87 88 if.then: 89 br label %return 90 91 if.end: 92 br label %return 93 94 sw.default: 95 br label %return 96 97 return: 98 %retval.0 = phi i32 [ 42, %sw.default ], [ 4, %if.then ], [ 9, %if.end ] 99 ret i32 %retval.0 100 } 101 102 ; CHECK-LABEL: @test5( 103 define i1 @test5(i32 %c) nounwind { 104 %cmp = icmp slt i32 %c, 5 105 br i1 %cmp, label %if.then, label %if.end 106 107 if.then: 108 %cmp1 = icmp eq i32 %c, 4 109 br i1 %cmp1, label %if.end, label %if.end8 110 111 if.end: 112 ret i1 true 113 114 if.end8: 115 %cmp2 = icmp eq i32 %c, 3 116 %cmp3 = icmp eq i32 %c, 4 117 %cmp4 = icmp eq i32 %c, 6 118 ; CHECK: %or = or i1 false, false 119 %or = or i1 %cmp3, %cmp4 120 ; CHECK: ret i1 %cmp2 121 ret i1 %cmp2 122 } 123 124 ; CHECK-LABEL: @test6( 125 define i1 @test6(i32 %c) nounwind { 126 %cmp = icmp ule i32 %c, 7 127 br i1 %cmp, label %if.then, label %if.end 128 129 if.then: 130 ; CHECK: icmp eq i32 %c, 6 131 ; CHECK: br i1 132 switch i32 %c, label %if.end [ 133 i32 6, label %sw.bb 134 i32 8, label %sw.bb 135 ] 136 137 if.end: 138 ret i1 true 139 140 sw.bb: 141 %cmp2 = icmp eq i32 %c, 6 142 ; CHECK: ret i1 true 143 ret i1 %cmp2 144 } 145 146 ; CHECK-LABEL: @test7( 147 define i1 @test7(i32 %c) nounwind { 148 entry: 149 switch i32 %c, label %sw.default [ 150 i32 6, label %sw.bb 151 i32 7, label %sw.bb 152 ] 153 154 sw.bb: 155 ret i1 true 156 157 sw.default: 158 %cmp5 = icmp eq i32 %c, 5 159 %cmp6 = icmp eq i32 %c, 6 160 %cmp7 = icmp eq i32 %c, 7 161 %cmp8 = icmp eq i32 %c, 8 162 ; CHECK: %or = or i1 %cmp5, false 163 %or = or i1 %cmp5, %cmp6 164 ; CHECK: %or2 = or i1 false, %cmp8 165 %or2 = or i1 %cmp7, %cmp8 166 ret i1 false 167 } 168 169 define i1 @test8(i64* %p) { 170 ; CHECK-LABEL: @test8 171 ; CHECK: ret i1 false 172 %a = load i64, i64* %p, !range !{i64 4, i64 255} 173 %res = icmp eq i64 %a, 0 174 ret i1 %res 175 } 176 177 define i1 @test9(i64* %p) { 178 ; CHECK-LABEL: @test9 179 ; CHECK: ret i1 true 180 %a = load i64, i64* %p, !range !{i64 0, i64 1} 181 %res = icmp eq i64 %a, 0 182 ret i1 %res 183 } 184 185 define i1 @test10(i64* %p) { 186 ; CHECK-LABEL: @test10 187 ; CHECK: ret i1 false 188 %a = load i64, i64* %p, !range !{i64 4, i64 8, i64 15, i64 20} 189 %res = icmp eq i64 %a, 0 190 ret i1 %res 191 } 192 193 @g = external global i32 194 195 define i1 @test11() { 196 ; CHECK: @test11 197 ; CHECK: ret i1 true 198 %positive = load i32, i32* @g, !range !{i32 1, i32 2048} 199 %add = add i32 %positive, 1 200 %test = icmp sgt i32 %add, 0 201 br label %next 202 203 next: 204 ret i1 %test 205 } 206