1 ; RUN: opt %s -S -simplifycfg | FileCheck %s 2 3 declare void @is(i1) 4 5 ; If A == B is false then A == B is implied false. 6 ; CHECK-LABEL: @test_eq_eq 7 ; CHECK-NOT: call void @is(i1 true) 8 ; CHECK: call void @is(i1 false) 9 define void @test_eq_eq(i32 %a, i32 %b) { 10 %cmp1 = icmp eq i32 %a, %b 11 br i1 %cmp1, label %untaken, label %taken 12 13 taken: 14 %cmp2 = icmp eq i32 %a, %b 15 br i1 %cmp2, label %istrue, label %isfalse 16 17 istrue: 18 call void @is(i1 true) 19 ret void 20 21 isfalse: 22 call void @is(i1 false) 23 ret void 24 25 untaken: 26 ret void 27 } 28 29 ; If A == B is false then A != B is implied true. 30 ; CHECK-LABEL: @test_eq_ne 31 ; CHECK: call void @is(i1 true) 32 ; CHECK-NOT: call void @is(i1 false) 33 define void @test_eq_ne(i32 %a, i32 %b) { 34 %cmp1 = icmp eq i32 %a, %b 35 br i1 %cmp1, label %untaken, label %taken 36 37 taken: 38 %cmp2 = icmp ne i32 %a, %b 39 br i1 %cmp2, label %istrue, label %isfalse 40 41 istrue: 42 call void @is(i1 true) 43 ret void 44 45 isfalse: 46 call void @is(i1 false) 47 ret void 48 49 untaken: 50 ret void 51 } 52 53 ; If A != B is false then A != B is implied false. 54 ; CHECK-LABEL: @test_ne_ne 55 ; CHECK-NOT: call void @is(i1 true) 56 ; CHECK: call void @is(i1 false) 57 define void @test_ne_ne(i32 %a, i32 %b) { 58 %cmp1 = icmp ne i32 %a, %b 59 br i1 %cmp1, label %untaken, label %taken 60 61 taken: 62 %cmp2 = icmp ne i32 %a, %b 63 br i1 %cmp2, label %istrue, label %isfalse 64 65 istrue: 66 call void @is(i1 true) 67 ret void 68 69 isfalse: 70 call void @is(i1 false) 71 ret void 72 73 untaken: 74 ret void 75 } 76 77 ; If A != B is false then A >u B is implied false. 78 ; CHECK-LABEL: @test_ne_ugt 79 ; CHECK-NOT: call void @is(i1 true) 80 ; CHECK: call void @is(i1 false) 81 define void @test_ne_ugt(i32 %a, i32 %b) { 82 %cmp1 = icmp ne i32 %a, %b 83 br i1 %cmp1, label %untaken, label %taken 84 85 taken: 86 %cmp2 = icmp ugt i32 %a, %b 87 br i1 %cmp2, label %istrue, label %isfalse 88 89 istrue: 90 call void @is(i1 true) 91 ret void 92 93 isfalse: 94 call void @is(i1 false) 95 ret void 96 97 untaken: 98 ret void 99 } 100 101 ; If A != B is false then A >=u B is implied true. 102 ; CHECK-LABEL: @test_ne_uge 103 ; CHECK: call void @is(i1 true) 104 ; CHECK-NOT: call void @is(i1 false) 105 define void @test_ne_uge(i32 %a, i32 %b) { 106 %cmp1 = icmp ne i32 %a, %b 107 br i1 %cmp1, label %untaken, label %taken 108 109 taken: 110 %cmp2 = icmp uge i32 %a, %b 111 br i1 %cmp2, label %istrue, label %isfalse 112 113 istrue: 114 call void @is(i1 true) 115 ret void 116 117 isfalse: 118 call void @is(i1 false) 119 ret void 120 121 untaken: 122 ret void 123 } 124 125 ; If A != B is false then A <u B is implied false. 126 ; CHECK-LABEL: @test_ne_ult 127 ; CHECK-NOT: call void @is(i1 true) 128 ; CHECK: call void @is(i1 false) 129 define void @test_ne_ult(i32 %a, i32 %b) { 130 %cmp1 = icmp ne i32 %a, %b 131 br i1 %cmp1, label %untaken, label %taken 132 133 taken: 134 %cmp2 = icmp ult i32 %a, %b 135 br i1 %cmp2, label %istrue, label %isfalse 136 137 istrue: 138 call void @is(i1 true) 139 ret void 140 141 isfalse: 142 call void @is(i1 false) 143 ret void 144 145 untaken: 146 ret void 147 } 148 149 ; If A != B is false then A <=u B is implied true. 150 ; CHECK-LABEL: @test_ne_ule 151 ; CHECK: call void @is(i1 true) 152 ; CHECK-NOT: call void @is(i1 false) 153 define void @test_ne_ule(i32 %a, i32 %b) { 154 %cmp1 = icmp ne i32 %a, %b 155 br i1 %cmp1, label %untaken, label %taken 156 157 taken: 158 %cmp2 = icmp ule i32 %a, %b 159 br i1 %cmp2, label %istrue, label %isfalse 160 161 istrue: 162 call void @is(i1 true) 163 ret void 164 165 isfalse: 166 call void @is(i1 false) 167 ret void 168 169 untaken: 170 ret void 171 } 172 173 ; If A >u B is false then A >u B is implied false. 174 ; CHECK-LABEL: @test_ugt_ugt 175 ; CHECK-NOT: call void @is(i1 true) 176 ; CHECK: call void @is(i1 false) 177 define void @test_ugt_ugt(i32 %a, i32 %b) { 178 %cmp1 = icmp ugt i32 %a, %b 179 br i1 %cmp1, label %untaken, label %taken 180 181 taken: 182 %cmp2 = icmp ugt i32 %a, %b 183 br i1 %cmp2, label %istrue, label %isfalse 184 185 istrue: 186 call void @is(i1 true) 187 ret void 188 189 isfalse: 190 call void @is(i1 false) 191 ret void 192 193 untaken: 194 ret void 195 } 196 197 ; If A >u B is false then A <=u B is implied true. 198 ; CHECK-LABEL: @test_ugt_ule 199 ; CHECK: call void @is(i1 true) 200 ; CHECK-NOT: call void @is(i1 false) 201 define void @test_ugt_ule(i32 %a, i32 %b) { 202 %cmp1 = icmp ugt i32 %a, %b 203 br i1 %cmp1, label %untaken, label %taken 204 205 taken: 206 %cmp2 = icmp ule i32 %a, %b 207 br i1 %cmp2, label %istrue, label %isfalse 208 209 istrue: 210 call void @is(i1 true) 211 ret void 212 213 isfalse: 214 call void @is(i1 false) 215 ret void 216 217 untaken: 218 ret void 219 } 220 221 ; If A >=u B is false then A >=u B is implied false. 222 ; CHECK-LABEL: @test_uge_uge 223 ; CHECK-NOT: call void @is(i1 true) 224 ; CHECK: call void @is(i1 false) 225 define void @test_uge_uge(i32 %a, i32 %b) { 226 %cmp1 = icmp uge i32 %a, %b 227 br i1 %cmp1, label %untaken, label %taken 228 229 taken: 230 %cmp2 = icmp uge i32 %a, %b 231 br i1 %cmp2, label %istrue, label %isfalse 232 233 istrue: 234 call void @is(i1 true) 235 ret void 236 237 isfalse: 238 call void @is(i1 false) 239 ret void 240 241 untaken: 242 ret void 243 } 244 245 ; If A >=u B is false then A <u B is implied true. 246 ; CHECK-LABEL: @test_uge_ult 247 ; CHECK: call void @is(i1 true) 248 ; CHECK-NOT: call void @is(i1 false) 249 define void @test_uge_ult(i32 %a, i32 %b) { 250 %cmp1 = icmp uge i32 %a, %b 251 br i1 %cmp1, label %untaken, label %taken 252 253 taken: 254 %cmp2 = icmp ult i32 %a, %b 255 br i1 %cmp2, label %istrue, label %isfalse 256 257 istrue: 258 call void @is(i1 true) 259 ret void 260 261 isfalse: 262 call void @is(i1 false) 263 ret void 264 265 untaken: 266 ret void 267 } 268 269 ; If A >=u B is false then A <=u B is implied true. 270 ; CHECK-LABEL: @test_uge_ule 271 ; CHECK: call void @is(i1 true) 272 ; CHECK-NOT: call void @is(i1 false) 273 define void @test_uge_ule(i32 %a, i32 %b) { 274 %cmp1 = icmp uge i32 %a, %b 275 br i1 %cmp1, label %untaken, label %taken 276 277 taken: 278 %cmp2 = icmp ule i32 %a, %b 279 br i1 %cmp2, label %istrue, label %isfalse 280 281 istrue: 282 call void @is(i1 true) 283 ret void 284 285 isfalse: 286 call void @is(i1 false) 287 ret void 288 289 untaken: 290 ret void 291 } 292 293 ; If A <u B is false then A <u B is implied false. 294 ; CHECK-LABEL: @test_ult_ult 295 ; CHECK-NOT: call void @is(i1 true) 296 ; CHECK: call void @is(i1 false) 297 define void @test_ult_ult(i32 %a, i32 %b) { 298 %cmp1 = icmp ult i32 %a, %b 299 br i1 %cmp1, label %untaken, label %taken 300 301 taken: 302 %cmp2 = icmp ult i32 %a, %b 303 br i1 %cmp2, label %istrue, label %isfalse 304 305 istrue: 306 call void @is(i1 true) 307 ret void 308 309 isfalse: 310 call void @is(i1 false) 311 ret void 312 313 untaken: 314 ret void 315 } 316 317 ; If A <=u B is false then A <=u B is implied false. 318 ; CHECK-LABEL: @test_ule_ule 319 ; CHECK-NOT: call void @is(i1 true) 320 ; CHECK: call void @is(i1 false) 321 define void @test_ule_ule(i32 %a, i32 %b) { 322 %cmp1 = icmp ule i32 %a, %b 323 br i1 %cmp1, label %untaken, label %taken 324 325 taken: 326 %cmp2 = icmp ule i32 %a, %b 327 br i1 %cmp2, label %istrue, label %isfalse 328 329 istrue: 330 call void @is(i1 true) 331 ret void 332 333 isfalse: 334 call void @is(i1 false) 335 ret void 336 337 untaken: 338 ret void 339 } 340