1575 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=ipsccp -S | FileCheck %s3 4declare void @use(i1)5 6define void @f1(i32 %a, i32 %b) {7; CHECK-LABEL: @f1(8; CHECK-NEXT: entry:9; CHECK-NEXT: [[A_255:%.*]] = and i32 [[A:%.*]], 25510; CHECK-NEXT: [[A_2:%.*]] = add nuw nsw i32 [[A_255]], 2011; CHECK-NEXT: [[BC:%.*]] = icmp ugt i32 [[B:%.*]], [[A_2]]12; CHECK-NEXT: br i1 [[BC]], label [[TRUE:%.*]], label [[FALSE:%.*]]13; CHECK: true:14; CHECK-NEXT: call void @use(i1 false)15; CHECK-NEXT: call void @use(i1 false)16; CHECK-NEXT: call void @use(i1 false)17; CHECK-NEXT: call void @use(i1 true)18; CHECK-NEXT: call void @use(i1 true)19; CHECK-NEXT: [[C_1:%.*]] = icmp eq i32 [[B]], 2120; CHECK-NEXT: call void @use(i1 [[C_1]])21; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i32 [[B]], 2122; CHECK-NEXT: call void @use(i1 [[C_2]])23; CHECK-NEXT: [[C_3:%.*]] = icmp ugt i32 [[B]], 25524; CHECK-NEXT: call void @use(i1 [[C_3]])25; CHECK-NEXT: ret void26; CHECK: false:27; CHECK-NEXT: call void @use(i1 false)28; CHECK-NEXT: call void @use(i1 false)29; CHECK-NEXT: call void @use(i1 true)30; CHECK-NEXT: call void @use(i1 true)31; CHECK-NEXT: [[C_4:%.*]] = icmp eq i32 [[B]], 2132; CHECK-NEXT: call void @use(i1 [[C_4]])33; CHECK-NEXT: [[C_5:%.*]] = icmp eq i32 [[B]], 27534; CHECK-NEXT: call void @use(i1 [[C_5]])35; CHECK-NEXT: ret void36;37entry:38 %a.255 = and i32 %a, 25539 %a.2 = add i32 %a.255, 2040 %bc = icmp ugt i32 %b, %a.241 br i1 %bc, label %true, label %false42 43true: ; %b in [21, 0)44 ; Conditions below are false.45 %f.1 = icmp eq i32 %b, 046 call void @use(i1 %f.1)47 %f.2 = icmp eq i32 %b, 2048 call void @use(i1 %f.2)49 %f.3 = icmp ult i32 %b, 2050 call void @use(i1 %f.3)51 52 ; Conditions below are true.53 %t.1 = icmp ugt i32 %b, 554 call void @use(i1 %t.1)55 %t.2 = icmp ne i32 %b, 2056 call void @use(i1 %t.2)57 58 ; Conditions below cannot be simplified.59 %c.1 = icmp eq i32 %b, 2160 call void @use(i1 %c.1)61 %c.2 = icmp ugt i32 %b, 2162 call void @use(i1 %c.2)63 %c.3 = icmp ugt i32 %b, 25564 call void @use(i1 %c.3)65 ret void66 67false: ;%b in [0, 276)68 ; Conditions below are false;69 %f.4 = icmp eq i32 %b, 27670 call void @use(i1 %f.4)71 %f.5 = icmp ugt i32 %b, 27572 call void @use(i1 %f.5)73 74 ; Conditions below are true;75 %t.3 = icmp ne i32 %b, 27676 call void @use(i1 %t.3)77 %t.4 = icmp ule i32 %b, 27578 call void @use(i1 %t.4)79 80 ; Conditions below cannot be simplified.81 %c.4 = icmp eq i32 %b, 2182 call void @use(i1 %c.4)83 %c.5 = icmp eq i32 %b, 27584 call void @use(i1 %c.5)85 ret void86}87 88define void @f2_ptr(ptr %a, ptr %b) {89; CHECK-LABEL: @f2_ptr(90; CHECK-NEXT: entry:91; CHECK-NEXT: [[BC:%.*]] = icmp eq ptr [[A:%.*]], null92; CHECK-NEXT: br i1 [[BC]], label [[TRUE:%.*]], label [[FALSE:%.*]]93; CHECK: true:94; CHECK-NEXT: call void @use(i1 false)95; CHECK-NEXT: call void @use(i1 true)96; CHECK-NEXT: [[C_1:%.*]] = icmp eq ptr null, [[B:%.*]]97; CHECK-NEXT: call void @use(i1 [[C_1]])98; CHECK-NEXT: ret void99; CHECK: false:100; CHECK-NEXT: call void @use(i1 false)101; CHECK-NEXT: call void @use(i1 true)102; CHECK-NEXT: [[C_2:%.*]] = icmp eq ptr [[A]], [[B]]103; CHECK-NEXT: call void @use(i1 [[C_2]])104; CHECK-NEXT: ret void105;106entry:107 %bc = icmp eq ptr %a, null108 br i1 %bc, label %true, label %false109 110true: ; %a == 0111 %f.1 = icmp ne ptr %a, null112 call void @use(i1 %f.1)113 114 %t.1 = icmp eq ptr %a, null115 call void @use(i1 %t.1)116 117 %c.1 = icmp eq ptr %a, %b118 call void @use(i1 %c.1)119 ret void120 121false: ; %a != 0122 %f.2 = icmp eq ptr %a, null123 call void @use(i1 %f.2)124 125 %t.2 = icmp ne ptr %a, null126 call void @use(i1 %t.2)127 128 %c.2 = icmp eq ptr %a, %b129 call void @use(i1 %c.2)130 ret void131}132 133define ptr @f3(ptr %a, ptr %b, i1 %c) {134; CHECK-LABEL: @f3(135; CHECK-NEXT: entry:136; CHECK-NEXT: [[C_1:%.*]] = icmp eq ptr [[A:%.*]], null137; CHECK-NEXT: br i1 [[C_1]], label [[TRUE:%.*]], label [[FALSE:%.*]]138; CHECK: true:139; CHECK-NEXT: br i1 [[C:%.*]], label [[TRUE_2:%.*]], label [[FALSE_2:%.*]]140; CHECK: true.2:141; CHECK-NEXT: br label [[EXIT_2:%.*]]142; CHECK: false.2:143; CHECK-NEXT: br label [[EXIT_2]]144; CHECK: exit.2:145; CHECK-NEXT: [[P:%.*]] = phi ptr [ null, [[TRUE_2]] ], [ [[B:%.*]], [[FALSE_2]] ]146; CHECK-NEXT: ret ptr [[P]]147; CHECK: false:148; CHECK-NEXT: ret ptr null149;150entry:151 %c.1 = icmp eq ptr %a, null152 br i1 %c.1, label %true, label %false153 154true:155 br i1 %c, label %true.2, label %false.2156 157true.2:158 br label %exit.2159 160false.2:161 br label %exit.2162 163exit.2:164 %p = phi ptr [ %a, %true.2 ], [ %b, %false.2 ]165 ret ptr %p166 167false:168 ret ptr null169}170 171define i32 @f5(i64 %sz) {172; CHECK-LABEL: @f5(173; CHECK-NEXT: entry:174; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i64 4088, [[SZ:%.*]]175; CHECK-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_END:%.*]]176; CHECK: cond.true:177; CHECK-NEXT: [[DIV:%.*]] = udiv i64 4088, [[SZ]]178; CHECK-NEXT: br label [[COND_END]]179; CHECK: cond.end:180; CHECK-NEXT: [[COND:%.*]] = phi i64 [ [[DIV]], [[COND_TRUE]] ], [ 1, [[ENTRY:%.*]] ]181; CHECK-NEXT: [[CONV:%.*]] = trunc nuw nsw i64 [[COND]] to i32182; CHECK-NEXT: ret i32 [[CONV]]183;184entry:185 %cmp = icmp ugt i64 4088, %sz186 br i1 %cmp, label %cond.true, label %cond.end187 188cond.true: ; preds = %entry189 %div = udiv i64 4088, %sz190 br label %cond.end191 192cond.end: ; preds = %entry, %cond.true193 %cond = phi i64 [ %div, %cond.true ], [ 1, %entry ]194 %conv = trunc i64 %cond to i32195 ret i32 %conv196}197 198define void @f6(i32 %b) {199; CHECK-LABEL: @f6(200; CHECK-NEXT: entry:201; CHECK-NEXT: [[C_1:%.*]] = icmp ugt i32 [[B:%.*]], 20202; CHECK-NEXT: br i1 [[C_1]], label [[TRUE:%.*]], label [[FALSE:%.*]]203; CHECK: true:204; CHECK-NEXT: call void @use(i1 true)205; CHECK-NEXT: ret void206; CHECK: false:207; CHECK-NEXT: ret void208;209entry:210 %a = add i32 10, 10211 %c.1 = icmp ugt i32 %b, %a212 br i1 %c.1, label %true, label %false213 214true:215 %c.2 = icmp eq i32 %a, 20216 call void @use(i1 %c.2)217 ret void218 219false:220 ret void221}222 223; Test with 2 unrelated nested conditions.224define void @f7_nested_conds(ptr %a, i32 %b) {225; CHECK-LABEL: @f7_nested_conds(226; CHECK-NEXT: entry:227; CHECK-NEXT: [[A_V:%.*]] = load i32, ptr [[A:%.*]], align 4228; CHECK-NEXT: [[C_1:%.*]] = icmp ne i32 [[A_V]], 0229; CHECK-NEXT: br i1 [[C_1]], label [[TRUE:%.*]], label [[FALSE:%.*]]230; CHECK: false:231; CHECK-NEXT: br label [[TRUE_2:%.*]]232; CHECK: true.2:233; CHECK-NEXT: call void @use(i1 true)234; CHECK-NEXT: ret void235; CHECK: true:236; CHECK-NEXT: store i32 [[B:%.*]], ptr [[A]], align 4237; CHECK-NEXT: ret void238;239entry:240 %a.v = load i32, ptr %a241 %c.1 = icmp ne i32 %a.v, 0242 br i1 %c.1, label %true, label %false243 244false:245 %c.2 = icmp ult i32 %a.v, 3246 br i1 %c.2, label %true.2, label %true247 248true.2:249 %c.3 = icmp eq i32 %a.v, 0250 call void @use(i1 %c.3)251 ret void252 253true:254 store i32 %b, ptr %a255 ret void256}257 258; Test with 2 related nested conditions (%b > [20, 276) && %b < 255).259define void @f8_nested_conds(i32 %a, i32 %b) {260; CHECK-LABEL: @f8_nested_conds(261; CHECK-NEXT: entry:262; CHECK-NEXT: [[A_255:%.*]] = and i32 [[A:%.*]], 255263; CHECK-NEXT: [[A_2:%.*]] = add nuw nsw i32 [[A_255]], 20264; CHECK-NEXT: [[BC_1:%.*]] = icmp ugt i32 [[B:%.*]], [[A_2]]265; CHECK-NEXT: br i1 [[BC_1]], label [[TRUE:%.*]], label [[FALSE:%.*]]266; CHECK: true:267; CHECK-NEXT: [[BC_2:%.*]] = icmp ult i32 [[B]], 255268; CHECK-NEXT: br i1 [[BC_2]], label [[TRUE_2:%.*]], label [[FALSE_2:%.*]]269; CHECK: true.2:270; CHECK-NEXT: call void @use(i1 false)271; CHECK-NEXT: call void @use(i1 false)272; CHECK-NEXT: call void @use(i1 false)273; CHECK-NEXT: call void @use(i1 false)274; CHECK-NEXT: call void @use(i1 false)275; CHECK-NEXT: call void @use(i1 true)276; CHECK-NEXT: call void @use(i1 true)277; CHECK-NEXT: call void @use(i1 true)278; CHECK-NEXT: call void @use(i1 true)279; CHECK-NEXT: [[C_1:%.*]] = icmp eq i32 [[B]], 21280; CHECK-NEXT: call void @use(i1 [[C_1]])281; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i32 [[B]], 21282; CHECK-NEXT: call void @use(i1 [[C_2]])283; CHECK-NEXT: [[C_3:%.*]] = icmp ugt i32 [[B]], 34284; CHECK-NEXT: call void @use(i1 [[C_3]])285; CHECK-NEXT: ret void286; CHECK: false.2:287; CHECK-NEXT: call void @use(i1 false)288; CHECK-NEXT: call void @use(i1 false)289; CHECK-NEXT: call void @use(i1 true)290; CHECK-NEXT: call void @use(i1 true)291; CHECK-NEXT: [[C_4:%.*]] = icmp eq i32 [[B]], 255292; CHECK-NEXT: call void @use(i1 [[C_4]])293; CHECK-NEXT: [[C_5:%.*]] = icmp ne i32 [[B]], 275294; CHECK-NEXT: call void @use(i1 [[C_5]])295; CHECK-NEXT: ret void296; CHECK: false:297; CHECK-NEXT: ret void298;299entry:300 %a.255 = and i32 %a, 255301 %a.2 = add i32 %a.255, 20302 %bc.1 = icmp ugt i32 %b, %a.2303 br i1 %bc.1, label %true, label %false304 305true: ; %b in [21, 0)306 %bc.2 = icmp ult i32 %b, 255307 br i1 %bc.2, label %true.2, label %false.2308 309true.2: ; %b in [21, 255)310 ; Conditions below are false.311 %f.1 = icmp eq i32 %b, 0312 call void @use(i1 %f.1)313 %f.2 = icmp eq i32 %b, 20314 call void @use(i1 %f.2)315 %f.3 = icmp ult i32 %b, 20316 call void @use(i1 %f.3)317 %f.4 = icmp eq i32 %b, 255318 call void @use(i1 %f.4)319 %f.5 = icmp ugt i32 %b, 255320 call void @use(i1 %f.5)321 322 323 ; Conditions below are true.324 %t.1 = icmp ugt i32 %b, 5325 call void @use(i1 %t.1)326 %t.2 = icmp ne i32 %b, 20327 call void @use(i1 %t.2)328 %t.3 = icmp ult i32 %b, 255329 call void @use(i1 %t.3)330 %t.4 = icmp ne i32 %b, 300331 call void @use(i1 %t.4)332 333 ; Conditions below cannot be simplified.334 %c.1 = icmp eq i32 %b, 21335 call void @use(i1 %c.1)336 %c.2 = icmp ugt i32 %b, 21337 call void @use(i1 %c.2)338 %c.3 = icmp ugt i32 %b, 34339 call void @use(i1 %c.3)340 ret void341 342false.2: ;%b in [255, 0)343 ; Conditions below are false;344 %f.6 = icmp eq i32 %b, 254345 call void @use(i1 %f.6)346 %f.7 = icmp ult i32 %b, 255347 call void @use(i1 %f.7)348 349 ; Conditions below are true;350 %t.5 = icmp ne i32 %b, 254351 call void @use(i1 %t.5)352 %t.6 = icmp uge i32 %b, 255353 call void @use(i1 %t.6)354 355 ; Conditions below cannot be simplified.356 %c.4 = icmp eq i32 %b, 255357 call void @use(i1 %c.4)358 %c.5 = icmp ne i32 %b, 275359 call void @use(i1 %c.5)360 ret void361 362false:363 ret void364}365 366; Test with with nested conditions where the second conditions is more limiting than the first one.367define void @f9_nested_conds(i32 %a, i32 %b) {368; CHECK-LABEL: @f9_nested_conds(369; CHECK-NEXT: entry:370; CHECK-NEXT: [[BC_1:%.*]] = icmp ugt i32 [[B:%.*]], 10371; CHECK-NEXT: br i1 [[BC_1]], label [[TRUE:%.*]], label [[FALSE:%.*]]372; CHECK: true:373; CHECK-NEXT: call void @use(i1 false)374; CHECK-NEXT: call void @use(i1 false)375; CHECK-NEXT: call void @use(i1 true)376; CHECK-NEXT: call void @use(i1 true)377; CHECK-NEXT: [[C_1:%.*]] = icmp eq i32 [[B]], 11378; CHECK-NEXT: call void @use(i1 [[C_1]])379; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i32 [[B]], 11380; CHECK-NEXT: call void @use(i1 [[C_2]])381; CHECK-NEXT: [[BC_2:%.*]] = icmp ugt i32 [[B]], 20382; CHECK-NEXT: br i1 [[BC_2]], label [[TRUE_2:%.*]], label [[FALSE_2:%.*]]383; CHECK: true.2:384; CHECK-NEXT: call void @use(i1 false)385; CHECK-NEXT: call void @use(i1 false)386; CHECK-NEXT: call void @use(i1 true)387; CHECK-NEXT: call void @use(i1 true)388; CHECK-NEXT: [[C_3:%.*]] = icmp eq i32 [[B]], 21389; CHECK-NEXT: call void @use(i1 [[C_3]])390; CHECK-NEXT: [[C_4:%.*]] = icmp ugt i32 [[B]], 21391; CHECK-NEXT: call void @use(i1 [[C_4]])392; CHECK-NEXT: [[C_5:%.*]] = icmp ugt i32 [[B]], 34393; CHECK-NEXT: call void @use(i1 [[C_5]])394; CHECK-NEXT: ret void395; CHECK: false.2:396; CHECK-NEXT: call void @use(i1 false)397; CHECK-NEXT: call void @use(i1 false)398; CHECK-NEXT: call void @use(i1 true)399; CHECK-NEXT: call void @use(i1 true)400; CHECK-NEXT: call void @use(i1 true)401; CHECK-NEXT: call void @use(i1 true)402; CHECK-NEXT: [[C_6:%.*]] = icmp eq i32 [[B]], 11403; CHECK-NEXT: call void @use(i1 [[C_6]])404; CHECK-NEXT: [[C_7:%.*]] = icmp ne i32 [[B]], 15405; CHECK-NEXT: call void @use(i1 [[C_7]])406; CHECK-NEXT: ret void407; CHECK: false:408; CHECK-NEXT: ret void409;410entry:411 %bc.1 = icmp ugt i32 %b, 10412 br i1 %bc.1, label %true, label %false413 414true: ; %b in [11, 0)415 ; Conditions below are false.416 %f.1 = icmp eq i32 %b, 0417 call void @use(i1 %f.1)418 %f.2 = icmp eq i32 %b, 10419 call void @use(i1 %f.2)420 421 ; Conditions below are true.422 %t.1 = icmp ugt i32 %b, 5423 call void @use(i1 %t.1)424 %t.2 = icmp ne i32 %b, 10425 call void @use(i1 %t.2)426 427 ; Conditions below cannot be simplified.428 %c.1 = icmp eq i32 %b, 11429 call void @use(i1 %c.1)430 %c.2 = icmp ugt i32 %b, 11431 call void @use(i1 %c.2)432 433 %bc.2 = icmp ugt i32 %b, 20434 br i1 %bc.2, label %true.2, label %false.2435 436true.2: ; %b in [21, 0)437 ; Conditions below are false.438 %f.3 = icmp eq i32 %b, 11439 call void @use(i1 %f.3)440 %f.4 = icmp eq i32 %b, 20441 call void @use(i1 %f.4)442 443 ; Conditions below are true.444 %t.3 = icmp ugt i32 %b, 11445 call void @use(i1 %t.3)446 %t.4 = icmp ne i32 %b, 20447 call void @use(i1 %t.4)448 449 ; Conditions below cannot be simplified.450 %c.3 = icmp eq i32 %b, 21451 call void @use(i1 %c.3)452 %c.4 = icmp ugt i32 %b, 21453 call void @use(i1 %c.4)454 %c.5 = icmp ugt i32 %b, 34455 call void @use(i1 %c.5)456 ret void457 458false.2: ;%b in [11, 21)459 ; Conditions below are false;460 %f.5 = icmp eq i32 %b, 21461 call void @use(i1 %f.5)462 %f.6 = icmp ugt i32 %b, 21463 call void @use(i1 %f.6)464 %f.7 = icmp ne i32 %b, 5465 call void @use(i1 %f.7)466 467 ; Conditions below are true;468 %t.5 = icmp ne i32 %b, 21469 call void @use(i1 %t.5)470 %t.6 = icmp ult i32 %b, 21471 call void @use(i1 %t.6)472 %t.7 = icmp ne i32 %b, 5473 call void @use(i1 %t.7)474 475 ; Conditions below cannot be simplified.476 %c.6 = icmp eq i32 %b, 11477 call void @use(i1 %c.6)478 %c.7 = icmp ne i32 %b, 15479 call void @use(i1 %c.7)480 ret void481 482false:483 ret void484}485 486 487; Test with with nested conditions where the second conditions is more limiting than the first one.488define void @f10_cond_does_not_restrict_range(i32 %a, i32 %b) {489; CHECK-LABEL: @f10_cond_does_not_restrict_range(490; CHECK-NEXT: entry:491; CHECK-NEXT: [[B_255:%.*]] = and i32 [[B:%.*]], 255492; CHECK-NEXT: br label [[TRUE:%.*]]493; CHECK: true:494; CHECK-NEXT: call void @use(i1 false)495; CHECK-NEXT: call void @use(i1 false)496; CHECK-NEXT: call void @use(i1 true)497; CHECK-NEXT: call void @use(i1 true)498; CHECK-NEXT: call void @use(i1 true)499; CHECK-NEXT: call void @use(i1 true)500; CHECK-NEXT: [[C_1:%.*]] = icmp eq i32 [[B_255]], 11501; CHECK-NEXT: call void @use(i1 [[C_1]])502; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i32 [[B_255]], 30503; CHECK-NEXT: call void @use(i1 [[C_2]])504; CHECK-NEXT: ret void505;506entry:507 %b.255 = and i32 %b, 255508 %bc.1 = icmp ult i32 %b.255, 300509 br i1 %bc.1, label %true, label %false510 511true: ; %b in [0, 256)512 ; Conditions below are false.513 %f.1 = icmp eq i32 %b.255, 256514 call void @use(i1 %f.1)515 %f.2 = icmp eq i32 %b.255, 300516 call void @use(i1 %f.2)517 518 ; Conditions below are true.519 %t.1 = icmp ult i32 %b.255, 256520 call void @use(i1 %t.1)521 %t.2 = icmp ult i32 %b.255, 300522 call void @use(i1 %t.2)523 %t.3 = icmp ne i32 %b.255, 256524 call void @use(i1 %t.3)525 %t.4 = icmp ne i32 %b.255, 300526 call void @use(i1 %t.4)527 528 ; Conditions below cannot be simplified.529 %c.1 = icmp eq i32 %b.255, 11530 call void @use(i1 %c.1)531 %c.2 = icmp ugt i32 %b.255, 30532 call void @use(i1 %c.2)533 ret void534 535false:536 ret void537}538 539define void @f11_contradiction(i32 %a, i32 %b) {540; CHECK-LABEL: @f11_contradiction(541; CHECK-NEXT: entry:542; CHECK-NEXT: [[BC_1:%.*]] = icmp eq i32 [[B:%.*]], 10543; CHECK-NEXT: br i1 [[BC_1]], label [[TRUE:%.*]], label [[FALSE:%.*]]544; CHECK: true:545; CHECK-NEXT: br label [[FALSE]]546; CHECK: false:547; CHECK-NEXT: ret void548;549entry:550 %bc.1 = icmp eq i32 %b, 10551 br i1 %bc.1, label %true, label %false552 553true: ; %b in [10, 11)554 %bc.2 = icmp eq i32 %b, 20555 br i1 %bc.2, label %true.2, label %false556 557true.2:558 %f.1 = icmp eq i32 %b, 256559 call void @use(i1 %f.1)560 %f.2 = icmp ne i32 %b, 300561 call void @use(i1 %f.2)562 ret void563 564false:565 ret void566}567 568define void @f12_float(float %b) {569; CHECK-LABEL: @f12_float(570; CHECK-NEXT: entry:571; CHECK-NEXT: [[BC_1:%.*]] = fcmp olt float 1.000000e+00, [[B:%.*]]572; CHECK-NEXT: br i1 [[BC_1]], label [[TRUE:%.*]], label [[FALSE:%.*]]573; CHECK: true:574; CHECK-NEXT: call void @use(i1 false)575; CHECK-NEXT: call void @use(i1 true)576; CHECK-NEXT: ret void577; CHECK: false:578; CHECK-NEXT: ret void579;580entry:581 %a = fadd float 0.0, 1.0582 %bc.1 = fcmp olt float %a, %b583 br i1 %bc.1, label %true, label %false584 585true: ; %b in [10, 11)586 %f.1 = fcmp one float %a, 1.0587 call void @use(i1 %f.1)588 589 %t.1 = fcmp oeq float %a, 1.0590 call void @use(i1 %t.1)591 ret void592 593false:594 ret void595}596 597 598@A = global i32 17599@B = global i32 17600 601define void @f13_constexpr1() {602; CHECK-LABEL: @f13_constexpr1(603; CHECK-NEXT: entry:604; CHECK-NEXT: [[BC_1:%.*]] = icmp eq i32 add (i32 ptrtoint (ptr @A to i32), i32 10), 55605; CHECK-NEXT: br i1 [[BC_1]], label [[TRUE:%.*]], label [[FALSE:%.*]]606; CHECK: true:607; CHECK-NEXT: call void @use(i1 false)608; CHECK-NEXT: call void @use(i1 true)609; CHECK-NEXT: ret void610; CHECK: false:611; CHECK-NEXT: ret void612;613entry:614 %a = add i32 ptrtoint (ptr @A to i32), 10615 %bc.1 = icmp eq i32 %a, 55616 br i1 %bc.1, label %true, label %false617 618true: ; %b in [10, 11)619 %f.1 = icmp eq i32 %a, 10620 call void @use(i1 %f.1)621 %f.2 = icmp eq i32 %a, 55622 call void @use(i1 %f.2)623 624 ret void625 626false:627 ret void628}629 630; TODO: can we fold the compares in the true block?631define void @f14_constexpr2() {632; CHECK-LABEL: @f14_constexpr2(633; CHECK-NEXT: entry:634; CHECK-NEXT: [[BC_1:%.*]] = icmp eq i32 ptrtoint (ptr @A to i32), ptrtoint (ptr @B to i32)635; CHECK-NEXT: br i1 [[BC_1]], label [[TRUE:%.*]], label [[FALSE:%.*]]636; CHECK: true:637; CHECK-NEXT: [[F_1:%.*]] = icmp ne i32 ptrtoint (ptr @B to i32), ptrtoint (ptr @A to i32)638; CHECK-NEXT: call void @use(i1 [[F_1]])639; CHECK-NEXT: [[F_2:%.*]] = icmp eq i32 ptrtoint (ptr @B to i32), ptrtoint (ptr @A to i32)640; CHECK-NEXT: call void @use(i1 [[F_2]])641; CHECK-NEXT: ret void642; CHECK: false:643; CHECK-NEXT: ret void644;645entry:646 %a = add i32 ptrtoint (ptr @A to i32), 0647 %b = add i32 ptrtoint (ptr @B to i32), 0648 %bc.1 = icmp eq i32 %a, %b649 br i1 %bc.1, label %true, label %false650 651true: ; %b in [10, 11)652 %f.1 = icmp ne i32 %a, %b653 call void @use(i1 %f.1)654 %f.2 = icmp eq i32 %a, %b655 call void @use(i1 %f.2)656 657 ret void658 659false:660 ret void661}662 663define void @loop_1() {664; CHECK-LABEL: @loop_1(665; CHECK-NEXT: entry:666; CHECK-NEXT: br label [[FOR_COND:%.*]]667; CHECK: for.cond:668; CHECK-NEXT: [[I_0:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INC27:%.*]], [[FOR_COND_CLEANUP13:%.*]] ]669; CHECK-NEXT: [[CMP9:%.*]] = icmp sle i32 [[I_0]], 3670; CHECK-NEXT: br i1 [[CMP9]], label [[FOR_BODY:%.*]], label [[FOR_COND_CLEANUP:%.*]]671; CHECK: for.cond.cleanup:672; CHECK-NEXT: ret void673; CHECK: for.body:674; CHECK-NEXT: br label [[FOR_COND11:%.*]]675; CHECK: for.cond11:676; CHECK-NEXT: br label [[FOR_COND_CLEANUP13]]677; CHECK: for.cond.cleanup13:678; CHECK-NEXT: [[INC27]] = add nsw i32 [[I_0]], 1679; CHECK-NEXT: br label [[FOR_COND]]680;681entry:682 br label %for.cond683 684for.cond: ; preds = %for.cond.cleanup13, %if.then685 %i.0 = phi i32 [ 0, %entry ], [ %inc27, %for.cond.cleanup13 ]686 %cmp9 = icmp sle i32 %i.0, 3687 br i1 %cmp9, label %for.body, label %for.cond.cleanup688 689for.cond.cleanup: ; preds = %for.cond690 ret void691 692for.body: ; preds = %for.cond693 br label %for.cond11694 695for.cond11: ; preds = %arrayctor.cont21, %for.body696 br label %for.cond.cleanup13697 698for.cond.cleanup13: ; preds = %for.cond11699 %inc27 = add nsw i32 %i.0, 1700 br label %for.cond701}702 703 704define void @loop() {705; CHECK-LABEL: @loop(706; CHECK-NEXT: entry:707; CHECK-NEXT: br label [[FOR_COND:%.*]]708; CHECK: for.cond:709; CHECK-NEXT: [[I_0:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INC27:%.*]], [[FOR_COND_CLEANUP13:%.*]] ]710; CHECK-NEXT: [[CMP9:%.*]] = icmp sle i32 [[I_0]], 3711; CHECK-NEXT: br i1 [[CMP9]], label [[FOR_BODY:%.*]], label [[FOR_COND_CLEANUP:%.*]]712; CHECK: for.cond.cleanup:713; CHECK-NEXT: ret void714; CHECK: for.body:715; CHECK-NEXT: br label [[FOR_COND11:%.*]]716; CHECK: for.cond11:717; CHECK-NEXT: [[J_0:%.*]] = phi i32 [ 0, [[FOR_BODY]] ], [ [[INC:%.*]], [[FOR_BODY14:%.*]] ]718; CHECK-NEXT: [[CMP12:%.*]] = icmp slt i32 [[J_0]], 2719; CHECK-NEXT: br i1 [[CMP12]], label [[FOR_BODY14]], label [[FOR_COND_CLEANUP13]]720; CHECK: for.cond.cleanup13:721; CHECK-NEXT: [[INC27]] = add nsw i32 [[I_0]], 1722; CHECK-NEXT: br label [[FOR_COND]]723; CHECK: for.body14:724; CHECK-NEXT: [[INC]] = add nuw nsw i32 [[J_0]], 1725; CHECK-NEXT: br label [[FOR_COND11]]726;727entry:728 br label %for.cond729 730for.cond: ; preds = %for.cond.cleanup13, %if.then731 %i.0 = phi i32 [ 0, %entry ], [ %inc27, %for.cond.cleanup13 ]732 %cmp9 = icmp sle i32 %i.0, 3733 br i1 %cmp9, label %for.body, label %for.cond.cleanup734 735for.cond.cleanup: ; preds = %for.cond736 ret void737 738for.body: ; preds = %for.cond739 br label %for.cond11740 741for.cond11: ; preds = %arrayctor.cont21, %for.body742 %j.0 = phi i32 [ 0, %for.body ], [ %inc, %for.body14 ]743 %cmp12 = icmp slt i32 %j.0, 2744 br i1 %cmp12, label %for.body14, label %for.cond.cleanup13745 746for.cond.cleanup13: ; preds = %for.cond11747 %inc27 = add nsw i32 %i.0, 1748 br label %for.cond749 750for.body14:751 %inc = add nsw i32 %j.0, 1752 br label %for.cond11753}754 755define i32 @udiv_1(i64 %sz) {756; CHECK-LABEL: @udiv_1(757; CHECK-NEXT: entry:758; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i64 4088, [[SZ:%.*]]759; CHECK-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_END:%.*]]760; CHECK: cond.true:761; CHECK-NEXT: [[DIV:%.*]] = udiv i64 4088, [[SZ]]762; CHECK-NEXT: br label [[COND_END]]763; CHECK: cond.end:764; CHECK-NEXT: [[COND:%.*]] = phi i64 [ [[DIV]], [[COND_TRUE]] ], [ 1, [[ENTRY:%.*]] ]765; CHECK-NEXT: [[CONV:%.*]] = trunc nuw nsw i64 [[COND]] to i32766; CHECK-NEXT: ret i32 [[CONV]]767;768entry:769 %cmp = icmp ugt i64 4088, %sz770 br i1 %cmp, label %cond.true, label %cond.end771 772cond.true: ; preds = %entry773 %div = udiv i64 4088, %sz774 br label %cond.end775 776cond.end: ; preds = %entry, %cond.true777 %cond = phi i64 [ %div, %cond.true ], [ 1, %entry ]778 %conv = trunc i64 %cond to i32779 ret i32 %conv780}781 782; Same as @udiv_1, but with the condition switched.783define i32 @udiv_2(i64 %sz) {784; CHECK-LABEL: @udiv_2(785; CHECK-NEXT: entry:786; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i64 [[SZ:%.*]], 4088787; CHECK-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_END:%.*]]788; CHECK: cond.true:789; CHECK-NEXT: br label [[COND_END]]790; CHECK: cond.end:791; CHECK-NEXT: [[COND:%.*]] = phi i64 [ 0, [[COND_TRUE]] ], [ 1, [[ENTRY:%.*]] ]792; CHECK-NEXT: [[CONV:%.*]] = trunc nuw nsw i64 [[COND]] to i32793; CHECK-NEXT: ret i32 [[CONV]]794;795entry:796 %cmp = icmp ugt i64 %sz, 4088797 br i1 %cmp, label %cond.true, label %cond.end798 799cond.true: ; preds = %entry800 %div = udiv i64 4088, %sz801 br label %cond.end802 803cond.end: ; preds = %entry, %cond.true804 %cond = phi i64 [ %div, %cond.true ], [ 1, %entry ]805 %conv = trunc i64 %cond to i32806 ret i32 %conv807}808 809define void @f16_conditions_and(i32 %a, i32 %b) {810; CHECK-LABEL: @f16_conditions_and(811; CHECK-NEXT: entry:812; CHECK-NEXT: [[LT:%.*]] = icmp ult i32 [[A:%.*]], 100813; CHECK-NEXT: [[GT:%.*]] = icmp ugt i32 [[A]], 20814; CHECK-NEXT: [[BC:%.*]] = and i1 [[LT]], [[GT]]815; CHECK-NEXT: br i1 [[BC]], label [[TRUE:%.*]], label [[FALSE:%.*]]816; CHECK: true:817; CHECK-NEXT: call void @use(i1 false)818; CHECK-NEXT: call void @use(i1 false)819; CHECK-NEXT: call void @use(i1 false)820; CHECK-NEXT: call void @use(i1 true)821; CHECK-NEXT: call void @use(i1 true)822; CHECK-NEXT: [[C_1:%.*]] = icmp eq i32 [[A]], 21823; CHECK-NEXT: call void @use(i1 [[C_1]])824; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i32 [[A]], 21825; CHECK-NEXT: call void @use(i1 [[C_2]])826; CHECK-NEXT: [[C_3:%.*]] = icmp ugt i32 [[A]], 50827; CHECK-NEXT: call void @use(i1 [[C_3]])828; CHECK-NEXT: ret void829; CHECK: false:830; CHECK-NEXT: [[F_4:%.*]] = icmp eq i32 [[A]], 50831; CHECK-NEXT: call void @use(i1 [[F_4]])832; CHECK-NEXT: [[T_3:%.*]] = icmp ne i32 [[A]], 50833; CHECK-NEXT: call void @use(i1 [[T_3]])834; CHECK-NEXT: [[C_4:%.*]] = icmp eq i32 [[A]], 10835; CHECK-NEXT: call void @use(i1 [[C_4]])836; CHECK-NEXT: [[C_5:%.*]] = icmp eq i32 [[B:%.*]], 100837; CHECK-NEXT: call void @use(i1 [[C_5]])838; CHECK-NEXT: ret void839;840entry:841 %lt = icmp ult i32 %a, 100842 %gt = icmp ugt i32 %a, 20843 %bc = and i1 %lt, %gt844 br i1 %bc, label %true, label %false845 846true: ; %a in [21, 100)847 ; Conditions below are false.848 %f.1 = icmp eq i32 %a, 0849 call void @use(i1 %f.1)850 %f.2 = icmp eq i32 %a, 20851 call void @use(i1 %f.2)852 %f.3 = icmp ugt i32 %a, 100853 call void @use(i1 %f.3)854 855 ; Conditions below are true.856 %t.1 = icmp ult i32 %a, 100857 call void @use(i1 %t.1)858 %t.2 = icmp ne i32 %a, 20859 call void @use(i1 %t.2)860 861 ; Conditions below cannot be simplified.862 %c.1 = icmp eq i32 %a, 21863 call void @use(i1 %c.1)864 %c.2 = icmp ugt i32 %a, 21865 call void @use(i1 %c.2)866 %c.3 = icmp ugt i32 %a, 50867 call void @use(i1 %c.3)868 ret void869 870false:871; TODO: Currently there is no conditional range info in the false branch for branch conditions with an AND.872; %a should be in in [100, 21)873 ; Conditions below are false;874 %f.4 = icmp eq i32 %a, 50875 call void @use(i1 %f.4)876 877 ; Conditions below are true;878 %t.3 = icmp ne i32 %a, 50879 call void @use(i1 %t.3)880 881 ; Conditions below cannot be simplified.882 %c.4 = icmp eq i32 %a, 10883 call void @use(i1 %c.4)884 %c.5 = icmp eq i32 %b, 100885 call void @use(i1 %c.5)886 ret void887}888 889define void @f16_conditions_and_logical(i32 %a, i32 %b) {890; CHECK-LABEL: @f16_conditions_and_logical(891; CHECK-NEXT: entry:892; CHECK-NEXT: [[LT:%.*]] = icmp ult i32 [[A:%.*]], 100893; CHECK-NEXT: [[GT:%.*]] = icmp ugt i32 [[A]], 20894; CHECK-NEXT: [[BC:%.*]] = select i1 [[LT]], i1 [[GT]], i1 false895; CHECK-NEXT: br i1 [[BC]], label [[TRUE:%.*]], label [[FALSE:%.*]]896; CHECK: true:897; CHECK-NEXT: call void @use(i1 false)898; CHECK-NEXT: call void @use(i1 false)899; CHECK-NEXT: call void @use(i1 false)900; CHECK-NEXT: call void @use(i1 true)901; CHECK-NEXT: call void @use(i1 true)902; CHECK-NEXT: [[C_1:%.*]] = icmp eq i32 [[A]], 21903; CHECK-NEXT: call void @use(i1 [[C_1]])904; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i32 [[A]], 21905; CHECK-NEXT: call void @use(i1 [[C_2]])906; CHECK-NEXT: [[C_3:%.*]] = icmp ugt i32 [[A]], 50907; CHECK-NEXT: call void @use(i1 [[C_3]])908; CHECK-NEXT: ret void909; CHECK: false:910; CHECK-NEXT: [[F_4:%.*]] = icmp eq i32 [[A]], 50911; CHECK-NEXT: call void @use(i1 [[F_4]])912; CHECK-NEXT: [[T_3:%.*]] = icmp ne i32 [[A]], 50913; CHECK-NEXT: call void @use(i1 [[T_3]])914; CHECK-NEXT: [[C_4:%.*]] = icmp eq i32 [[A]], 10915; CHECK-NEXT: call void @use(i1 [[C_4]])916; CHECK-NEXT: [[C_5:%.*]] = icmp eq i32 [[B:%.*]], 100917; CHECK-NEXT: call void @use(i1 [[C_5]])918; CHECK-NEXT: ret void919;920entry:921 %lt = icmp ult i32 %a, 100922 %gt = icmp ugt i32 %a, 20923 %bc = select i1 %lt, i1 %gt, i1 false924 br i1 %bc, label %true, label %false925 926true: ; %a in [21, 100)927 ; Conditions below are false.928 %f.1 = icmp eq i32 %a, 0929 call void @use(i1 %f.1)930 %f.2 = icmp eq i32 %a, 20931 call void @use(i1 %f.2)932 %f.3 = icmp ugt i32 %a, 100933 call void @use(i1 %f.3)934 935 ; Conditions below are true.936 %t.1 = icmp ult i32 %a, 100937 call void @use(i1 %t.1)938 %t.2 = icmp ne i32 %a, 20939 call void @use(i1 %t.2)940 941 ; Conditions below cannot be simplified.942 %c.1 = icmp eq i32 %a, 21943 call void @use(i1 %c.1)944 %c.2 = icmp ugt i32 %a, 21945 call void @use(i1 %c.2)946 %c.3 = icmp ugt i32 %a, 50947 call void @use(i1 %c.3)948 ret void949 950false:951; TODO: Currently there is no conditional range info in the false branch for branch conditions with an AND.952; %a should be in in [100, 21)953 ; Conditions below are false;954 %f.4 = icmp eq i32 %a, 50955 call void @use(i1 %f.4)956 957 ; Conditions below are true;958 %t.3 = icmp ne i32 %a, 50959 call void @use(i1 %t.3)960 961 ; Conditions below cannot be simplified.962 %c.4 = icmp eq i32 %a, 10963 call void @use(i1 %c.4)964 %c.5 = icmp eq i32 %b, 100965 call void @use(i1 %c.5)966 ret void967}968 969define void @f17_conditions_or(i32 %a, i32 %b) {970; CHECK-LABEL: @f17_conditions_or(971; CHECK-NEXT: entry:972; CHECK-NEXT: [[GT:%.*]] = icmp uge i32 [[A:%.*]], 100973; CHECK-NEXT: [[LT:%.*]] = icmp ule i32 [[A]], 20974; CHECK-NEXT: [[BC:%.*]] = or i1 [[LT]], [[GT]]975; CHECK-NEXT: br i1 [[BC]], label [[TRUE:%.*]], label [[FALSE:%.*]]976; CHECK: false:977; CHECK-NEXT: call void @use(i1 false)978; CHECK-NEXT: call void @use(i1 false)979; CHECK-NEXT: call void @use(i1 false)980; CHECK-NEXT: call void @use(i1 true)981; CHECK-NEXT: call void @use(i1 true)982; CHECK-NEXT: [[C_1:%.*]] = icmp eq i32 [[A]], 21983; CHECK-NEXT: call void @use(i1 [[C_1]])984; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i32 [[A]], 21985; CHECK-NEXT: call void @use(i1 [[C_2]])986; CHECK-NEXT: [[C_3:%.*]] = icmp ugt i32 [[A]], 50987; CHECK-NEXT: call void @use(i1 [[C_3]])988; CHECK-NEXT: ret void989; CHECK: true:990; CHECK-NEXT: [[F_4:%.*]] = icmp eq i32 [[A]], 50991; CHECK-NEXT: call void @use(i1 [[F_4]])992; CHECK-NEXT: [[T_3:%.*]] = icmp ne i32 [[A]], 50993; CHECK-NEXT: call void @use(i1 [[T_3]])994; CHECK-NEXT: [[C_4:%.*]] = icmp eq i32 [[A]], 10995; CHECK-NEXT: call void @use(i1 [[C_4]])996; CHECK-NEXT: [[C_5:%.*]] = icmp eq i32 [[B:%.*]], 100997; CHECK-NEXT: call void @use(i1 [[C_5]])998; CHECK-NEXT: ret void999;1000entry:1001 %gt = icmp uge i32 %a, 1001002 %lt = icmp ule i32 %a, 201003 %bc = or i1 %lt, %gt1004 br i1 %bc, label %true, label %false1005 1006false: ; %a in [21, 100)1007 ; Conditions below are false.1008 %f.1 = icmp eq i32 %a, 01009 call void @use(i1 %f.1)1010 %f.2 = icmp eq i32 %a, 201011 call void @use(i1 %f.2)1012 %f.3 = icmp ugt i32 %a, 1001013 call void @use(i1 %f.3)1014 1015 ; Conditions below are true.1016 %t.1 = icmp ult i32 %a, 1001017 call void @use(i1 %t.1)1018 %t.2 = icmp ne i32 %a, 201019 call void @use(i1 %t.2)1020 1021 ; Conditions below cannot be simplified.1022 %c.1 = icmp eq i32 %a, 211023 call void @use(i1 %c.1)1024 %c.2 = icmp ugt i32 %a, 211025 call void @use(i1 %c.2)1026 %c.3 = icmp ugt i32 %a, 501027 call void @use(i1 %c.3)1028 ret void1029 1030true:1031; TODO: Currently there is no conditional range info in the false branch for branch conditions with an AND.1032; %a should be in in [100, 21)1033 ; Conditions below are false;1034 %f.4 = icmp eq i32 %a, 501035 call void @use(i1 %f.4)1036 1037 ; Conditions below are true;1038 %t.3 = icmp ne i32 %a, 501039 call void @use(i1 %t.3)1040 1041 ; Conditions below cannot be simplified.1042 %c.4 = icmp eq i32 %a, 101043 call void @use(i1 %c.4)1044 %c.5 = icmp eq i32 %b, 1001045 call void @use(i1 %c.5)1046 ret void1047}1048 1049define void @f17_conditions_or_logical(i32 %a, i32 %b) {1050; CHECK-LABEL: @f17_conditions_or_logical(1051; CHECK-NEXT: entry:1052; CHECK-NEXT: [[GT:%.*]] = icmp uge i32 [[A:%.*]], 1001053; CHECK-NEXT: [[LT:%.*]] = icmp ule i32 [[A]], 201054; CHECK-NEXT: [[BC:%.*]] = select i1 [[LT]], i1 true, i1 [[GT]]1055; CHECK-NEXT: br i1 [[BC]], label [[TRUE:%.*]], label [[FALSE:%.*]]1056; CHECK: false:1057; CHECK-NEXT: call void @use(i1 false)1058; CHECK-NEXT: call void @use(i1 false)1059; CHECK-NEXT: call void @use(i1 false)1060; CHECK-NEXT: call void @use(i1 true)1061; CHECK-NEXT: call void @use(i1 true)1062; CHECK-NEXT: [[C_1:%.*]] = icmp eq i32 [[A]], 211063; CHECK-NEXT: call void @use(i1 [[C_1]])1064; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i32 [[A]], 211065; CHECK-NEXT: call void @use(i1 [[C_2]])1066; CHECK-NEXT: [[C_3:%.*]] = icmp ugt i32 [[A]], 501067; CHECK-NEXT: call void @use(i1 [[C_3]])1068; CHECK-NEXT: ret void1069; CHECK: true:1070; CHECK-NEXT: [[F_4:%.*]] = icmp eq i32 [[A]], 501071; CHECK-NEXT: call void @use(i1 [[F_4]])1072; CHECK-NEXT: [[T_3:%.*]] = icmp ne i32 [[A]], 501073; CHECK-NEXT: call void @use(i1 [[T_3]])1074; CHECK-NEXT: [[C_4:%.*]] = icmp eq i32 [[A]], 101075; CHECK-NEXT: call void @use(i1 [[C_4]])1076; CHECK-NEXT: [[C_5:%.*]] = icmp eq i32 [[B:%.*]], 1001077; CHECK-NEXT: call void @use(i1 [[C_5]])1078; CHECK-NEXT: ret void1079;1080entry:1081 %gt = icmp uge i32 %a, 1001082 %lt = icmp ule i32 %a, 201083 %bc = select i1 %lt, i1 true, i1 %gt1084 br i1 %bc, label %true, label %false1085 1086false: ; %a in [21, 100)1087 ; Conditions below are false.1088 %f.1 = icmp eq i32 %a, 01089 call void @use(i1 %f.1)1090 %f.2 = icmp eq i32 %a, 201091 call void @use(i1 %f.2)1092 %f.3 = icmp ugt i32 %a, 1001093 call void @use(i1 %f.3)1094 1095 ; Conditions below are true.1096 %t.1 = icmp ult i32 %a, 1001097 call void @use(i1 %t.1)1098 %t.2 = icmp ne i32 %a, 201099 call void @use(i1 %t.2)1100 1101 ; Conditions below cannot be simplified.1102 %c.1 = icmp eq i32 %a, 211103 call void @use(i1 %c.1)1104 %c.2 = icmp ugt i32 %a, 211105 call void @use(i1 %c.2)1106 %c.3 = icmp ugt i32 %a, 501107 call void @use(i1 %c.3)1108 ret void1109 1110true:1111; TODO: Currently there is no conditional range info in the false branch for branch conditions with an AND.1112; %a should be in in [100, 21)1113 ; Conditions below are false;1114 %f.4 = icmp eq i32 %a, 501115 call void @use(i1 %f.4)1116 1117 ; Conditions below are true;1118 %t.3 = icmp ne i32 %a, 501119 call void @use(i1 %t.3)1120 1121 ; Conditions below cannot be simplified.1122 %c.4 = icmp eq i32 %a, 101123 call void @use(i1 %c.4)1124 %c.5 = icmp eq i32 %b, 1001125 call void @use(i1 %c.5)1126 ret void1127}1128 1129define void @f18_conditions_chained_and(i32 %a, i32 %b) {1130; CHECK-LABEL: @f18_conditions_chained_and(1131; CHECK-NEXT: entry:1132; CHECK-NEXT: [[LT:%.*]] = icmp ult i32 [[A:%.*]], 1001133; CHECK-NEXT: [[GT:%.*]] = icmp ugt i32 [[A]], 201134; CHECK-NEXT: [[BC:%.*]] = and i1 [[LT]], [[GT]]1135; CHECK-NEXT: [[B_LT:%.*]] = icmp ult i32 [[B:%.*]], 501136; CHECK-NEXT: [[BC_2:%.*]] = and i1 [[BC]], [[B_LT]]1137; CHECK-NEXT: br i1 [[BC_2]], label [[TRUE:%.*]], label [[FALSE:%.*]]1138; CHECK: true:1139; CHECK-NEXT: call void @use(i1 false)1140; CHECK-NEXT: call void @use(i1 false)1141; CHECK-NEXT: call void @use(i1 false)1142; CHECK-NEXT: call void @use(i1 false)1143; CHECK-NEXT: call void @use(i1 true)1144; CHECK-NEXT: call void @use(i1 true)1145; CHECK-NEXT: [[C_1:%.*]] = icmp eq i32 [[A]], 211146; CHECK-NEXT: call void @use(i1 [[C_1]])1147; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i32 [[A]], 211148; CHECK-NEXT: call void @use(i1 [[C_2]])1149; CHECK-NEXT: [[C_3:%.*]] = icmp ugt i32 [[A]], 501150; CHECK-NEXT: call void @use(i1 [[C_3]])1151; CHECK-NEXT: [[C_4:%.*]] = icmp eq i32 [[B]], 01152; CHECK-NEXT: call void @use(i1 [[C_4]])1153; CHECK-NEXT: [[C_5:%.*]] = icmp eq i32 [[B]], 201154; CHECK-NEXT: call void @use(i1 [[C_5]])1155; CHECK-NEXT: ret void1156; CHECK: false:1157; CHECK-NEXT: [[F_5:%.*]] = icmp eq i32 [[A]], 501158; CHECK-NEXT: call void @use(i1 [[F_5]])1159; CHECK-NEXT: [[T_3:%.*]] = icmp ne i32 [[A]], 501160; CHECK-NEXT: call void @use(i1 [[T_3]])1161; CHECK-NEXT: [[C_6:%.*]] = icmp eq i32 [[A]], 101162; CHECK-NEXT: call void @use(i1 [[C_6]])1163; CHECK-NEXT: [[C_7:%.*]] = icmp eq i32 [[B]], 1001164; CHECK-NEXT: call void @use(i1 [[C_7]])1165; CHECK-NEXT: ret void1166;1167entry:1168 %lt = icmp ult i32 %a, 1001169 %gt = icmp ugt i32 %a, 201170 %bc = and i1 %lt, %gt1171 %b.lt = icmp ult i32 %b, 501172 %bc.2 = and i1 %bc, %b.lt1173 br i1 %bc.2, label %true, label %false1174 1175true: ; %a in [21, 100)1176 ; Conditions below are false.1177 %f.1 = icmp eq i32 %a, 01178 call void @use(i1 %f.1)1179 %f.2 = icmp eq i32 %a, 201180 call void @use(i1 %f.2)1181 %f.3 = icmp ugt i32 %a, 1001182 call void @use(i1 %f.3)1183 %f.4 = icmp ugt i32 %b, 1001184 call void @use(i1 %f.4)1185 1186 1187 ; Conditions below are true.1188 %t.1 = icmp ult i32 %a, 1001189 call void @use(i1 %t.1)1190 %t.2 = icmp ne i32 %a, 201191 call void @use(i1 %t.2)1192 1193 ; Conditions below cannot be simplified.1194 %c.1 = icmp eq i32 %a, 211195 call void @use(i1 %c.1)1196 %c.2 = icmp ugt i32 %a, 211197 call void @use(i1 %c.2)1198 %c.3 = icmp ugt i32 %a, 501199 call void @use(i1 %c.3)1200 %c.4 = icmp eq i32 %b, 01201 call void @use(i1 %c.4)1202 %c.5 = icmp eq i32 %b, 201203 call void @use(i1 %c.5)1204 ret void1205 1206false:1207 ; Conditions below are false;1208 %f.5 = icmp eq i32 %a, 501209 call void @use(i1 %f.5)1210 1211 ; Conditions below are true;1212 %t.3 = icmp ne i32 %a, 501213 call void @use(i1 %t.3)1214 1215 ; Conditions below cannot be simplified.1216 %c.6 = icmp eq i32 %a, 101217 call void @use(i1 %c.6)1218 %c.7 = icmp eq i32 %b, 1001219 call void @use(i1 %c.7)1220 ret void1221}1222 1223define void @f19_conditions_chained_and_nested_and(i32 %a, i32 %b) {1224; CHECK-LABEL: @f19_conditions_chained_and_nested_and(1225; CHECK-NEXT: entry:1226; CHECK-NEXT: [[LT_A:%.*]] = icmp ult i32 [[A:%.*]], 1001227; CHECK-NEXT: [[LT_B:%.*]] = icmp ult i32 [[B:%.*]], 10001228; CHECK-NEXT: [[BC:%.*]] = and i1 [[LT_A]], [[LT_B]]1229; CHECK-NEXT: br i1 [[BC]], label [[TRUE:%.*]], label [[FALSE:%.*]]1230; CHECK: true:1231; CHECK-NEXT: [[GT_A:%.*]] = icmp ugt i32 [[A]], 301232; CHECK-NEXT: [[GT_B:%.*]] = icmp ugt i32 [[B]], 3001233; CHECK-NEXT: [[BC_2:%.*]] = and i1 [[GT_A]], [[GT_B]]1234; CHECK-NEXT: br i1 [[BC_2]], label [[TRUE_2:%.*]], label [[FALSE]]1235; CHECK: true.2:1236; CHECK-NEXT: call void @use(i1 false)1237; CHECK-NEXT: call void @use(i1 false)1238; CHECK-NEXT: call void @use(i1 false)1239; CHECK-NEXT: call void @use(i1 false)1240; CHECK-NEXT: call void @use(i1 false)1241; CHECK-NEXT: call void @use(i1 false)1242; CHECK-NEXT: call void @use(i1 true)1243; CHECK-NEXT: call void @use(i1 true)1244; CHECK-NEXT: call void @use(i1 true)1245; CHECK-NEXT: call void @use(i1 true)1246; CHECK-NEXT: [[C_1:%.*]] = icmp eq i32 [[A]], 311247; CHECK-NEXT: call void @use(i1 [[C_1]])1248; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i32 [[A]], 311249; CHECK-NEXT: call void @use(i1 [[C_2]])1250; CHECK-NEXT: [[C_3:%.*]] = icmp ugt i32 [[A]], 501251; CHECK-NEXT: call void @use(i1 [[C_3]])1252; CHECK-NEXT: [[C_4:%.*]] = icmp eq i32 [[B]], 3011253; CHECK-NEXT: call void @use(i1 [[C_4]])1254; CHECK-NEXT: [[C_5:%.*]] = icmp ugt i32 [[B]], 3011255; CHECK-NEXT: call void @use(i1 [[C_5]])1256; CHECK-NEXT: [[C_6:%.*]] = icmp ugt i32 [[B]], 5001257; CHECK-NEXT: call void @use(i1 [[C_6]])1258; CHECK-NEXT: ret void1259; CHECK: false:1260; CHECK-NEXT: ret void1261;1262entry:1263 %lt.a = icmp ult i32 %a, 1001264 %lt.b = icmp ult i32 %b, 10001265 %bc = and i1 %lt.a, %lt.b1266 br i1 %bc, label %true, label %false1267 1268true:1269 %gt.a = icmp ugt i32 %a, 301270 %gt.b = icmp ugt i32 %b, 3001271 %bc.2 = and i1 %gt.a, %gt.b1272 br i1 %bc.2, label %true.2, label %false1273 1274true.2:1275 ; Conditions below are false.1276 %f.1 = icmp eq i32 %a, 01277 call void @use(i1 %f.1)1278 %f.2 = icmp eq i32 %a, 201279 call void @use(i1 %f.2)1280 %f.3 = icmp ugt i32 %a, 1001281 call void @use(i1 %f.3)1282 %f.4 = icmp eq i32 %b, 01283 call void @use(i1 %f.4)1284 %f.5 = icmp eq i32 %b, 3001285 call void @use(i1 %f.5)1286 %f.6 = icmp ugt i32 %b, 10001287 call void @use(i1 %f.6)1288 1289 1290 ; Conditions below are true.1291 %t.1 = icmp ult i32 %a, 1001292 call void @use(i1 %t.1)1293 %t.2 = icmp ne i32 %a, 201294 call void @use(i1 %t.2)1295 %t.3 = icmp ult i32 %b, 10001296 call void @use(i1 %t.3)1297 %t.4 = icmp ne i32 %b, 3001298 call void @use(i1 %t.4)1299 1300 1301 ; Conditions below cannot be simplified.1302 %c.1 = icmp eq i32 %a, 311303 call void @use(i1 %c.1)1304 %c.2 = icmp ugt i32 %a, 311305 call void @use(i1 %c.2)1306 %c.3 = icmp ugt i32 %a, 501307 call void @use(i1 %c.3)1308 %c.4 = icmp eq i32 %b, 3011309 call void @use(i1 %c.4)1310 %c.5 = icmp ugt i32 %b, 3011311 call void @use(i1 %c.5)1312 %c.6 = icmp ugt i32 %b, 5001313 call void @use(i1 %c.6)1314 1315 ret void1316 1317false:1318 ret void1319}1320 1321declare i64 @get_i64()1322 1323declare i1 @cond()1324 1325define void @f20_ne_0_nuked_by_and(i32 %arg) local_unnamed_addr #0 {1326; CHECK-LABEL: @f20_ne_0_nuked_by_and(1327; CHECK-NEXT: bb11:1328; CHECK-NEXT: br label [[BB122:%.*]]1329; CHECK: bb122:1330; CHECK-NEXT: [[TMP123:%.*]] = phi i32 [ 256, [[BB11:%.*]] ], [ [[TMP136:%.*]], [[BB135:%.*]] ]1331; CHECK-NEXT: [[TMP127:%.*]] = call i64 @get_i64()1332; CHECK-NEXT: [[TMP128:%.*]] = trunc i64 [[TMP127]] to i321333; CHECK-NEXT: [[TMP131:%.*]] = icmp ne i32 [[TMP128]], 01334; CHECK-NEXT: [[TMP132:%.*]] = icmp sgt i32 [[TMP123]], [[TMP128]]1335; CHECK-NEXT: [[TMP133:%.*]] = and i1 [[TMP131]], [[TMP132]]1336; CHECK-NEXT: br i1 [[TMP133]], label [[BB134:%.*]], label [[BB135]]1337; CHECK: bb134:1338; CHECK-NEXT: br label [[BB135]]1339; CHECK: bb135:1340; CHECK-NEXT: [[TMP136]] = phi i32 [ [[TMP123]], [[BB122]] ], [ [[TMP128]], [[BB134]] ]1341; CHECK-NEXT: [[BC:%.*]] = call i1 @cond()1342; CHECK-NEXT: br i1 [[BC]], label [[BB139:%.*]], label [[BB122]]1343; CHECK: bb139:1344; CHECK-NEXT: call void @use(i1 false)1345; CHECK-NEXT: ret void1346;1347bb11: ; preds = %bb11348 br label %bb1221349 1350bb122: ; preds = %bb135, %bb1201351 %tmp123 = phi i32 [ 256, %bb11 ], [ %tmp136, %bb135 ]1352 %tmp127 = call i64 @get_i64()1353 %tmp128 = trunc i64 %tmp127 to i321354 %tmp131 = icmp ne i32 %tmp128, 01355 %tmp132 = icmp sgt i32 %tmp123, %tmp1281356 %tmp133 = and i1 %tmp131, %tmp1321357 br i1 %tmp133, label %bb134, label %bb1351358 1359bb134: ; preds = %bb1221360 br label %bb1351361 1362bb135: ; preds = %bb134, %bb1221363 %tmp136 = phi i32 [ %tmp123, %bb122 ], [ %tmp128, %bb134 ]1364 %bc = call i1 @cond()1365 br i1 %bc, label %bb139, label %bb1221366 1367bb139: ; preds = %bb1351368 %tmp140 = icmp eq i32 %tmp136, 01369 call void @use(i1 %tmp140)1370 ret void1371 1372bb142: ; preds = %bb1391373 ret void1374}1375 1376define i32 @equal_not_constant(ptr noundef %p, ptr noundef %q) {1377; CHECK-LABEL: @equal_not_constant(1378; CHECK-NEXT: entry:1379; CHECK-NEXT: [[CMP:%.*]] = icmp ne ptr [[P:%.*]], null1380; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]1381; CHECK: if.then:1382; CHECK-NEXT: [[CMP_THEN:%.*]] = icmp eq ptr [[P]], [[Q:%.*]]1383; CHECK-NEXT: br i1 [[CMP_THEN]], label [[IF_THEN1:%.*]], label [[IF_END]]1384; CHECK: if.then1:1385; CHECK-NEXT: call void @use(i1 true)1386; CHECK-NEXT: br label [[IF_END]]1387; CHECK: if.end:1388; CHECK-NEXT: ret i32 01389;1390entry:1391 %cmp = icmp ne ptr %p, null1392 br i1 %cmp, label %if.then, label %if.end1393 1394if.then: ; preds = %entry1395 %cmp.then = icmp eq ptr %p, %q1396 br i1 %cmp.then, label %if.then1, label %if.end1397 1398if.then1: ; preds = %if.then1399 %cmp.then1 = icmp ne ptr %q, null1400 call void @use(i1 %cmp.then1)1401 br label %if.end1402 1403if.end:1404 ret i32 01405}1406 1407define i32 @not_equal_not_constant(ptr noundef %p, ptr noundef %q) {1408; CHECK-LABEL: @not_equal_not_constant(1409; CHECK-NEXT: entry:1410; CHECK-NEXT: [[CMP:%.*]] = icmp ne ptr [[P:%.*]], null1411; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]1412; CHECK: if.then:1413; CHECK-NEXT: [[CMP_THEN:%.*]] = icmp ne ptr [[P]], [[Q:%.*]]1414; CHECK-NEXT: br i1 [[CMP_THEN]], label [[IF_THEN1:%.*]], label [[IF_END]]1415; CHECK: if.then1:1416; CHECK-NEXT: [[CMP_THEN1:%.*]] = icmp ne ptr [[Q]], null1417; CHECK-NEXT: call void @use(i1 [[CMP_THEN1]])1418; CHECK-NEXT: br label [[IF_END]]1419; CHECK: if.end:1420; CHECK-NEXT: ret i32 01421;1422entry:1423 %cmp = icmp ne ptr %p, null1424 br i1 %cmp, label %if.then, label %if.end1425 1426if.then: ; preds = %entry1427 %cmp.then = icmp ne ptr %p, %q1428 br i1 %cmp.then, label %if.then1, label %if.end1429 1430if.then1: ; preds = %if.then1431 %cmp.then1 = icmp ne ptr %q, null1432 call void @use(i1 %cmp.then1)1433 br label %if.end1434 1435if.end:1436 ret i32 01437}1438 1439define void @trunc_nuw_i1_dominating_icmp_ne_0(i8 %x) {1440; CHECK-LABEL: @trunc_nuw_i1_dominating_icmp_ne_0(1441; CHECK-NEXT: [[ICMP:%.*]] = icmp ne i8 [[X:%.*]], 01442; CHECK-NEXT: br i1 [[ICMP]], label [[BB1:%.*]], label [[BB2:%.*]]1443; CHECK: bb1:1444; CHECK-NEXT: call void @use(i1 true)1445; CHECK-NEXT: ret void1446; CHECK: bb2:1447; CHECK-NEXT: ret void1448;1449 %icmp = icmp ne i8 %x, 01450 br i1 %icmp, label %bb1, label %bb21451bb1:1452 %c1 = trunc nuw i8 %x to i11453 call void @use(i1 %c1)1454 ret void1455bb2:1456 ret void1457}1458 1459define void @neg_trunc_i1_dominating_icmp_ne_0(i8 %x) {1460; CHECK-LABEL: @neg_trunc_i1_dominating_icmp_ne_0(1461; CHECK-NEXT: [[ICMP:%.*]] = icmp ne i8 [[X:%.*]], 01462; CHECK-NEXT: br i1 [[ICMP]], label [[BB1:%.*]], label [[BB2:%.*]]1463; CHECK: bb1:1464; CHECK-NEXT: [[C1:%.*]] = trunc i8 [[X]] to i11465; CHECK-NEXT: call void @use(i1 [[C1]])1466; CHECK-NEXT: ret void1467; CHECK: bb2:1468; CHECK-NEXT: ret void1469;1470 %icmp = icmp ne i8 %x, 01471 br i1 %icmp, label %bb1, label %bb21472bb1:1473 %c1 = trunc i8 %x to i11474 call void @use(i1 %c1)1475 ret void1476bb2:1477 ret void1478}1479 1480define i1 @ptr_icmp_data_layout() {1481; CHECK-LABEL: @ptr_icmp_data_layout(1482; CHECK-NEXT: ret i1 false1483;1484 %a.end = getelementptr i32, ptr @A, i64 11485 %cmp = icmp eq ptr %a.end, @A1486 ret i1 %cmp1487}1488 1489define void @trunc_nuw_1_dominating_icmp_ne_0(i8 %x) {1490; CHECK-LABEL: @trunc_nuw_1_dominating_icmp_ne_0(1491; CHECK-NEXT: [[TRUNC:%.*]] = trunc nuw i8 [[X:%.*]] to i11492; CHECK-NEXT: br i1 [[TRUNC]], label [[BB1:%.*]], label [[BB2:%.*]]1493; CHECK: bb1:1494; CHECK-NEXT: call void @use(i1 true)1495; CHECK-NEXT: call void @use(i1 true)1496; CHECK-NEXT: ret void1497; CHECK: bb2:1498; CHECK-NEXT: call void @use(i1 false)1499; CHECK-NEXT: call void @use(i1 false)1500; CHECK-NEXT: ret void1501;1502 %trunc = trunc nuw i8 %x to i11503 br i1 %trunc, label %bb1, label %bb21504bb1:1505 %c1 = icmp ne i8 %x , 01506 call void @use(i1 %c1)1507 %c2 = icmp ne i8 0, %x1508 call void @use(i1 %c2)1509 ret void1510bb2:1511 %c3 = icmp ne i8 %x , 01512 call void @use(i1 %c3)1513 %c4 = icmp ne i8 0, %x1514 call void @use(i1 %c4)1515 ret void1516}1517 1518define void @neg_trunc_1_dominating_icmp_ne_0(i8 %x) {1519; CHECK-LABEL: @neg_trunc_1_dominating_icmp_ne_0(1520; CHECK-NEXT: [[TRUNC:%.*]] = trunc i8 [[X:%.*]] to i11521; CHECK-NEXT: br i1 [[TRUNC]], label [[BB1:%.*]], label [[BB2:%.*]]1522; CHECK: bb1:1523; CHECK-NEXT: [[C1:%.*]] = icmp ne i8 [[X]], 01524; CHECK-NEXT: call void @use(i1 [[C1]])1525; CHECK-NEXT: [[C2:%.*]] = icmp ne i8 0, [[X]]1526; CHECK-NEXT: call void @use(i1 [[C2]])1527; CHECK-NEXT: ret void1528; CHECK: bb2:1529; CHECK-NEXT: [[C3:%.*]] = icmp ne i8 [[X]], 01530; CHECK-NEXT: call void @use(i1 [[C3]])1531; CHECK-NEXT: [[C4:%.*]] = icmp ne i8 0, [[X]]1532; CHECK-NEXT: call void @use(i1 [[C4]])1533; CHECK-NEXT: ret void1534;1535 %trunc = trunc i8 %x to i11536 br i1 %trunc, label %bb1, label %bb21537bb1:1538 %c1 = icmp ne i8 %x , 01539 call void @use(i1 %c1)1540 %c2 = icmp ne i8 0, %x1541 call void @use(i1 %c2)1542 ret void1543bb2:1544 %c3 = icmp ne i8 %x , 01545 call void @use(i1 %c3)1546 %c4 = icmp ne i8 0, %x1547 call void @use(i1 %c4)1548 ret void1549}1550 1551define i1 @and_predicate_dominating_phi(i32 %x) {1552; CHECK-LABEL: @and_predicate_dominating_phi(1553; CHECK-NEXT: entry:1554; CHECK-NEXT: [[XGE1:%.*]] = icmp uge i32 [[X:%.*]], 11555; CHECK-NEXT: [[XLT2:%.*]] = icmp ult i32 [[X]], 21556; CHECK-NEXT: [[AND:%.*]] = and i1 [[XGE1]], [[XLT2]]1557; CHECK-NEXT: br i1 [[AND]], label [[PHI:%.*]], label [[NOPE:%.*]]1558; CHECK: nope:1559; CHECK-NEXT: br label [[PHI]]1560; CHECK: phi:1561; CHECK-NEXT: ret i1 true1562;1563entry:1564 %xge1 = icmp uge i32 %x, 11565 %xlt2 = icmp ult i32 %x, 21566 %and = and i1 %xge1, %xlt21567 br i1 %and, label %phi, label %nope1568nope:1569 br label %phi1570phi:1571 %res = phi i32 [ %x, %entry ], [ 1, %nope ]1572 %ret = icmp uge i32 %res, 11573 ret i1 %ret1574}1575