1*9880d681SAndroid Build Coastguard Worker; RUN: opt -loop-reduce < %s 2*9880d681SAndroid Build Coastguard Worker; we used to crash on this one 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Workerdeclare i8* @_Znwm() 5*9880d681SAndroid Build Coastguard Workerdeclare i32 @__gxx_personality_v0(...) 6*9880d681SAndroid Build Coastguard Workerdeclare void @g() 7*9880d681SAndroid Build Coastguard Workerdefine void @f() personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) { 8*9880d681SAndroid Build Coastguard Workerbb0: 9*9880d681SAndroid Build Coastguard Worker br label %bb1 10*9880d681SAndroid Build Coastguard Workerbb1: 11*9880d681SAndroid Build Coastguard Worker %v0 = phi i64 [ 0, %bb0 ], [ %v1, %bb1 ] 12*9880d681SAndroid Build Coastguard Worker %v1 = add nsw i64 %v0, 1 13*9880d681SAndroid Build Coastguard Worker br i1 undef, label %bb2, label %bb1 14*9880d681SAndroid Build Coastguard Workerbb2: 15*9880d681SAndroid Build Coastguard Worker %v2 = icmp eq i64 %v0, 0 16*9880d681SAndroid Build Coastguard Worker br i1 %v2, label %bb6, label %bb3 17*9880d681SAndroid Build Coastguard Workerbb3: 18*9880d681SAndroid Build Coastguard Worker %v3 = invoke noalias i8* @_Znwm() 19*9880d681SAndroid Build Coastguard Worker to label %bb5 unwind label %bb4 20*9880d681SAndroid Build Coastguard Workerbb4: 21*9880d681SAndroid Build Coastguard Worker %v4 = landingpad { i8*, i32 } 22*9880d681SAndroid Build Coastguard Worker cleanup 23*9880d681SAndroid Build Coastguard Worker br label %bb9 24*9880d681SAndroid Build Coastguard Workerbb5: 25*9880d681SAndroid Build Coastguard Worker %v5 = bitcast i8* %v3 to i32** 26*9880d681SAndroid Build Coastguard Worker %add.ptr.i = getelementptr inbounds i32*, i32** %v5, i64 %v0 27*9880d681SAndroid Build Coastguard Worker br label %bb6 28*9880d681SAndroid Build Coastguard Workerbb6: 29*9880d681SAndroid Build Coastguard Worker %v6 = phi i32** [ null, %bb2 ], [ %add.ptr.i, %bb5 ] 30*9880d681SAndroid Build Coastguard Worker invoke void @g() 31*9880d681SAndroid Build Coastguard Worker to label %bb7 unwind label %bb8 32*9880d681SAndroid Build Coastguard Workerbb7: 33*9880d681SAndroid Build Coastguard Worker unreachable 34*9880d681SAndroid Build Coastguard Workerbb8: 35*9880d681SAndroid Build Coastguard Worker %v7 = landingpad { i8*, i32 } 36*9880d681SAndroid Build Coastguard Worker cleanup 37*9880d681SAndroid Build Coastguard Worker br label %bb9 38*9880d681SAndroid Build Coastguard Workerbb9: 39*9880d681SAndroid Build Coastguard Worker resume { i8*, i32 } zeroinitializer 40*9880d681SAndroid Build Coastguard Worker} 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Workerdefine void @h() personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) { 44*9880d681SAndroid Build Coastguard Workerbb1: 45*9880d681SAndroid Build Coastguard Worker invoke void @g() optsize 46*9880d681SAndroid Build Coastguard Worker to label %bb2 unwind label %bb5 47*9880d681SAndroid Build Coastguard Workerbb2: 48*9880d681SAndroid Build Coastguard Worker %arrayctor.cur = phi i8* [ undef, %bb1 ], [ %arrayctor.next, %bb3 ] 49*9880d681SAndroid Build Coastguard Worker invoke void @g() optsize 50*9880d681SAndroid Build Coastguard Worker to label %bb3 unwind label %bb6 51*9880d681SAndroid Build Coastguard Workerbb3: 52*9880d681SAndroid Build Coastguard Worker %arrayctor.next = getelementptr inbounds i8, i8* %arrayctor.cur, i64 1 53*9880d681SAndroid Build Coastguard Worker br label %bb2 54*9880d681SAndroid Build Coastguard Workerbb4: 55*9880d681SAndroid Build Coastguard Worker ret void 56*9880d681SAndroid Build Coastguard Workerbb5: 57*9880d681SAndroid Build Coastguard Worker %tmp = landingpad { i8*, i32 } 58*9880d681SAndroid Build Coastguard Worker cleanup 59*9880d681SAndroid Build Coastguard Worker invoke void @g() optsize 60*9880d681SAndroid Build Coastguard Worker to label %bb4 unwind label %bb7 61*9880d681SAndroid Build Coastguard Workerbb6: 62*9880d681SAndroid Build Coastguard Worker %tmp1 = landingpad { i8*, i32 } 63*9880d681SAndroid Build Coastguard Worker cleanup 64*9880d681SAndroid Build Coastguard Worker %arraydestroy.isempty = icmp eq i8* undef, %arrayctor.cur 65*9880d681SAndroid Build Coastguard Worker ret void 66*9880d681SAndroid Build Coastguard Workerbb7: 67*9880d681SAndroid Build Coastguard Worker %lpad.nonloopexit = landingpad { i8*, i32 } 68*9880d681SAndroid Build Coastguard Worker catch i8* null 69*9880d681SAndroid Build Coastguard Worker ret void 70*9880d681SAndroid Build Coastguard Worker} 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Worker; PR17425 73*9880d681SAndroid Build Coastguard Workerdefine void @i() { 74*9880d681SAndroid Build Coastguard Workerentry: 75*9880d681SAndroid Build Coastguard Worker br label %while.cond 76*9880d681SAndroid Build Coastguard Worker 77*9880d681SAndroid Build Coastguard Workerwhile.cond: ; preds = %while.cond, %entry 78*9880d681SAndroid Build Coastguard Worker %c.0 = phi i16* [ undef, %entry ], [ %incdec.ptr, %while.cond ] 79*9880d681SAndroid Build Coastguard Worker %incdec.ptr = getelementptr inbounds i16, i16* %c.0, i64 1 80*9880d681SAndroid Build Coastguard Worker br i1 undef, label %while.cond1, label %while.cond 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Workerwhile.cond1: ; preds = %while.cond1, %while.cond 83*9880d681SAndroid Build Coastguard Worker %c.1 = phi i16* [ %incdec.ptr5, %while.cond1 ], [ %c.0, %while.cond ] 84*9880d681SAndroid Build Coastguard Worker %incdec.ptr5 = getelementptr inbounds i16, i16* %c.1, i64 1 85*9880d681SAndroid Build Coastguard Worker br i1 undef, label %while.cond7, label %while.cond1 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Workerwhile.cond7: ; preds = %while.cond7, %while.cond1 88*9880d681SAndroid Build Coastguard Worker %0 = phi i16* [ %incdec.ptr10, %while.cond7 ], [ %c.1, %while.cond1 ] 89*9880d681SAndroid Build Coastguard Worker %incdec.ptr10 = getelementptr inbounds i16, i16* %0, i64 1 90*9880d681SAndroid Build Coastguard Worker br i1 undef, label %while.cond12.preheader, label %while.cond7 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Workerwhile.cond12.preheader: ; preds = %while.cond7 93*9880d681SAndroid Build Coastguard Worker br i1 undef, label %while.end16, label %while.body13.lr.ph 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Workerwhile.body13: ; preds = %if.else, %while.body13.lr.ph 96*9880d681SAndroid Build Coastguard Worker %1 = phi i16* [ %2, %while.body13.lr.ph ], [ %incdec.ptr15, %if.else ] 97*9880d681SAndroid Build Coastguard Worker br i1 undef, label %while.cond12.outer.loopexit, label %if.else 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Workerwhile.cond12.outer.loopexit: ; preds = %while.body13 100*9880d681SAndroid Build Coastguard Worker br i1 undef, label %while.end16, label %while.body13.lr.ph 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Workerwhile.body13.lr.ph: ; preds = %while.cond12.outer.loopexit, %while.cond12.preheader 103*9880d681SAndroid Build Coastguard Worker %2 = phi i16* [ %1, %while.cond12.outer.loopexit ], [ undef, %while.cond12.preheader ] 104*9880d681SAndroid Build Coastguard Worker br label %while.body13 105*9880d681SAndroid Build Coastguard Worker 106*9880d681SAndroid Build Coastguard Workerif.else: ; preds = %while.body13 107*9880d681SAndroid Build Coastguard Worker %incdec.ptr15 = getelementptr inbounds i16, i16* %1, i64 1 108*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i16* %incdec.ptr15, %0 109*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %while.end16, label %while.body13 110*9880d681SAndroid Build Coastguard Worker 111*9880d681SAndroid Build Coastguard Workerwhile.end16: ; preds = %if.else, %while.cond12.outer.loopexit, %while.cond12.preheader 112*9880d681SAndroid Build Coastguard Worker ret void 113*9880d681SAndroid Build Coastguard Worker} 114