brintos

brintos / llvm-project-archived public Read only

0
0
Text · 18.6 KiB · 7a2cc35 Raw
529 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s3 4target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"5 6 7declare void @use(ptr)8declare i1 @cond()9 10define void @test_monotonic_ptr_iv_inc_1_eq_to_uge(ptr %start) {11; CHECK-LABEL: @test_monotonic_ptr_iv_inc_1_eq_to_uge(12; CHECK-NEXT:  loop.ph:13; CHECK-NEXT:    [[UPPER:%.*]] = getelementptr inbounds i32, ptr [[START:%.*]], i16 1014; CHECK-NEXT:    br label [[LOOP_HEADER:%.*]]15; CHECK:       loop.header:16; CHECK-NEXT:    [[PTR_IV:%.*]] = phi ptr [ [[START]], [[LOOP_PH:%.*]] ], [ [[PTR_IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]17; CHECK-NEXT:    [[C:%.*]] = icmp eq ptr [[PTR_IV]], [[UPPER]]18; CHECK-NEXT:    br i1 [[C]], label [[EXIT:%.*]], label [[FOR_BODY:%.*]]19; CHECK:       for.body:20; CHECK-NEXT:    [[AND:%.*]] = and i1 true, true21; CHECK-NEXT:    br i1 [[AND]], label [[LOOP_LATCH]], label [[EXIT]]22; CHECK:       loop.latch:23; CHECK-NEXT:    call void @use(ptr [[PTR_IV]])24; CHECK-NEXT:    [[PTR_IV_NEXT]] = getelementptr inbounds i32, ptr [[PTR_IV]], i16 125; CHECK-NEXT:    br label [[LOOP_HEADER]]26; CHECK:       exit:27; CHECK-NEXT:    ret void28;29loop.ph:30  %upper = getelementptr inbounds i32, ptr %start, i16 1031  br label %loop.header32 33loop.header:34  %ptr.iv = phi ptr [ %start, %loop.ph ], [ %ptr.iv.next, %loop.latch ]35  %c = icmp eq ptr %ptr.iv, %upper36  br i1 %c, label %exit, label %for.body37 38for.body:39  %t.1 = icmp uge ptr %ptr.iv, %start40  %t.2 = icmp ult ptr %ptr.iv, %upper41  %and = and i1 %t.1, %t.242  br i1 %and, label %loop.latch, label %exit43 44loop.latch:45  call void @use(ptr %ptr.iv)46  %ptr.iv.next = getelementptr inbounds i32, ptr %ptr.iv, i16 147  br label %loop.header48 49exit:50  ret void51}52 53define void @test_monotonic_ptr_iv_inc_1_upper_is_multiple_1(ptr %start) {54; CHECK-LABEL: @test_monotonic_ptr_iv_inc_1_upper_is_multiple_1(55; CHECK-NEXT:  loop.ph:56; CHECK-NEXT:    [[UPPER:%.*]] = getelementptr inbounds i8, ptr [[START:%.*]], i16 1557; CHECK-NEXT:    br label [[LOOP_HEADER:%.*]]58; CHECK:       loop.header:59; CHECK-NEXT:    [[PTR_IV:%.*]] = phi ptr [ [[START]], [[LOOP_PH:%.*]] ], [ [[PTR_IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]60; CHECK-NEXT:    [[C:%.*]] = icmp eq ptr [[PTR_IV]], [[UPPER]]61; CHECK-NEXT:    br i1 [[C]], label [[EXIT:%.*]], label [[FOR_BODY:%.*]]62; CHECK:       for.body:63; CHECK-NEXT:    [[AND:%.*]] = and i1 true, true64; CHECK-NEXT:    br i1 [[AND]], label [[LOOP_LATCH]], label [[EXIT]]65; CHECK:       loop.latch:66; CHECK-NEXT:    call void @use(ptr [[PTR_IV]])67; CHECK-NEXT:    [[PTR_IV_NEXT]] = getelementptr inbounds i8, ptr [[PTR_IV]], i16 168; CHECK-NEXT:    br label [[LOOP_HEADER]]69; CHECK:       exit:70; CHECK-NEXT:    ret void71;72loop.ph:73  %upper = getelementptr inbounds i8, ptr %start, i16 1574  br label %loop.header75 76loop.header:77  %ptr.iv = phi ptr [ %start, %loop.ph ], [ %ptr.iv.next, %loop.latch ]78  %c = icmp eq ptr %ptr.iv, %upper79  br i1 %c, label %exit, label %for.body80 81for.body:82  %t.1 = icmp uge ptr %ptr.iv, %start83  %t.2 = icmp ult ptr %ptr.iv, %upper84  %and = and i1 %t.1, %t.285  br i1 %and, label %loop.latch, label %exit86 87loop.latch:88  call void @use(ptr %ptr.iv)89  %ptr.iv.next = getelementptr inbounds i8, ptr %ptr.iv, i16 190  br label %loop.header91 92exit:93  ret void94}95 96define void @test_monotonic_ptr_iv_inc_1_upper_is_multiple_2(ptr %start) {97; CHECK-LABEL: @test_monotonic_ptr_iv_inc_1_upper_is_multiple_2(98; CHECK-NEXT:  loop.ph:99; CHECK-NEXT:    [[UPPER:%.*]] = getelementptr inbounds i8, ptr [[START:%.*]], i16 16100; CHECK-NEXT:    br label [[LOOP_HEADER:%.*]]101; CHECK:       loop.header:102; CHECK-NEXT:    [[PTR_IV:%.*]] = phi ptr [ [[START]], [[LOOP_PH:%.*]] ], [ [[PTR_IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]103; CHECK-NEXT:    [[C:%.*]] = icmp eq ptr [[PTR_IV]], [[UPPER]]104; CHECK-NEXT:    br i1 [[C]], label [[EXIT:%.*]], label [[FOR_BODY:%.*]]105; CHECK:       for.body:106; CHECK-NEXT:    [[AND:%.*]] = and i1 true, true107; CHECK-NEXT:    br i1 [[AND]], label [[LOOP_LATCH]], label [[EXIT]]108; CHECK:       loop.latch:109; CHECK-NEXT:    call void @use(ptr [[PTR_IV]])110; CHECK-NEXT:    [[PTR_IV_NEXT]] = getelementptr inbounds i16, ptr [[PTR_IV]], i16 1111; CHECK-NEXT:    br label [[LOOP_HEADER]]112; CHECK:       exit:113; CHECK-NEXT:    ret void114;115loop.ph:116  %upper = getelementptr inbounds i8, ptr %start, i16 16117  br label %loop.header118 119loop.header:120  %ptr.iv = phi ptr [ %start, %loop.ph ], [ %ptr.iv.next, %loop.latch ]121  %c = icmp eq ptr %ptr.iv, %upper122  br i1 %c, label %exit, label %for.body123 124for.body:125  %t.1 = icmp uge ptr %ptr.iv, %start126  %t.2 = icmp ult ptr %ptr.iv, %upper127  %and = and i1 %t.1, %t.2128  br i1 %and, label %loop.latch, label %exit129 130loop.latch:131  call void @use(ptr %ptr.iv)132  %ptr.iv.next = getelementptr inbounds i16, ptr %ptr.iv, i16 1133  br label %loop.header134 135exit:136  ret void137}138 139define void @test_monotonic_ptr_iv_inc_upper_is_not_multiple_1(ptr %start) {140; CHECK-LABEL: @test_monotonic_ptr_iv_inc_upper_is_not_multiple_1(141; CHECK-NEXT:  loop.ph:142; CHECK-NEXT:    [[UPPER:%.*]] = getelementptr inbounds i8, ptr [[START:%.*]], i16 15143; CHECK-NEXT:    br label [[LOOP_HEADER:%.*]]144; CHECK:       loop.header:145; CHECK-NEXT:    [[PTR_IV:%.*]] = phi ptr [ [[START]], [[LOOP_PH:%.*]] ], [ [[PTR_IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]146; CHECK-NEXT:    [[C:%.*]] = icmp eq ptr [[PTR_IV]], [[UPPER]]147; CHECK-NEXT:    br i1 [[C]], label [[EXIT:%.*]], label [[FOR_BODY:%.*]]148; CHECK:       for.body:149; CHECK-NEXT:    [[T_2:%.*]] = icmp ult ptr [[PTR_IV]], [[UPPER]]150; CHECK-NEXT:    [[AND:%.*]] = and i1 true, [[T_2]]151; CHECK-NEXT:    br i1 [[AND]], label [[LOOP_LATCH]], label [[EXIT]]152; CHECK:       loop.latch:153; CHECK-NEXT:    call void @use(ptr [[PTR_IV]])154; CHECK-NEXT:    [[PTR_IV_NEXT]] = getelementptr inbounds i32, ptr [[PTR_IV]], i16 1155; CHECK-NEXT:    br label [[LOOP_HEADER]]156; CHECK:       exit:157; CHECK-NEXT:    ret void158;159loop.ph:160  %upper = getelementptr inbounds i8, ptr %start, i16 15161  br label %loop.header162 163loop.header:164  %ptr.iv = phi ptr [ %start, %loop.ph ], [ %ptr.iv.next, %loop.latch ]165  %c = icmp eq ptr %ptr.iv, %upper166  br i1 %c, label %exit, label %for.body167 168for.body:169  %t.1 = icmp uge ptr %ptr.iv, %start170  %t.2 = icmp ult ptr %ptr.iv, %upper171  %and = and i1 %t.1, %t.2172  br i1 %and, label %loop.latch, label %exit173 174loop.latch:175  call void @use(ptr %ptr.iv)176  %ptr.iv.next = getelementptr inbounds i32, ptr %ptr.iv, i16 1177  br label %loop.header178 179exit:180  ret void181}182 183define void @test_monotonic_ptr_iv_inc_upper_is_not_multiple_2(ptr %start) {184; CHECK-LABEL: @test_monotonic_ptr_iv_inc_upper_is_not_multiple_2(185; CHECK-NEXT:  loop.ph:186; CHECK-NEXT:    [[UPPER:%.*]] = getelementptr inbounds i8, ptr [[START:%.*]], i16 15187; CHECK-NEXT:    br label [[LOOP_HEADER:%.*]]188; CHECK:       loop.header:189; CHECK-NEXT:    [[PTR_IV:%.*]] = phi ptr [ [[START]], [[LOOP_PH:%.*]] ], [ [[PTR_IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]190; CHECK-NEXT:    [[C:%.*]] = icmp eq ptr [[PTR_IV]], [[UPPER]]191; CHECK-NEXT:    br i1 [[C]], label [[EXIT:%.*]], label [[FOR_BODY:%.*]]192; CHECK:       for.body:193; CHECK-NEXT:    [[T_2:%.*]] = icmp ult ptr [[PTR_IV]], [[UPPER]]194; CHECK-NEXT:    [[AND:%.*]] = and i1 true, [[T_2]]195; CHECK-NEXT:    br i1 [[AND]], label [[LOOP_LATCH]], label [[EXIT]]196; CHECK:       loop.latch:197; CHECK-NEXT:    call void @use(ptr [[PTR_IV]])198; CHECK-NEXT:    [[PTR_IV_NEXT]] = getelementptr inbounds i32, ptr [[PTR_IV]], i16 1199; CHECK-NEXT:    br label [[LOOP_HEADER]]200; CHECK:       exit:201; CHECK-NEXT:    ret void202;203loop.ph:204  %upper = getelementptr inbounds i8, ptr %start, i16 15205  br label %loop.header206 207loop.header:208  %ptr.iv = phi ptr [ %start, %loop.ph ], [ %ptr.iv.next, %loop.latch ]209  %c = icmp eq ptr %ptr.iv, %upper210  br i1 %c, label %exit, label %for.body211 212for.body:213  %t.1 = icmp uge ptr %ptr.iv, %start214  %t.2 = icmp ult ptr %ptr.iv, %upper215  %and = and i1 %t.1, %t.2216  br i1 %and, label %loop.latch, label %exit217 218loop.latch:219  call void @use(ptr %ptr.iv)220  %ptr.iv.next = getelementptr inbounds i32, ptr %ptr.iv, i16 1221  br label %loop.header222 223exit:224  ret void225}226 227define void @test_monotonic_ptr_iv_inc_1_upper_is_multiple_with_early_exit_1(ptr %start) {228; CHECK-LABEL: @test_monotonic_ptr_iv_inc_1_upper_is_multiple_with_early_exit_1(229; CHECK-NEXT:  loop.ph:230; CHECK-NEXT:    [[UPPER:%.*]] = getelementptr inbounds i8, ptr [[START:%.*]], i16 10231; CHECK-NEXT:    br label [[LOOP_HEADER:%.*]]232; CHECK:       loop.header:233; CHECK-NEXT:    [[PTR_IV:%.*]] = phi ptr [ [[START]], [[LOOP_PH:%.*]] ], [ [[PTR_IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]234; CHECK-NEXT:    [[C:%.*]] = icmp eq ptr [[PTR_IV]], [[UPPER]]235; CHECK-NEXT:    br i1 [[C]], label [[EXIT:%.*]], label [[FOR_BODY:%.*]]236; CHECK:       for.body:237; CHECK-NEXT:    [[C_1:%.*]] = call i1 @cond()238; CHECK-NEXT:    br i1 [[C_1]], label [[LOOP_NEXT:%.*]], label [[EXIT]]239; CHECK:       loop.next:240; CHECK-NEXT:    [[AND:%.*]] = and i1 true, true241; CHECK-NEXT:    br i1 [[AND]], label [[LOOP_LATCH]], label [[EXIT]]242; CHECK:       loop.latch:243; CHECK-NEXT:    call void @use(ptr [[PTR_IV]])244; CHECK-NEXT:    [[PTR_IV_NEXT]] = getelementptr inbounds i8, ptr [[PTR_IV]], i16 1245; CHECK-NEXT:    br label [[LOOP_HEADER]]246; CHECK:       exit:247; CHECK-NEXT:    ret void248;249loop.ph:250  %upper = getelementptr inbounds i8, ptr %start, i16 10251  br label %loop.header252 253loop.header:254  %ptr.iv = phi ptr [ %start, %loop.ph ], [ %ptr.iv.next, %loop.latch ]255  %c = icmp eq ptr %ptr.iv, %upper256  br i1 %c, label %exit, label %for.body257 258for.body:259  %c.1 = call i1 @cond()260  br i1 %c.1, label %loop.next, label %exit261 262loop.next:263  %t.1 = icmp uge ptr %ptr.iv, %start264  %t.2 = icmp ult ptr %ptr.iv, %upper265  %and = and i1 %t.1, %t.2266  br i1 %and, label %loop.latch, label %exit267 268loop.latch:269  call void @use(ptr %ptr.iv)270  %ptr.iv.next = getelementptr inbounds i8, ptr %ptr.iv, i16 1271  br label %loop.header272 273exit:274  ret void275}276 277define void @test_monotonic_ptr_iv_inc_1_upper_is_multiple_with_early_exit_2(ptr %start) {278; CHECK-LABEL: @test_monotonic_ptr_iv_inc_1_upper_is_multiple_with_early_exit_2(279; CHECK-NEXT:  loop.ph:280; CHECK-NEXT:    [[UPPER:%.*]] = getelementptr inbounds i8, ptr [[START:%.*]], i16 10281; CHECK-NEXT:    br label [[LOOP_HEADER:%.*]]282; CHECK:       loop.header:283; CHECK-NEXT:    [[PTR_IV:%.*]] = phi ptr [ [[START]], [[LOOP_PH:%.*]] ], [ [[PTR_IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]284; CHECK-NEXT:    [[C:%.*]] = icmp eq ptr [[PTR_IV]], [[UPPER]]285; CHECK-NEXT:    br i1 [[C]], label [[EXIT:%.*]], label [[FOR_BODY:%.*]]286; CHECK:       for.body:287; CHECK-NEXT:    [[C_1:%.*]] = call i1 @cond()288; CHECK-NEXT:    br i1 [[C_1]], label [[LOOP_NEXT:%.*]], label [[EXIT]]289; CHECK:       loop.next:290; CHECK-NEXT:    [[AND:%.*]] = and i1 true, true291; CHECK-NEXT:    br i1 [[AND]], label [[LOOP_LATCH]], label [[EXIT]]292; CHECK:       loop.latch:293; CHECK-NEXT:    call void @use(ptr [[PTR_IV]])294; CHECK-NEXT:    [[PTR_IV_NEXT]] = getelementptr inbounds i16, ptr [[PTR_IV]], i16 1295; CHECK-NEXT:    br label [[LOOP_HEADER]]296; CHECK:       exit:297; CHECK-NEXT:    ret void298;299loop.ph:300  %upper = getelementptr inbounds i8, ptr %start, i16 10301  br label %loop.header302 303loop.header:304  %ptr.iv = phi ptr [ %start, %loop.ph ], [ %ptr.iv.next, %loop.latch ]305  %c = icmp eq ptr %ptr.iv, %upper306  br i1 %c, label %exit, label %for.body307 308for.body:309  %c.1 = call i1 @cond()310  br i1 %c.1, label %loop.next, label %exit311 312loop.next:313  %t.1 = icmp uge ptr %ptr.iv, %start314  %t.2 = icmp ult ptr %ptr.iv, %upper315  %and = and i1 %t.1, %t.2316  br i1 %and, label %loop.latch, label %exit317 318loop.latch:319  call void @use(ptr %ptr.iv)320  %ptr.iv.next = getelementptr inbounds i16, ptr %ptr.iv, i16 1321  br label %loop.header322 323exit:324  ret void325}326 327define void @test_monotonic_ptr_iv_inc_1_upper_is_multiple_with_early_exit_3(ptr %start) {328; CHECK-LABEL: @test_monotonic_ptr_iv_inc_1_upper_is_multiple_with_early_exit_3(329; CHECK-NEXT:  loop.ph:330; CHECK-NEXT:    [[UPPER:%.*]] = getelementptr inbounds i16, ptr [[START:%.*]], i16 16331; CHECK-NEXT:    br label [[LOOP_HEADER:%.*]]332; CHECK:       loop.header:333; CHECK-NEXT:    [[PTR_IV:%.*]] = phi ptr [ [[START]], [[LOOP_PH:%.*]] ], [ [[PTR_IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]334; CHECK-NEXT:    [[C:%.*]] = icmp eq ptr [[PTR_IV]], [[UPPER]]335; CHECK-NEXT:    br i1 [[C]], label [[EXIT:%.*]], label [[FOR_BODY:%.*]]336; CHECK:       for.body:337; CHECK-NEXT:    [[C_1:%.*]] = call i1 @cond()338; CHECK-NEXT:    br i1 [[C_1]], label [[LOOP_NEXT:%.*]], label [[EXIT]]339; CHECK:       loop.next:340; CHECK-NEXT:    [[AND:%.*]] = and i1 true, true341; CHECK-NEXT:    br i1 [[AND]], label [[LOOP_LATCH]], label [[EXIT]]342; CHECK:       loop.latch:343; CHECK-NEXT:    call void @use(ptr [[PTR_IV]])344; CHECK-NEXT:    [[PTR_IV_NEXT]] = getelementptr inbounds i32, ptr [[PTR_IV]], i16 1345; CHECK-NEXT:    br label [[LOOP_HEADER]]346; CHECK:       exit:347; CHECK-NEXT:    ret void348;349loop.ph:350  %upper = getelementptr inbounds i16, ptr %start, i16 16351  br label %loop.header352 353loop.header:354  %ptr.iv = phi ptr [ %start, %loop.ph ], [ %ptr.iv.next, %loop.latch ]355  %c = icmp eq ptr %ptr.iv, %upper356  br i1 %c, label %exit, label %for.body357 358for.body:359  %c.1 = call i1 @cond()360  br i1 %c.1, label %loop.next, label %exit361 362loop.next:363  %t.1 = icmp uge ptr %ptr.iv, %start364  %t.2 = icmp ult ptr %ptr.iv, %upper365  %and = and i1 %t.1, %t.2366  br i1 %and, label %loop.latch, label %exit367 368loop.latch:369  call void @use(ptr %ptr.iv)370  %ptr.iv.next = getelementptr inbounds i32, ptr %ptr.iv, i16 1371  br label %loop.header372 373exit:374  ret void375}376 377define void @test_monotonic_ptr_iv_inc_1_upper_is_no_multiple_with_early_exit_1(ptr %start) {378; CHECK-LABEL: @test_monotonic_ptr_iv_inc_1_upper_is_no_multiple_with_early_exit_1(379; CHECK-NEXT:  loop.ph:380; CHECK-NEXT:    [[UPPER:%.*]] = getelementptr inbounds i8, ptr [[START:%.*]], i16 10381; CHECK-NEXT:    br label [[LOOP_HEADER:%.*]]382; CHECK:       loop.header:383; CHECK-NEXT:    [[PTR_IV:%.*]] = phi ptr [ [[START]], [[LOOP_PH:%.*]] ], [ [[PTR_IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]384; CHECK-NEXT:    [[C:%.*]] = icmp eq ptr [[PTR_IV]], [[UPPER]]385; CHECK-NEXT:    br i1 [[C]], label [[EXIT:%.*]], label [[FOR_BODY:%.*]]386; CHECK:       for.body:387; CHECK-NEXT:    [[C_1:%.*]] = call i1 @cond()388; CHECK-NEXT:    br i1 [[C_1]], label [[LOOP_NEXT:%.*]], label [[EXIT]]389; CHECK:       loop.next:390; CHECK-NEXT:    [[T_2:%.*]] = icmp ult ptr [[PTR_IV]], [[UPPER]]391; CHECK-NEXT:    [[AND:%.*]] = and i1 true, [[T_2]]392; CHECK-NEXT:    br i1 [[AND]], label [[LOOP_LATCH]], label [[EXIT]]393; CHECK:       loop.latch:394; CHECK-NEXT:    call void @use(ptr [[PTR_IV]])395; CHECK-NEXT:    [[PTR_IV_NEXT]] = getelementptr inbounds i32, ptr [[PTR_IV]], i16 1396; CHECK-NEXT:    br label [[LOOP_HEADER]]397; CHECK:       exit:398; CHECK-NEXT:    ret void399;400loop.ph:401  %upper = getelementptr inbounds i8, ptr %start, i16 10402  br label %loop.header403 404loop.header:405  %ptr.iv = phi ptr [ %start, %loop.ph ], [ %ptr.iv.next, %loop.latch ]406  %c = icmp eq ptr %ptr.iv, %upper407  br i1 %c, label %exit, label %for.body408 409for.body:410  %c.1 = call i1 @cond()411  br i1 %c.1, label %loop.next, label %exit412 413loop.next:414  %t.1 = icmp uge ptr %ptr.iv, %start415  %t.2 = icmp ult ptr %ptr.iv, %upper416  %and = and i1 %t.1, %t.2417  br i1 %and, label %loop.latch, label %exit418 419loop.latch:420  call void @use(ptr %ptr.iv)421  %ptr.iv.next = getelementptr inbounds i32, ptr %ptr.iv, i16 1422  br label %loop.header423 424exit:425  ret void426}427 428define void @test_monotonic_ptr_iv_inc_1_upper_is_no_multiple_with_early_exit_2(ptr %start) {429; CHECK-LABEL: @test_monotonic_ptr_iv_inc_1_upper_is_no_multiple_with_early_exit_2(430; CHECK-NEXT:  loop.ph:431; CHECK-NEXT:    [[UPPER:%.*]] = getelementptr inbounds i8, ptr [[START:%.*]], i16 11432; CHECK-NEXT:    br label [[LOOP_HEADER:%.*]]433; CHECK:       loop.header:434; CHECK-NEXT:    [[PTR_IV:%.*]] = phi ptr [ [[START]], [[LOOP_PH:%.*]] ], [ [[PTR_IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]435; CHECK-NEXT:    [[C:%.*]] = icmp eq ptr [[PTR_IV]], [[UPPER]]436; CHECK-NEXT:    br i1 [[C]], label [[EXIT:%.*]], label [[FOR_BODY:%.*]]437; CHECK:       for.body:438; CHECK-NEXT:    [[C_1:%.*]] = call i1 @cond()439; CHECK-NEXT:    br i1 [[C_1]], label [[LOOP_NEXT:%.*]], label [[EXIT]]440; CHECK:       loop.next:441; CHECK-NEXT:    [[T_2:%.*]] = icmp ult ptr [[PTR_IV]], [[UPPER]]442; CHECK-NEXT:    [[AND:%.*]] = and i1 true, [[T_2]]443; CHECK-NEXT:    br i1 [[AND]], label [[LOOP_LATCH]], label [[EXIT]]444; CHECK:       loop.latch:445; CHECK-NEXT:    call void @use(ptr [[PTR_IV]])446; CHECK-NEXT:    [[PTR_IV_NEXT]] = getelementptr inbounds i16, ptr [[PTR_IV]], i16 1447; CHECK-NEXT:    br label [[LOOP_HEADER]]448; CHECK:       exit:449; CHECK-NEXT:    ret void450;451loop.ph:452  %upper = getelementptr inbounds i8, ptr %start, i16 11453  br label %loop.header454 455loop.header:456  %ptr.iv = phi ptr [ %start, %loop.ph ], [ %ptr.iv.next, %loop.latch ]457  %c = icmp eq ptr %ptr.iv, %upper458  br i1 %c, label %exit, label %for.body459 460for.body:461  %c.1 = call i1 @cond()462  br i1 %c.1, label %loop.next, label %exit463 464loop.next:465  %t.1 = icmp uge ptr %ptr.iv, %start466  %t.2 = icmp ult ptr %ptr.iv, %upper467  %and = and i1 %t.1, %t.2468  br i1 %and, label %loop.latch, label %exit469 470loop.latch:471  call void @use(ptr %ptr.iv)472  %ptr.iv.next = getelementptr inbounds i16, ptr %ptr.iv, i16 1473  br label %loop.header474 475exit:476  ret void477}478 479define void @test_monotonic_ptr_iv_inc_1_upper_is_no_multiple_with_early_exit_3(ptr %start) {480; CHECK-LABEL: @test_monotonic_ptr_iv_inc_1_upper_is_no_multiple_with_early_exit_3(481; CHECK-NEXT:  loop.ph:482; CHECK-NEXT:    [[UPPER:%.*]] = getelementptr inbounds i16, ptr [[START:%.*]], i16 9483; CHECK-NEXT:    br label [[LOOP_HEADER:%.*]]484; CHECK:       loop.header:485; CHECK-NEXT:    [[PTR_IV:%.*]] = phi ptr [ [[START]], [[LOOP_PH:%.*]] ], [ [[PTR_IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]486; CHECK-NEXT:    [[C:%.*]] = icmp eq ptr [[PTR_IV]], [[UPPER]]487; CHECK-NEXT:    br i1 [[C]], label [[EXIT:%.*]], label [[FOR_BODY:%.*]]488; CHECK:       for.body:489; CHECK-NEXT:    [[C_1:%.*]] = call i1 @cond()490; CHECK-NEXT:    br i1 [[C_1]], label [[LOOP_NEXT:%.*]], label [[EXIT]]491; CHECK:       loop.next:492; CHECK-NEXT:    [[T_2:%.*]] = icmp ult ptr [[PTR_IV]], [[UPPER]]493; CHECK-NEXT:    [[AND:%.*]] = and i1 true, [[T_2]]494; CHECK-NEXT:    br i1 [[AND]], label [[LOOP_LATCH]], label [[EXIT]]495; CHECK:       loop.latch:496; CHECK-NEXT:    call void @use(ptr [[PTR_IV]])497; CHECK-NEXT:    [[PTR_IV_NEXT]] = getelementptr inbounds i32, ptr [[PTR_IV]], i16 1498; CHECK-NEXT:    br label [[LOOP_HEADER]]499; CHECK:       exit:500; CHECK-NEXT:    ret void501;502loop.ph:503  %upper = getelementptr inbounds i16, ptr %start, i16 9504  br label %loop.header505 506loop.header:507  %ptr.iv = phi ptr [ %start, %loop.ph ], [ %ptr.iv.next, %loop.latch ]508  %c = icmp eq ptr %ptr.iv, %upper509  br i1 %c, label %exit, label %for.body510 511for.body:512  %c.1 = call i1 @cond()513  br i1 %c.1, label %loop.next, label %exit514 515loop.next:516  %t.1 = icmp uge ptr %ptr.iv, %start517  %t.2 = icmp ult ptr %ptr.iv, %upper518  %and = and i1 %t.1, %t.2519  br i1 %and, label %loop.latch, label %exit520 521loop.latch:522  call void @use(ptr %ptr.iv)523  %ptr.iv.next = getelementptr inbounds i32, ptr %ptr.iv, i16 1524  br label %loop.header525 526exit:527  ret void528}529