1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -constraint-elimination -S %s | FileCheck %s 3; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s 4 5; Test cases where both the true and false successors reach the same block, 6; dominated by one of them. 7 8declare void @use(i1) 9 10define i32 @test1(i32 %x) { 11; CHECK-LABEL: @test1( 12; CHECK-NEXT: entry: 13; CHECK-NEXT: [[C_1:%.*]] = icmp ule i32 [[X:%.*]], 10 14; CHECK-NEXT: br i1 [[C_1]], label [[BB1:%.*]], label [[BB2:%.*]] 15; CHECK: bb1: 16; CHECK-NEXT: [[C_2:%.*]] = icmp ule i32 [[X]], 10 17; CHECK-NEXT: call void @use(i1 true) 18; CHECK-NEXT: br label [[BB2]] 19; CHECK: bb2: 20; CHECK-NEXT: [[C_3:%.*]] = icmp ugt i32 [[X]], 10 21; CHECK-NEXT: call void @use(i1 [[C_3]]) 22; CHECK-NEXT: ret i32 20 23; 24entry: 25 %c.1 = icmp ule i32 %x, 10 26 br i1 %c.1, label %bb1, label %bb2 27 28bb1: 29 %c.2 = icmp ule i32 %x, 10 30 call void @use(i1 %c.2) 31 br label %bb2 32 33bb2: 34 %c.3 = icmp ugt i32 %x, 10 35 call void @use(i1 %c.3) 36 ret i32 20 37} 38 39 40define i32 @test2(i32 %x) { 41; CHECK-LABEL: @test2( 42; CHECK-NEXT: entry: 43; CHECK-NEXT: [[C_1:%.*]] = icmp ule i32 [[X:%.*]], 10 44; CHECK-NEXT: br i1 [[C_1]], label [[BB2:%.*]], label [[BB1:%.*]] 45; CHECK: bb1: 46; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i32 [[X]], 10 47; CHECK-NEXT: call void @use(i1 [[C_2]]) 48; CHECK-NEXT: ret i32 20 49; CHECK: bb2: 50; CHECK-NEXT: [[C_3:%.*]] = icmp ule i32 [[X]], 10 51; CHECK-NEXT: call void @use(i1 true) 52; CHECK-NEXT: br label [[BB1]] 53; 54entry: 55 %c.1 = icmp ule i32 %x, 10 56 br i1 %c.1, label %bb2, label %bb1 57 58bb1: 59 %c.2 = icmp ugt i32 %x, 10 60 call void @use(i1 %c.2) 61 ret i32 20 62 63bb2: 64 %c.3 = icmp ule i32 %x, 10 65 call void @use(i1 %c.3) 66 br label %bb1 67} 68 69 70; Test cases where the true/false successors are not domianted by the conditional branching block. 71define i32 @test3(i32 %x, i1 %c) { 72; CHECK-LABEL: @test3( 73; CHECK-NEXT: entry: 74; CHECK-NEXT: br i1 [[C:%.*]], label [[BB_COND:%.*]], label [[BB1:%.*]] 75; CHECK: bb.cond: 76; CHECK-NEXT: [[C_1:%.*]] = icmp ule i32 [[X:%.*]], 10 77; CHECK-NEXT: br i1 [[C_1]], label [[BB1]], label [[BB2:%.*]] 78; CHECK: bb1: 79; CHECK-NEXT: [[C_2:%.*]] = icmp ule i32 [[X]], 10 80; CHECK-NEXT: call void @use(i1 [[C_2]]) 81; CHECK-NEXT: ret i32 10 82; CHECK: bb2: 83; CHECK-NEXT: [[C_3:%.*]] = icmp ugt i32 [[X]], 10 84; CHECK-NEXT: call void @use(i1 true) 85; CHECK-NEXT: ret i32 20 86; 87entry: 88 br i1 %c, label %bb.cond, label %bb1 89 90bb.cond: 91 %c.1 = icmp ule i32 %x, 10 92 br i1 %c.1, label %bb1, label %bb2 93 94bb1: 95 %c.2 = icmp ule i32 %x, 10 96 call void @use(i1 %c.2) 97 ret i32 10 98 99bb2: 100 %c.3 = icmp ugt i32 %x, 10 101 call void @use(i1 %c.3) 102 ret i32 20 103} 104 105define i32 @test4(i32 %x, i1 %c) { 106; CHECK-LABEL: @test4( 107; CHECK-NEXT: entry: 108; CHECK-NEXT: br i1 [[C:%.*]], label [[BB_COND:%.*]], label [[BB2:%.*]] 109; CHECK: bb.cond: 110; CHECK-NEXT: [[C_1:%.*]] = icmp ule i32 [[X:%.*]], 10 111; CHECK-NEXT: br i1 [[C_1]], label [[BB1:%.*]], label [[BB2]] 112; CHECK: bb1: 113; CHECK-NEXT: [[C_2:%.*]] = icmp ule i32 [[X]], 10 114; CHECK-NEXT: call void @use(i1 true) 115; CHECK-NEXT: ret i32 10 116; CHECK: bb2: 117; CHECK-NEXT: [[C_3:%.*]] = icmp ugt i32 [[X]], 10 118; CHECK-NEXT: call void @use(i1 [[C_3]]) 119; CHECK-NEXT: ret i32 20 120; 121entry: 122 br i1 %c, label %bb.cond, label %bb2 123 124bb.cond: 125 %c.1 = icmp ule i32 %x, 10 126 br i1 %c.1, label %bb1, label %bb2 127 128bb1: 129 %c.2 = icmp ule i32 %x, 10 130 call void @use(i1 %c.2) 131 ret i32 10 132 133bb2: 134 %c.3 = icmp ugt i32 %x, 10 135 call void @use(i1 %c.3) 136 ret i32 20 137} 138 139 140define void @test_cond_from_preheader(i32 %x, i1 %c) { 141; CHECK-LABEL: @test_cond_from_preheader( 142; CHECK-NEXT: entry: 143; CHECK-NEXT: br i1 [[C:%.*]], label [[PRE:%.*]], label [[BB2:%.*]] 144; CHECK: pre: 145; CHECK-NEXT: [[C_1:%.*]] = icmp ule i32 [[X:%.*]], 10 146; CHECK-NEXT: br i1 [[C_1]], label [[LOOP:%.*]], label [[BB2]] 147; CHECK: loop: 148; CHECK-NEXT: [[T_1:%.*]] = icmp ule i32 [[X]], 10 149; CHECK-NEXT: call void @use(i1 true) 150; CHECK-NEXT: [[F_1:%.*]] = icmp ugt i32 [[X]], 10 151; CHECK-NEXT: call void @use(i1 false) 152; CHECK-NEXT: [[C_2:%.*]] = icmp ule i32 [[X]], 9 153; CHECK-NEXT: call void @use(i1 [[C_2]]) 154; CHECK-NEXT: [[C_3:%.*]] = icmp ugt i32 [[X]], 9 155; CHECK-NEXT: call void @use(i1 [[C_3]]) 156; CHECK-NEXT: br i1 true, label [[EXIT:%.*]], label [[LOOP]] 157; CHECK: exit: 158; CHECK-NEXT: [[C_4:%.*]] = icmp ule i32 [[X]], 10 159; CHECK-NEXT: call void @use(i1 true) 160; CHECK-NEXT: ret void 161; CHECK: bb2: 162; CHECK-NEXT: [[C_5:%.*]] = icmp ugt i32 [[X]], 10 163; CHECK-NEXT: call void @use(i1 [[C_5]]) 164; CHECK-NEXT: ret void 165; 166entry: 167 br i1 %c, label %pre, label %bb2 168 169pre: 170 %c.1 = icmp ule i32 %x, 10 171 br i1 %c.1, label %loop, label %bb2 172 173loop: 174 %t.1 = icmp ule i32 %x, 10 175 call void @use(i1 %t.1) 176 %f.1 = icmp ugt i32 %x, 10 177 call void @use(i1 %f.1) 178 179 %c.2 = icmp ule i32 %x, 9 180 call void @use(i1 %c.2) 181 %c.3 = icmp ugt i32 %x, 9 182 call void @use(i1 %c.3) 183 184 br i1 true, label %exit, label %loop 185 186exit: 187 %c.4 = icmp ule i32 %x, 10 188 call void @use(i1 %c.4) 189 ret void 190 191bb2: 192 %c.5 = icmp ugt i32 %x, 10 193 call void @use(i1 %c.5) 194 ret void 195} 196 197define void @test_cond_from_preheader_successors_flipped(i32 %x, i1 %c) { 198; CHECK-LABEL: @test_cond_from_preheader_successors_flipped( 199; CHECK-NEXT: entry: 200; CHECK-NEXT: br i1 [[C:%.*]], label [[PRE:%.*]], label [[BB2:%.*]] 201; CHECK: pre: 202; CHECK-NEXT: [[C_1:%.*]] = icmp ule i32 [[X:%.*]], 10 203; CHECK-NEXT: br i1 [[C_1]], label [[BB2]], label [[LOOP:%.*]] 204; CHECK: loop: 205; CHECK-NEXT: [[F_1:%.*]] = icmp ule i32 [[X]], 10 206; CHECK-NEXT: call void @use(i1 false) 207; CHECK-NEXT: [[T_1:%.*]] = icmp ugt i32 [[X]], 10 208; CHECK-NEXT: call void @use(i1 true) 209; CHECK-NEXT: [[C_2:%.*]] = icmp ule i32 [[X]], 11 210; CHECK-NEXT: call void @use(i1 [[C_2]]) 211; CHECK-NEXT: [[C_3:%.*]] = icmp ugt i32 [[X]], 11 212; CHECK-NEXT: call void @use(i1 [[C_3]]) 213; CHECK-NEXT: br i1 true, label [[EXIT:%.*]], label [[LOOP]] 214; CHECK: exit: 215; CHECK-NEXT: [[F_2:%.*]] = icmp ule i32 [[X]], 10 216; CHECK-NEXT: call void @use(i1 false) 217; CHECK-NEXT: ret void 218; CHECK: bb2: 219; CHECK-NEXT: [[C_5:%.*]] = icmp ugt i32 [[X]], 10 220; CHECK-NEXT: call void @use(i1 [[C_5]]) 221; CHECK-NEXT: ret void 222; 223entry: 224 br i1 %c, label %pre, label %bb2 225 226pre: 227 %c.1 = icmp ule i32 %x, 10 228 br i1 %c.1, label %bb2, label %loop 229 230loop: 231 %f.1 = icmp ule i32 %x, 10 232 call void @use(i1 %f.1) 233 %t.1 = icmp ugt i32 %x, 10 234 call void @use(i1 %t.1) 235 236 %c.2 = icmp ule i32 %x, 11 237 call void @use(i1 %c.2) 238 %c.3 = icmp ugt i32 %x, 11 239 call void @use(i1 %c.3) 240 241 br i1 true, label %exit, label %loop 242 243exit: 244 %f.2 = icmp ule i32 %x, 10 245 call void @use(i1 %f.2) 246 ret void 247 248bb2: 249 %c.5 = icmp ugt i32 %x, 10 250 call void @use(i1 %c.5) 251 ret void 252} 253 254define void @test_cond_from_preheader_and(i32 %x, i32 %y, i1 %c) { 255; CHECK-LABEL: @test_cond_from_preheader_and( 256; CHECK-NEXT: entry: 257; CHECK-NEXT: br i1 [[C:%.*]], label [[PRE:%.*]], label [[EXIT:%.*]] 258; CHECK: exit: 259; CHECK-NEXT: [[C_5:%.*]] = icmp ugt i32 [[Y:%.*]], 10 260; CHECK-NEXT: call void @use(i1 [[C_5]]) 261; CHECK-NEXT: ret void 262; CHECK: pre: 263; CHECK-NEXT: [[X_1:%.*]] = icmp ule i32 [[X:%.*]], 10 264; CHECK-NEXT: [[Y_1:%.*]] = icmp ugt i32 [[Y]], 99 265; CHECK-NEXT: [[AND:%.*]] = and i1 [[X_1]], [[Y_1]] 266; CHECK-NEXT: br i1 [[AND]], label [[LOOP:%.*]], label [[EXIT_1:%.*]] 267; CHECK: loop: 268; CHECK-NEXT: [[T_1:%.*]] = icmp ule i32 [[X]], 10 269; CHECK-NEXT: call void @use(i1 true) 270; CHECK-NEXT: [[F_1:%.*]] = icmp ugt i32 [[X]], 10 271; CHECK-NEXT: call void @use(i1 false) 272; CHECK-NEXT: [[C_1:%.*]] = icmp ule i32 [[X]], 9 273; CHECK-NEXT: call void @use(i1 [[C_1]]) 274; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i32 [[X]], 9 275; CHECK-NEXT: call void @use(i1 [[C_2]]) 276; CHECK-NEXT: [[T_2:%.*]] = icmp ugt i32 [[Y]], 99 277; CHECK-NEXT: call void @use(i1 true) 278; CHECK-NEXT: [[F_2:%.*]] = icmp ule i32 [[Y]], 99 279; CHECK-NEXT: call void @use(i1 false) 280; CHECK-NEXT: [[C_3:%.*]] = icmp ugt i32 [[Y]], 100 281; CHECK-NEXT: call void @use(i1 [[C_3]]) 282; CHECK-NEXT: [[C_4:%.*]] = icmp ugt i32 [[Y]], 100 283; CHECK-NEXT: call void @use(i1 [[C_4]]) 284; CHECK-NEXT: br i1 true, label [[EXIT]], label [[LOOP]] 285; CHECK: exit.1: 286; CHECK-NEXT: [[C_6:%.*]] = icmp ugt i32 [[Y]], 10 287; CHECK-NEXT: call void @use(i1 [[C_6]]) 288; CHECK-NEXT: ret void 289; 290entry: 291 br i1 %c, label %pre, label %exit 292 293exit: 294 %c.5 = icmp ugt i32 %y, 10 295 call void @use(i1 %c.5) 296 ret void 297 298pre: 299 %x.1 = icmp ule i32 %x, 10 300 %y.1 = icmp ugt i32 %y, 99 301 %and = and i1 %x.1, %y.1 302 br i1 %and, label %loop, label %exit.1 303 304loop: 305 %t.1 = icmp ule i32 %x, 10 306 call void @use(i1 %t.1) 307 %f.1 = icmp ugt i32 %x, 10 308 call void @use(i1 %f.1) 309 %c.1 = icmp ule i32 %x, 9 310 call void @use(i1 %c.1) 311 %c.2 = icmp ugt i32 %x, 9 312 call void @use(i1 %c.2) 313 314 315 %t.2 = icmp ugt i32 %y, 99 316 call void @use(i1 %t.2) 317 %f.2 = icmp ule i32 %y, 99 318 call void @use(i1 %f.2) 319 320 %c.3 = icmp ugt i32 %y, 100 321 call void @use(i1 %c.3) 322 %c.4 = icmp ugt i32 %y, 100 323 call void @use(i1 %c.4) 324 325 br i1 true, label %exit, label %loop 326 327exit.1: 328 %c.6 = icmp ugt i32 %y, 10 329 call void @use(i1 %c.6) 330 ret void 331} 332 333 334define void @test_cond_from_preheader_and_successors_flipped(i32 %x, i32 %y, i1 %c) { 335; CHECK-LABEL: @test_cond_from_preheader_and_successors_flipped( 336; CHECK-NEXT: entry: 337; CHECK-NEXT: br i1 [[C:%.*]], label [[PRE:%.*]], label [[EXIT:%.*]] 338; CHECK: exit: 339; CHECK-NEXT: [[C_9:%.*]] = icmp ugt i32 [[Y:%.*]], 10 340; CHECK-NEXT: call void @use(i1 [[C_9]]) 341; CHECK-NEXT: ret void 342; CHECK: pre: 343; CHECK-NEXT: [[X_1:%.*]] = icmp ule i32 [[X:%.*]], 10 344; CHECK-NEXT: [[Y_1:%.*]] = icmp ugt i32 [[Y]], 99 345; CHECK-NEXT: [[AND:%.*]] = and i1 [[X_1]], [[Y_1]] 346; CHECK-NEXT: br i1 [[AND]], label [[EXIT_1:%.*]], label [[LOOP:%.*]] 347; CHECK: loop: 348; CHECK-NEXT: [[C_1:%.*]] = icmp ule i32 [[X]], 10 349; CHECK-NEXT: call void @use(i1 [[C_1]]) 350; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i32 [[X]], 10 351; CHECK-NEXT: call void @use(i1 [[C_2]]) 352; CHECK-NEXT: [[C_3:%.*]] = icmp ule i32 [[X]], 9 353; CHECK-NEXT: call void @use(i1 [[C_3]]) 354; CHECK-NEXT: [[C_4:%.*]] = icmp ugt i32 [[X]], 9 355; CHECK-NEXT: call void @use(i1 [[C_4]]) 356; CHECK-NEXT: [[C_5:%.*]] = icmp ugt i32 [[Y]], 99 357; CHECK-NEXT: call void @use(i1 [[C_5]]) 358; CHECK-NEXT: [[C_6:%.*]] = icmp ule i32 [[Y]], 99 359; CHECK-NEXT: call void @use(i1 [[C_6]]) 360; CHECK-NEXT: [[C_7:%.*]] = icmp ugt i32 [[Y]], 100 361; CHECK-NEXT: call void @use(i1 [[C_7]]) 362; CHECK-NEXT: [[C_8:%.*]] = icmp ugt i32 [[Y]], 100 363; CHECK-NEXT: call void @use(i1 [[C_8]]) 364; CHECK-NEXT: br i1 true, label [[EXIT]], label [[LOOP]] 365; CHECK: exit.1: 366; CHECK-NEXT: [[T_1:%.*]] = icmp ugt i32 [[Y]], 10 367; CHECK-NEXT: call void @use(i1 true) 368; CHECK-NEXT: ret void 369; 370entry: 371 br i1 %c, label %pre, label %exit 372 373exit: 374 %c.9 = icmp ugt i32 %y, 10 375 call void @use(i1 %c.9) 376 ret void 377 378pre: 379 %x.1 = icmp ule i32 %x, 10 380 %y.1 = icmp ugt i32 %y, 99 381 %and = and i1 %x.1, %y.1 382 br i1 %and, label %exit.1, label %loop 383 384loop: 385 %c.1 = icmp ule i32 %x, 10 386 call void @use(i1 %c.1) 387 %c.2 = icmp ugt i32 %x, 10 388 call void @use(i1 %c.2) 389 %c.3 = icmp ule i32 %x, 9 390 call void @use(i1 %c.3) 391 %c.4 = icmp ugt i32 %x, 9 392 call void @use(i1 %c.4) 393 394 395 %c.5 = icmp ugt i32 %y, 99 396 call void @use(i1 %c.5) 397 %c.6 = icmp ule i32 %y, 99 398 call void @use(i1 %c.6) 399 400 %c.7 = icmp ugt i32 %y, 100 401 call void @use(i1 %c.7) 402 %c.8 = icmp ugt i32 %y, 100 403 call void @use(i1 %c.8) 404 405 br i1 true, label %exit, label %loop 406 407exit.1: 408 %t.1 = icmp ugt i32 %y, 10 409 call void @use(i1 %t.1) 410 ret void 411} 412 413define void @test_cond_from_preheader_or(i32 %x, i32 %y, i1 %c) { 414; CHECK-LABEL: @test_cond_from_preheader_or( 415; CHECK-NEXT: entry: 416; CHECK-NEXT: br i1 [[C:%.*]], label [[PRE:%.*]], label [[EXIT:%.*]] 417; CHECK: exit: 418; CHECK-NEXT: [[C_5:%.*]] = icmp ugt i32 [[Y:%.*]], 10 419; CHECK-NEXT: call void @use(i1 [[C_5]]) 420; CHECK-NEXT: ret void 421; CHECK: pre: 422; CHECK-NEXT: [[X_1:%.*]] = icmp ule i32 [[X:%.*]], 10 423; CHECK-NEXT: [[Y_1:%.*]] = icmp ugt i32 [[Y]], 99 424; CHECK-NEXT: [[OR:%.*]] = or i1 [[X_1]], [[Y_1]] 425; CHECK-NEXT: br i1 [[OR]], label [[EXIT_1:%.*]], label [[LOOP:%.*]] 426; CHECK: loop: 427; CHECK-NEXT: [[T_1:%.*]] = icmp ugt i32 [[X]], 10 428; CHECK-NEXT: call void @use(i1 true) 429; CHECK-NEXT: [[F_1:%.*]] = icmp ule i32 [[X]], 10 430; CHECK-NEXT: call void @use(i1 false) 431; CHECK-NEXT: [[C_1:%.*]] = icmp ugt i32 [[X]], 11 432; CHECK-NEXT: call void @use(i1 [[C_1]]) 433; CHECK-NEXT: [[C_2:%.*]] = icmp ule i32 [[X]], 11 434; CHECK-NEXT: call void @use(i1 [[C_2]]) 435; CHECK-NEXT: [[T_2:%.*]] = icmp ule i32 [[Y]], 99 436; CHECK-NEXT: call void @use(i1 true) 437; CHECK-NEXT: [[F_2:%.*]] = icmp ugt i32 [[Y]], 99 438; CHECK-NEXT: call void @use(i1 false) 439; CHECK-NEXT: [[C_3:%.*]] = icmp ule i32 [[Y]], 98 440; CHECK-NEXT: call void @use(i1 [[C_3]]) 441; CHECK-NEXT: [[C_4:%.*]] = icmp ule i32 [[Y]], 98 442; CHECK-NEXT: call void @use(i1 [[C_4]]) 443; CHECK-NEXT: br i1 true, label [[EXIT]], label [[LOOP]] 444; CHECK: exit.1: 445; CHECK-NEXT: [[C_6:%.*]] = icmp ule i32 [[Y]], 100 446; CHECK-NEXT: call void @use(i1 [[C_6]]) 447; CHECK-NEXT: ret void 448; 449entry: 450 br i1 %c, label %pre, label %exit 451 452exit: 453 %c.5 = icmp ugt i32 %y, 10 454 call void @use(i1 %c.5) 455 ret void 456 457pre: 458 %x.1 = icmp ule i32 %x, 10 459 %y.1 = icmp ugt i32 %y, 99 460 %or = or i1 %x.1, %y.1 461 br i1 %or, label %exit.1, label %loop 462 463loop: 464 %t.1 = icmp ugt i32 %x, 10 465 call void @use(i1 %t.1) 466 %f.1 = icmp ule i32 %x, 10 467 call void @use(i1 %f.1) 468 %c.1 = icmp ugt i32 %x, 11 469 call void @use(i1 %c.1) 470 %c.2 = icmp ule i32 %x, 11 471 call void @use(i1 %c.2) 472 473 474 %t.2 = icmp ule i32 %y, 99 475 call void @use(i1 %t.2) 476 %f.2 = icmp ugt i32 %y, 99 477 call void @use(i1 %f.2) 478 479 %c.3 = icmp ule i32 %y, 98 480 call void @use(i1 %c.3) 481 %c.4 = icmp ule i32 %y, 98 482 call void @use(i1 %c.4) 483 484 br i1 true, label %exit, label %loop 485 486exit.1: 487 %c.6 = icmp ule i32 %y, 100 488 call void @use(i1 %c.6) 489 ret void 490} 491 492define void @test_cond_from_preheader_or_successor_flipped(i32 %x, i32 %y, i1 %c) { 493; CHECK-LABEL: @test_cond_from_preheader_or_successor_flipped( 494; CHECK-NEXT: entry: 495; CHECK-NEXT: br i1 [[C:%.*]], label [[PRE:%.*]], label [[EXIT:%.*]] 496; CHECK: exit: 497; CHECK-NEXT: [[C_9:%.*]] = icmp ugt i32 [[Y:%.*]], 10 498; CHECK-NEXT: call void @use(i1 [[C_9]]) 499; CHECK-NEXT: ret void 500; CHECK: pre: 501; CHECK-NEXT: [[X_1:%.*]] = icmp ule i32 [[X:%.*]], 10 502; CHECK-NEXT: [[Y_1:%.*]] = icmp ugt i32 [[Y]], 99 503; CHECK-NEXT: [[OR:%.*]] = or i1 [[X_1]], [[Y_1]] 504; CHECK-NEXT: br i1 [[OR]], label [[LOOP:%.*]], label [[EXIT_1:%.*]] 505; CHECK: loop: 506; CHECK-NEXT: [[C_1:%.*]] = icmp ule i32 [[X]], 10 507; CHECK-NEXT: call void @use(i1 [[C_1]]) 508; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i32 [[X]], 10 509; CHECK-NEXT: call void @use(i1 [[C_2]]) 510; CHECK-NEXT: [[C_3:%.*]] = icmp ule i32 [[X]], 9 511; CHECK-NEXT: call void @use(i1 [[C_3]]) 512; CHECK-NEXT: [[C_4:%.*]] = icmp ugt i32 [[X]], 9 513; CHECK-NEXT: call void @use(i1 [[C_4]]) 514; CHECK-NEXT: [[C_5:%.*]] = icmp ugt i32 [[Y]], 99 515; CHECK-NEXT: call void @use(i1 [[C_5]]) 516; CHECK-NEXT: [[C_6:%.*]] = icmp ule i32 [[Y]], 99 517; CHECK-NEXT: call void @use(i1 [[C_6]]) 518; CHECK-NEXT: [[C_7:%.*]] = icmp ugt i32 [[Y]], 100 519; CHECK-NEXT: call void @use(i1 [[C_7]]) 520; CHECK-NEXT: [[C_8:%.*]] = icmp ugt i32 [[Y]], 100 521; CHECK-NEXT: call void @use(i1 [[C_8]]) 522; CHECK-NEXT: br i1 true, label [[EXIT]], label [[LOOP]] 523; CHECK: exit.1: 524; CHECK-NEXT: [[T_1:%.*]] = icmp ule i32 [[Y]], 100 525; CHECK-NEXT: call void @use(i1 true) 526; CHECK-NEXT: ret void 527; 528entry: 529 br i1 %c, label %pre, label %exit 530 531exit: 532 %c.9 = icmp ugt i32 %y, 10 533 call void @use(i1 %c.9) 534 ret void 535 536pre: 537 %x.1 = icmp ule i32 %x, 10 538 %y.1 = icmp ugt i32 %y, 99 539 %or = or i1 %x.1, %y.1 540 br i1 %or, label %loop, label %exit.1 541 542loop: 543 %c.1 = icmp ule i32 %x, 10 544 call void @use(i1 %c.1) 545 %c.2 = icmp ugt i32 %x, 10 546 call void @use(i1 %c.2) 547 %c.3 = icmp ule i32 %x, 9 548 call void @use(i1 %c.3) 549 %c.4 = icmp ugt i32 %x, 9 550 call void @use(i1 %c.4) 551 552 %c.5 = icmp ugt i32 %y, 99 553 call void @use(i1 %c.5) 554 %c.6 = icmp ule i32 %y, 99 555 call void @use(i1 %c.6) 556 557 %c.7 = icmp ugt i32 %y, 100 558 call void @use(i1 %c.7) 559 %c.8 = icmp ugt i32 %y, 100 560 call void @use(i1 %c.8) 561 562 br i1 true, label %exit, label %loop 563 564exit.1: 565 %t.1 = icmp ule i32 %y, 100 566 call void @use(i1 %t.1) 567 ret void 568} 569