brintos

brintos / llvm-project-archived public Read only

0
0
Text · 46.9 KiB · f793814 Raw
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