brintos

brintos / llvm-project-archived public Read only

0
0
Text · 16.7 KiB · f70426b Raw
548 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=canon-freeze -S | FileCheck %s3; A set of tests that have one phi node4declare void @call(i32)5declare i32 @get_step()6 7define void @add(i32 %init, i32 %n) {8; CHECK-LABEL: @add(9; CHECK-NEXT:  entry:10; CHECK-NEXT:    [[INIT_FROZEN:%.*]] = freeze i32 [[INIT:%.*]]11; CHECK-NEXT:    br label [[LOOP:%.*]]12; CHECK:       loop:13; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[INIT_FROZEN]], [[ENTRY:%.*]] ], [ [[I_NEXT:%.*]], [[LOOP]] ]14; CHECK-NEXT:    [[I_NEXT]] = add i32 [[I]], 115; CHECK-NEXT:    [[COND:%.*]] = icmp eq i32 [[I_NEXT]], [[N:%.*]]16; CHECK-NEXT:    br i1 [[COND]], label [[LOOP]], label [[EXIT:%.*]]17; CHECK:       exit:18; CHECK-NEXT:    ret void19;20entry:21  br label %loop22 23loop:24  %i = phi i32 [ %init, %entry], [%i.next, %loop ]25  %i.next = add i32 %i, 126  %i.next.fr = freeze i32 %i.next27  %cond = icmp eq i32 %i.next.fr, %n28  br i1 %cond, label %loop, label %exit29 30exit:31  ret void32}33 34define void @add_comm(i32 %init, i32 %n) {35; CHECK-LABEL: @add_comm(36; CHECK-NEXT:  entry:37; CHECK-NEXT:    [[INIT_FROZEN:%.*]] = freeze i32 [[INIT:%.*]]38; CHECK-NEXT:    br label [[LOOP:%.*]]39; CHECK:       loop:40; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[INIT_FROZEN]], [[ENTRY:%.*]] ], [ [[I_NEXT:%.*]], [[LOOP]] ]41; CHECK-NEXT:    [[I_NEXT]] = add i32 1, [[I]]42; CHECK-NEXT:    [[COND:%.*]] = icmp eq i32 [[I_NEXT]], [[N:%.*]]43; CHECK-NEXT:    br i1 [[COND]], label [[LOOP]], label [[EXIT:%.*]]44; CHECK:       exit:45; CHECK-NEXT:    ret void46;47entry:48  br label %loop49 50loop:51  %i = phi i32 [ %init, %entry ], [ %i.next, %loop ]52  %i.next = add i32 1, %i53  %i.next.fr = freeze i32 %i.next54  %cond = icmp eq i32 %i.next.fr, %n55  br i1 %cond, label %loop, label %exit56 57exit:58  ret void59}60 61define void @add_multiuses(i32 %init, i32 %n) {62; CHECK-LABEL: @add_multiuses(63; CHECK-NEXT:  entry:64; CHECK-NEXT:    [[INIT_FROZEN:%.*]] = freeze i32 [[INIT:%.*]]65; CHECK-NEXT:    br label [[LOOP:%.*]]66; CHECK:       loop:67; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[INIT_FROZEN]], [[ENTRY:%.*]] ], [ [[I_NEXT:%.*]], [[LOOP]] ]68; CHECK-NEXT:    [[I_NEXT]] = add i32 [[I]], 169; CHECK-NEXT:    call void @call(i32 [[I_NEXT]])70; CHECK-NEXT:    [[COND:%.*]] = icmp eq i32 [[I_NEXT]], [[N:%.*]]71; CHECK-NEXT:    br i1 [[COND]], label [[LOOP]], label [[EXIT:%.*]]72; CHECK:       exit:73; CHECK-NEXT:    ret void74;75entry:76  br label %loop77 78loop:79  %i = phi i32 [ %init, %entry ], [ %i.next, %loop ]80  %i.next = add i32 %i, 181  %i.next.fr = freeze i32 %i.next82  call void @call(i32 %i.next.fr)83  %cond = icmp eq i32 %i.next.fr, %n84  br i1 %cond, label %loop, label %exit85 86exit:87  ret void88}89 90define void @add_multiuses2(i32 %init, i32 %n) {91; CHECK-LABEL: @add_multiuses2(92; CHECK-NEXT:  entry:93; CHECK-NEXT:    [[INIT_FROZEN:%.*]] = freeze i32 [[INIT:%.*]]94; CHECK-NEXT:    br label [[LOOP:%.*]]95; CHECK:       loop:96; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[INIT_FROZEN]], [[ENTRY:%.*]] ], [ [[I_NEXT:%.*]], [[LOOP]] ]97; CHECK-NEXT:    [[I_NEXT]] = add i32 [[I]], 198; CHECK-NEXT:    call void @call(i32 [[I_NEXT]])99; CHECK-NEXT:    call void @call(i32 [[I_NEXT]])100; CHECK-NEXT:    [[COND:%.*]] = icmp eq i32 [[I_NEXT]], [[N:%.*]]101; CHECK-NEXT:    br i1 [[COND]], label [[LOOP]], label [[EXIT:%.*]]102; CHECK:       exit:103; CHECK-NEXT:    ret void104;105entry:106  br label %loop107 108loop:109  %i = phi i32 [ %init, %entry ], [ %i.next, %loop ]110  %i.next = add i32 %i, 1111  %i.next.fr = freeze i32 %i.next112  call void @call(i32 %i.next.fr)113  %i.next.fr2 = freeze i32 %i.next114  call void @call(i32 %i.next.fr2)115  %cond = icmp eq i32 %i.next.fr, %n116  br i1 %cond, label %loop, label %exit117 118exit:119  ret void120}121 122define void @add_flags(i32 %init, i32 %n) {123; CHECK-LABEL: @add_flags(124; CHECK-NEXT:  entry:125; CHECK-NEXT:    [[INIT_FROZEN:%.*]] = freeze i32 [[INIT:%.*]]126; CHECK-NEXT:    br label [[LOOP:%.*]]127; CHECK:       loop:128; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[INIT_FROZEN]], [[ENTRY:%.*]] ], [ [[I_NEXT:%.*]], [[LOOP]] ]129; CHECK-NEXT:    [[I_NEXT]] = add i32 [[I]], 1130; CHECK-NEXT:    call void @call(i32 [[I_NEXT]])131; CHECK-NEXT:    [[COND:%.*]] = icmp eq i32 [[I_NEXT]], [[N:%.*]]132; CHECK-NEXT:    br i1 [[COND]], label [[LOOP]], label [[EXIT:%.*]]133; CHECK:       exit:134; CHECK-NEXT:    ret void135;136entry:137  br label %loop138 139loop:140  %i = phi i32 [ %init, %entry ], [ %i.next, %loop ]141  %i.next = add nuw nsw i32 %i, 1142  %i.next.fr = freeze i32 %i.next143  call void @call(i32 %i.next.fr)144  %cond = icmp eq i32 %i.next.fr, %n145  br i1 %cond, label %loop, label %exit146 147exit:148  ret void149}150 151define void @add_ind(i32 %init, i32 %n) {152; CHECK-LABEL: @add_ind(153; CHECK-NEXT:  entry:154; CHECK-NEXT:    [[INIT_FROZEN:%.*]] = freeze i32 [[INIT:%.*]]155; CHECK-NEXT:    br label [[LOOP:%.*]]156; CHECK:       loop:157; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[INIT_FROZEN]], [[ENTRY:%.*]] ], [ [[I_NEXT:%.*]], [[LOOP]] ]158; CHECK-NEXT:    [[I_NEXT]] = add i32 [[I]], 1159; CHECK-NEXT:    [[I_FR_NEXT:%.*]] = add nuw nsw i32 [[I]], 1160; CHECK-NEXT:    call void @call(i32 [[I_FR_NEXT]])161; CHECK-NEXT:    [[COND:%.*]] = icmp eq i32 [[I_FR_NEXT]], [[N:%.*]]162; CHECK-NEXT:    br i1 [[COND]], label [[LOOP]], label [[EXIT:%.*]]163; CHECK:       exit:164; CHECK-NEXT:    ret void165;166entry:167  br label %loop168 169loop:170  %i = phi i32 [ %init, %entry ], [ %i.next, %loop ]171  %i.next = add nuw nsw i32 %i, 1172  %i.fr = freeze i32 %i173  %i.fr.next = add nuw nsw i32 %i.fr, 1174  call void @call(i32 %i.fr.next)175  %cond = icmp eq i32 %i.fr.next, %n176  br i1 %cond, label %loop, label %exit177 178exit:179  ret void180}181 182; Negative test183define void @add_ind_frozen(i32 %init, i32 %n) {184; CHECK-LABEL: @add_ind_frozen(185; CHECK-NEXT:  entry:186; CHECK-NEXT:    br label [[LOOP:%.*]]187; CHECK:       loop:188; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[INIT:%.*]], [[ENTRY:%.*]] ], [ [[I_NEXT_FR:%.*]], [[LOOP]] ]189; CHECK-NEXT:    [[I_FR:%.*]] = freeze i32 [[I]]190; CHECK-NEXT:    [[I_NEXT_FR]] = add nuw nsw i32 [[I_FR]], 1191; CHECK-NEXT:    call void @call(i32 [[I_NEXT_FR]])192; CHECK-NEXT:    [[COND:%.*]] = icmp eq i32 [[I_NEXT_FR]], [[N:%.*]]193; CHECK-NEXT:    br i1 [[COND]], label [[LOOP]], label [[EXIT:%.*]]194; CHECK:       exit:195; CHECK-NEXT:    ret void196;197entry:198  br label %loop199 200loop:201  %i = phi i32 [%init, %entry], [%i.next.fr, %loop]202  %i.fr = freeze i32 %i203  %i.next.fr = add nuw nsw i32 %i.fr, 1204  call void @call(i32 %i.next.fr)205  %cond = icmp eq i32 %i.next.fr, %n206  br i1 %cond, label %loop, label %exit207 208exit:209  ret void210}211 212define void @add_flags_not_compared(i32 %init, i32 %n) {213; CHECK-LABEL: @add_flags_not_compared(214; CHECK-NEXT:  entry:215; CHECK-NEXT:    [[INIT_FROZEN:%.*]] = freeze i32 [[INIT:%.*]]216; CHECK-NEXT:    br label [[LOOP:%.*]]217; CHECK:       loop:218; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[INIT_FROZEN]], [[ENTRY:%.*]] ], [ [[I_NEXT:%.*]], [[LOOP]] ]219; CHECK-NEXT:    [[I_NEXT]] = add i32 [[I]], 1220; CHECK-NEXT:    call void @call(i32 [[I_NEXT]])221; CHECK-NEXT:    [[COND:%.*]] = icmp eq i32 [[I_NEXT]], [[N:%.*]]222; CHECK-NEXT:    br i1 [[COND]], label [[LOOP]], label [[EXIT:%.*]]223; CHECK:       exit:224; CHECK-NEXT:    ret void225;226entry:227  br label %loop228 229loop:230  %i = phi i32 [ %init, %entry ], [ %i.next, %loop ]231  %i.next = add nuw nsw i32 %i, 1232  %i.next.fr = freeze i32 %i.next233  call void @call(i32 %i.next.fr)234  %cond = icmp eq i32 %i.next, %n235  br i1 %cond, label %loop, label %exit236 237exit:238  ret void239}240 241; Negative test242define void @add_flags_not_compared_stepinst(i32 %init, i32 %n) {243; CHECK-LABEL: @add_flags_not_compared_stepinst(244; CHECK-NEXT:  entry:245; CHECK-NEXT:    br label [[LOOP:%.*]]246; CHECK:       loop:247; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[INIT:%.*]], [[ENTRY:%.*]] ], [ [[I_NEXT_FR:%.*]], [[LOOP]] ]248; CHECK-NEXT:    [[I_NEXT:%.*]] = add nuw nsw i32 [[I]], 1249; CHECK-NEXT:    [[I_NEXT_FR]] = freeze i32 [[I_NEXT]]250; CHECK-NEXT:    call void @call(i32 [[I_NEXT_FR]])251; CHECK-NEXT:    [[COND:%.*]] = icmp eq i32 [[I_NEXT]], [[N:%.*]]252; CHECK-NEXT:    br i1 [[COND]], label [[LOOP]], label [[EXIT:%.*]]253; CHECK:       exit:254; CHECK-NEXT:    ret void255;256entry:257  br label %loop258 259loop:260  %i = phi i32 [ %init, %entry ], [ %i.next.fr, %loop ]261  %i.next = add nuw nsw i32 %i, 1262  %i.next.fr = freeze i32 %i.next263  call void @call(i32 %i.next.fr)264  %cond = icmp eq i32 %i.next, %n265  br i1 %cond, label %loop, label %exit266 267exit:268  ret void269}270 271; Negative test272; If pushing freeze through icmp is needed, this should be enabled.273; There is no correctness issue in pushing freeze into icmp here, just it's274; being conservative right now.275define void @add_flags_stepinst_frozen(i32 %init, i32 %n) {276; CHECK-LABEL: @add_flags_stepinst_frozen(277; CHECK-NEXT:  entry:278; CHECK-NEXT:    br label [[LOOP:%.*]]279; CHECK:       loop:280; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[INIT:%.*]], [[ENTRY:%.*]] ], [ [[I_NEXT:%.*]], [[LOOP]] ]281; CHECK-NEXT:    [[I_NEXT]] = add nuw nsw i32 [[I]], 1282; CHECK-NEXT:    call void @call(i32 [[I_NEXT]])283; CHECK-NEXT:    [[COND:%.*]] = icmp eq i32 [[I_NEXT]], [[N:%.*]]284; CHECK-NEXT:    [[COND_FR:%.*]] = freeze i1 [[COND]]285; CHECK-NEXT:    br i1 [[COND_FR]], label [[LOOP]], label [[EXIT:%.*]]286; CHECK:       exit:287; CHECK-NEXT:    ret void288;289entry:290  br label %loop291 292loop:293  %i = phi i32 [ %init, %entry ], [ %i.next, %loop ]294  %i.next = add nuw nsw i32 %i, 1295  call void @call(i32 %i.next)296  %cond = icmp eq i32 %i.next, %n297  %cond.fr = freeze i1 %cond298  br i1 %cond.fr, label %loop, label %exit299 300exit:301  ret void302}303 304define void @sub(i32 %init, i32 %n) {305; CHECK-LABEL: @sub(306; CHECK-NEXT:  entry:307; CHECK-NEXT:    [[INIT_FROZEN:%.*]] = freeze i32 [[INIT:%.*]]308; CHECK-NEXT:    br label [[LOOP:%.*]]309; CHECK:       loop:310; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[INIT_FROZEN]], [[ENTRY:%.*]] ], [ [[I_NEXT:%.*]], [[LOOP]] ]311; CHECK-NEXT:    [[I_NEXT]] = sub i32 [[I]], 1312; CHECK-NEXT:    call void @call(i32 [[I_NEXT]])313; CHECK-NEXT:    [[COND:%.*]] = icmp eq i32 [[I_NEXT]], [[N:%.*]]314; CHECK-NEXT:    br i1 [[COND]], label [[LOOP]], label [[EXIT:%.*]]315; CHECK:       exit:316; CHECK-NEXT:    ret void317;318entry:319  br label %loop320 321loop:322  %i = phi i32 [%init, %entry], [%i.next, %loop]323  %i.next = sub nuw nsw i32 %i, 1324  %i.next.fr = freeze i32 %i.next325  call void @call(i32 %i.next.fr)326  %cond = icmp eq i32 %i.next.fr, %n327  br i1 %cond, label %loop, label %exit328 329exit:330  ret void331}332 333define void @init_const(i32 %n) {334; CHECK-LABEL: @init_const(335; CHECK-NEXT:  entry:336; CHECK-NEXT:    br label [[LOOP:%.*]]337; CHECK:       loop:338; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[I_NEXT:%.*]], [[LOOP]] ]339; CHECK-NEXT:    [[I_NEXT]] = add i32 [[I]], 1340; CHECK-NEXT:    call void @call(i32 [[I_NEXT]])341; CHECK-NEXT:    [[COND:%.*]] = icmp eq i32 [[I_NEXT]], [[N:%.*]]342; CHECK-NEXT:    br i1 [[COND]], label [[LOOP]], label [[EXIT:%.*]]343; CHECK:       exit:344; CHECK-NEXT:    ret void345;346entry:347  br label %loop348 349loop:350  %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]351  %i.next = add nuw nsw i32 %i, 1352  %i.next.fr = freeze i32 %i.next353  call void @call(i32 %i.next.fr)354  %cond = icmp eq i32 %i.next.fr, %n355  br i1 %cond, label %loop, label %exit356 357exit:358  ret void359}360 361define void @step_init_arg(i32 %init, i32 %n, i32 %step) {362; CHECK-LABEL: @step_init_arg(363; CHECK-NEXT:  entry:364; CHECK-NEXT:    [[STEP_FROZEN:%.*]] = freeze i32 [[STEP:%.*]]365; CHECK-NEXT:    [[INIT_FROZEN:%.*]] = freeze i32 [[INIT:%.*]]366; CHECK-NEXT:    br label [[LOOP:%.*]]367; CHECK:       loop:368; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[INIT_FROZEN]], [[ENTRY:%.*]] ], [ [[I_NEXT:%.*]], [[LOOP]] ]369; CHECK-NEXT:    [[I_NEXT]] = add i32 [[I]], [[STEP_FROZEN]]370; CHECK-NEXT:    call void @call(i32 [[I_NEXT]])371; CHECK-NEXT:    [[COND:%.*]] = icmp eq i32 [[I_NEXT]], [[N:%.*]]372; CHECK-NEXT:    br i1 [[COND]], label [[LOOP]], label [[EXIT:%.*]]373; CHECK:       exit:374; CHECK-NEXT:    ret void375;376entry:377  br label %loop378 379loop:380  %i = phi i32 [%init, %entry], [%i.next, %loop]381  %i.next = add nuw nsw i32 %i, %step382  %i.next.fr = freeze i32 %i.next383  call void @call(i32 %i.next.fr)384  %cond = icmp eq i32 %i.next.fr, %n385  br i1 %cond, label %loop, label %exit386 387exit:388  ret void389}390 391define void @step_init_arg_multiuses(i32 %init, i32 %n, i32 %step) {392; CHECK-LABEL: @step_init_arg_multiuses(393; CHECK-NEXT:  entry:394; CHECK-NEXT:    [[STEP_FROZEN:%.*]] = freeze i32 [[STEP:%.*]]395; CHECK-NEXT:    [[INIT_FROZEN:%.*]] = freeze i32 [[INIT:%.*]]396; CHECK-NEXT:    br label [[LOOP:%.*]]397; CHECK:       loop:398; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[INIT_FROZEN]], [[ENTRY:%.*]] ], [ [[I_NEXT:%.*]], [[LOOP]] ]399; CHECK-NEXT:    [[I_NEXT]] = add i32 [[I]], [[STEP_FROZEN]]400; CHECK-NEXT:    call void @call(i32 [[I_NEXT]])401; CHECK-NEXT:    call void @call(i32 [[I_NEXT]])402; CHECK-NEXT:    [[COND:%.*]] = icmp eq i32 [[I_NEXT]], [[N:%.*]]403; CHECK-NEXT:    br i1 [[COND]], label [[LOOP]], label [[EXIT:%.*]]404; CHECK:       exit:405; CHECK-NEXT:    ret void406;407entry:408  br label %loop409 410loop:411  %i = phi i32 [ %init, %entry ], [ %i.next, %loop ]412  %i.next = add nsw nuw i32 %i, %step413  %i.next.fr1 = freeze i32 %i.next414  call void @call(i32 %i.next.fr1)415  %i.next.fr2 = freeze i32 %i.next416  call void @call(i32 %i.next.fr2)417  %cond = icmp eq i32 %i.next, %n418  br i1 %cond, label %loop, label %exit419 420exit:421  ret void422}423 424define void @step_init_arg_multiuses2(i32 %init, i32 %n, i32 %step) {425; CHECK-LABEL: @step_init_arg_multiuses2(426; CHECK-NEXT:  entry:427; CHECK-NEXT:    [[STEP_FROZEN:%.*]] = freeze i32 [[STEP:%.*]]428; CHECK-NEXT:    [[INIT_FROZEN:%.*]] = freeze i32 [[INIT:%.*]]429; CHECK-NEXT:    br label [[LOOP:%.*]]430; CHECK:       loop:431; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[INIT_FROZEN]], [[ENTRY:%.*]] ], [ [[I_NEXT:%.*]], [[LOOP]] ]432; CHECK-NEXT:    call void @call(i32 [[I]])433; CHECK-NEXT:    call void @call(i32 [[I]])434; CHECK-NEXT:    [[I_NEXT]] = add i32 [[I]], [[STEP_FROZEN]]435; CHECK-NEXT:    [[COND:%.*]] = icmp eq i32 [[I_NEXT]], [[N:%.*]]436; CHECK-NEXT:    br i1 [[COND]], label [[LOOP]], label [[EXIT:%.*]]437; CHECK:       exit:438; CHECK-NEXT:    ret void439;440entry:441  br label %loop442 443loop:444  %i = phi i32 [ %init, %entry ], [ %i.next, %loop ]445  %i.fr1 = freeze i32 %i446  call void @call(i32 %i.fr1)447  %i.fr2 = freeze i32 %i448  call void @call(i32 %i.fr2)449  %i.next = add nsw nuw i32 %i, %step450  %cond = icmp eq i32 %i.next, %n451  br i1 %cond, label %loop, label %exit452 453exit:454  ret void455}456 457define void @step_init_inst(i32 %n) {458; CHECK-LABEL: @step_init_inst(459; CHECK-NEXT:  entry:460; CHECK-NEXT:    [[STEP:%.*]] = call i32 @get_step()461; CHECK-NEXT:    [[INIT:%.*]] = call i32 @get_step()462; CHECK-NEXT:    [[STEP_FROZEN:%.*]] = freeze i32 [[STEP]]463; CHECK-NEXT:    [[INIT_FROZEN:%.*]] = freeze i32 [[INIT]]464; CHECK-NEXT:    br label [[LOOP:%.*]]465; CHECK:       loop:466; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[INIT_FROZEN]], [[ENTRY:%.*]] ], [ [[I_NEXT:%.*]], [[LOOP]] ]467; CHECK-NEXT:    [[I_NEXT]] = add i32 [[I]], [[STEP_FROZEN]]468; CHECK-NEXT:    call void @call(i32 [[I_NEXT]])469; CHECK-NEXT:    [[COND:%.*]] = icmp eq i32 [[I_NEXT]], [[N:%.*]]470; CHECK-NEXT:    br i1 [[COND]], label [[LOOP]], label [[EXIT:%.*]]471; CHECK:       exit:472; CHECK-NEXT:    ret void473;474entry:475  %step = call i32 @get_step()476  %init = call i32 @get_step()477  br label %loop478 479loop:480  %i = phi i32 [%init, %entry], [%i.next, %loop]481  %i.next = add nuw nsw i32 %i, %step482  %i.next.fr = freeze i32 %i.next483  call void @call(i32 %i.next.fr)484  %cond = icmp eq i32 %i.next.fr, %n485  br i1 %cond, label %loop, label %exit486 487exit:488  ret void489}490 491; Negative test492define void @step_inst(i32 %init, i32 %n) {493; CHECK-LABEL: @step_inst(494; CHECK-NEXT:  entry:495; CHECK-NEXT:    br label [[LOOP:%.*]]496; CHECK:       loop:497; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[INIT:%.*]], [[ENTRY:%.*]] ], [ [[I_NEXT:%.*]], [[LOOP]] ]498; CHECK-NEXT:    [[I_NEXT]] = add nuw nsw i32 [[I]], [[I]]499; CHECK-NEXT:    [[I_NEXT_FR:%.*]] = freeze i32 [[I_NEXT]]500; CHECK-NEXT:    call void @call(i32 [[I_NEXT_FR]])501; CHECK-NEXT:    [[COND:%.*]] = icmp eq i32 [[I_NEXT_FR]], [[N:%.*]]502; CHECK-NEXT:    br i1 [[COND]], label [[LOOP]], label [[EXIT:%.*]]503; CHECK:       exit:504; CHECK-NEXT:    ret void505;506entry:507  br label %loop508 509loop:510  %i = phi i32 [%init, %entry], [%i.next, %loop]511  %i.next = add nuw nsw i32 %i, %i512  %i.next.fr = freeze i32 %i.next513  call void @call(i32 %i.next.fr)514  %cond = icmp eq i32 %i.next.fr, %n515  br i1 %cond, label %loop, label %exit516 517exit:518  ret void519}520 521; Negative test522define void @gep(ptr %init, ptr %end) {523; CHECK-LABEL: @gep(524; CHECK-NEXT:  entry:525; CHECK-NEXT:    br label [[LOOP:%.*]]526; CHECK:       loop:527; CHECK-NEXT:    [[I:%.*]] = phi ptr [ [[INIT:%.*]], [[ENTRY:%.*]] ], [ [[I_NEXT:%.*]], [[LOOP]] ]528; CHECK-NEXT:    [[I_NEXT]] = getelementptr inbounds i8, ptr [[I]], i64 1529; CHECK-NEXT:    [[I_NEXT_FR:%.*]] = freeze ptr [[I_NEXT]]530; CHECK-NEXT:    [[COND:%.*]] = icmp eq ptr [[I_NEXT_FR]], [[END:%.*]]531; CHECK-NEXT:    br i1 [[COND]], label [[LOOP]], label [[EXIT:%.*]]532; CHECK:       exit:533; CHECK-NEXT:    ret void534;535entry:536  br label %loop537 538loop:539  %i = phi ptr [ %init, %entry], [%i.next, %loop ]540  %i.next = getelementptr inbounds i8, ptr %i, i64 1541  %i.next.fr = freeze ptr %i.next542  %cond = icmp eq ptr %i.next.fr, %end543  br i1 %cond, label %loop, label %exit544 545exit:546  ret void547}548