1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -loop-unroll -S -unroll-count=4 | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; Test phi update after partial unroll. 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Workerdeclare i1 @check() nounwind 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Worker; CHECK: @test 7*9880d681SAndroid Build Coastguard Worker; CHECK: if.else: 8*9880d681SAndroid Build Coastguard Worker; CHECK: if.then.loopexit 9*9880d681SAndroid Build Coastguard Worker; CHECK: %sub5.lcssa = phi i32 [ %sub{{.*}}, %if.else{{.*}} ], [ %sub{{.*}}, %if.else{{.*}} ], [ %sub{{.*}}, %if.else{{.*}} ], [ %sub{{.*}}, %if.else{{.*}} ] 10*9880d681SAndroid Build Coastguard Worker; CHECK: if.else.3 11*9880d681SAndroid Build Coastguard Workerdefine void @test1(i32 %i, i32 %j) nounwind uwtable ssp { 12*9880d681SAndroid Build Coastguard Workerentry: 13*9880d681SAndroid Build Coastguard Worker %cond1 = call zeroext i1 @check() 14*9880d681SAndroid Build Coastguard Worker br i1 %cond1, label %if.then, label %if.else.lr.ph 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Workerif.else.lr.ph: ; preds = %entry 17*9880d681SAndroid Build Coastguard Worker br label %if.else 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Workerif.else: ; preds = %if.else, %if.else.lr.ph 20*9880d681SAndroid Build Coastguard Worker %sub = phi i32 [ %i, %if.else.lr.ph ], [ %sub5, %if.else ] 21*9880d681SAndroid Build Coastguard Worker %sub5 = sub i32 %sub, %j 22*9880d681SAndroid Build Coastguard Worker %cond2 = call zeroext i1 @check() 23*9880d681SAndroid Build Coastguard Worker br i1 %cond2, label %if.then, label %if.else 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %if.else, %entry 26*9880d681SAndroid Build Coastguard Worker %i.tr = phi i32 [ %i, %entry ], [ %sub5, %if.else ] 27*9880d681SAndroid Build Coastguard Worker ret void 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Worker} 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Worker; PR7318: assertion failure after doing a simple loop unroll 32*9880d681SAndroid Build Coastguard Worker; 33*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2( 34*9880d681SAndroid Build Coastguard Worker; CHECK: bb1.bb2_crit_edge: 35*9880d681SAndroid Build Coastguard Worker; CHECK: %.lcssa = phi i32 [ %{{[2468]}}, %bb1{{.*}} ], [ %{{[2468]}}, %bb1{{.*}} ], [ %{{[2468]}}, %bb1{{.*}} ], [ %{{[2468]}}, %bb1{{.*}} ] 36*9880d681SAndroid Build Coastguard Worker; CHECK: bb1.3: 37*9880d681SAndroid Build Coastguard Workerdefine i32 @test2(i32* nocapture %p, i32 %n) nounwind readonly { 38*9880d681SAndroid Build Coastguard Workerentry: 39*9880d681SAndroid Build Coastguard Worker %0 = icmp sgt i32 %n, 0 ; <i1> [#uses=1] 40*9880d681SAndroid Build Coastguard Worker br i1 %0, label %bb.nph, label %bb2 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Workerbb.nph: ; preds = %entry 43*9880d681SAndroid Build Coastguard Worker %tmp = zext i32 %n to i64 ; <i64> [#uses=1] 44*9880d681SAndroid Build Coastguard Worker br label %bb 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Workerbb: ; preds = %bb.nph, %bb1 47*9880d681SAndroid Build Coastguard Worker %indvar = phi i64 [ 0, %bb.nph ], [ %indvar.next, %bb1 ] ; <i64> [#uses=2] 48*9880d681SAndroid Build Coastguard Worker %s.01 = phi i32 [ 0, %bb.nph ], [ %2, %bb1 ] ; <i32> [#uses=1] 49*9880d681SAndroid Build Coastguard Worker %scevgep = getelementptr i32, i32* %p, i64 %indvar ; <i32*> [#uses=1] 50*9880d681SAndroid Build Coastguard Worker %1 = load i32, i32* %scevgep, align 1 ; <i32> [#uses=1] 51*9880d681SAndroid Build Coastguard Worker %2 = add nsw i32 %1, %s.01 ; <i32> [#uses=2] 52*9880d681SAndroid Build Coastguard Worker br label %bb1 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Workerbb1: ; preds = %bb 55*9880d681SAndroid Build Coastguard Worker %indvar.next = add i64 %indvar, 1 ; <i64> [#uses=2] 56*9880d681SAndroid Build Coastguard Worker %exitcond = icmp ne i64 %indvar.next, %tmp ; <i1> [#uses=1] 57*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %bb, label %bb1.bb2_crit_edge 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Workerbb1.bb2_crit_edge: ; preds = %bb1 60*9880d681SAndroid Build Coastguard Worker %.lcssa = phi i32 [ %2, %bb1 ] ; <i32> [#uses=1] 61*9880d681SAndroid Build Coastguard Worker br label %bb2 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Workerbb2: ; preds = %bb1.bb2_crit_edge, %entry 64*9880d681SAndroid Build Coastguard Worker %s.0.lcssa = phi i32 [ %.lcssa, %bb1.bb2_crit_edge ], [ 0, %entry ] ; <i32> [#uses=1] 65*9880d681SAndroid Build Coastguard Worker ret i32 %s.0.lcssa 66*9880d681SAndroid Build Coastguard Worker} 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Worker; Check phi update for loop with an early-exit. 69*9880d681SAndroid Build Coastguard Worker; 70*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3( 71*9880d681SAndroid Build Coastguard Worker; CHECK: return.loopexit: 72*9880d681SAndroid Build Coastguard Worker; CHECK: %tmp7.i.lcssa = phi i32 [ %tmp7.i{{.*}}, %land.lhs.true{{.*}} ], [ %tmp7.i{{.*}}, %land.lhs.true{{.*}} ], [ %tmp7.i{{.*}}, %land.lhs.true{{.*}} ], [ %tmp7.i{{.*}}, %land.lhs.true{{.*}} ] 73*9880d681SAndroid Build Coastguard Worker; CHECK: exit.3: 74*9880d681SAndroid Build Coastguard Workerdefine i32 @test3() nounwind uwtable ssp align 2 { 75*9880d681SAndroid Build Coastguard Workerentry: 76*9880d681SAndroid Build Coastguard Worker %cond1 = call zeroext i1 @check() 77*9880d681SAndroid Build Coastguard Worker br i1 %cond1, label %return, label %if.end 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Workerif.end: ; preds = %entry 80*9880d681SAndroid Build Coastguard Worker br label %do.body 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Workerdo.body: ; preds = %do.cond, %if.end 83*9880d681SAndroid Build Coastguard Worker %cond2 = call zeroext i1 @check() 84*9880d681SAndroid Build Coastguard Worker br i1 %cond2, label %exit, label %do.cond 85*9880d681SAndroid Build Coastguard Worker 86*9880d681SAndroid Build Coastguard Workerexit: ; preds = %do.body 87*9880d681SAndroid Build Coastguard Worker %tmp7.i = load i32, i32* undef, align 8 88*9880d681SAndroid Build Coastguard Worker br i1 undef, label %do.cond, label %land.lhs.true 89*9880d681SAndroid Build Coastguard Worker 90*9880d681SAndroid Build Coastguard Workerland.lhs.true: ; preds = %exit 91*9880d681SAndroid Build Coastguard Worker br i1 undef, label %return, label %do.cond 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Workerdo.cond: ; preds = %land.lhs.true, %exit, %do.body 94*9880d681SAndroid Build Coastguard Worker %cond3 = call zeroext i1 @check() 95*9880d681SAndroid Build Coastguard Worker br i1 %cond3, label %do.end, label %do.body 96*9880d681SAndroid Build Coastguard Worker 97*9880d681SAndroid Build Coastguard Workerdo.end: ; preds = %do.cond 98*9880d681SAndroid Build Coastguard Worker br label %return 99*9880d681SAndroid Build Coastguard Worker 100*9880d681SAndroid Build Coastguard Workerreturn: ; preds = %do.end, %land.lhs.true, %entry 101*9880d681SAndroid Build Coastguard Worker %retval.0 = phi i32 [ 0, %do.end ], [ 0, %entry ], [ %tmp7.i, %land.lhs.true ] 102*9880d681SAndroid Build Coastguard Worker ret i32 %retval.0 103*9880d681SAndroid Build Coastguard Worker} 104