175ae20366fd1b480f4cc38400bb075c43c9f4f7fAndrew Trick; RUN: opt -loop-reduce -S < %s | FileCheck %s 275ae20366fd1b480f4cc38400bb075c43c9f4f7fAndrew Trick; 375ae20366fd1b480f4cc38400bb075c43c9f4f7fAndrew Trick; <rdar://problem/11049788> Segmentation fault: 11 in LoopStrengthReduce 475ae20366fd1b480f4cc38400bb075c43c9f4f7fAndrew Trick 575ae20366fd1b480f4cc38400bb075c43c9f4f7fAndrew Tricktarget datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" 675ae20366fd1b480f4cc38400bb075c43c9f4f7fAndrew Tricktarget triple = "x86_64-apple-darwin10.0.0" 775ae20366fd1b480f4cc38400bb075c43c9f4f7fAndrew Trick 875ae20366fd1b480f4cc38400bb075c43c9f4f7fAndrew Trick; IVUsers should not consider tmp128 a valid user because it is not in a 975ae20366fd1b480f4cc38400bb075c43c9f4f7fAndrew Trick; simplified loop nest. 1039f4e8d9cce22b60a3417a5f17c847fa5b1daebfStephen Lin; CHECK-LABEL: @nopreheader( 1175ae20366fd1b480f4cc38400bb075c43c9f4f7fAndrew Trick; CHECK: for.cond: 1275ae20366fd1b480f4cc38400bb075c43c9f4f7fAndrew Trick; CHECK: %tmp128 = add i64 %0, %indvar65 1375ae20366fd1b480f4cc38400bb075c43c9f4f7fAndrew Trickdefine void @nopreheader(i8* %cmd) nounwind ssp { 1475ae20366fd1b480f4cc38400bb075c43c9f4f7fAndrew Trickentry: 1575ae20366fd1b480f4cc38400bb075c43c9f4f7fAndrew Trick indirectbr i8* undef, [label %while.cond] 1675ae20366fd1b480f4cc38400bb075c43c9f4f7fAndrew Trick 1775ae20366fd1b480f4cc38400bb075c43c9f4f7fAndrew Trickwhile.cond: ; preds = %while.body, %entry 1875ae20366fd1b480f4cc38400bb075c43c9f4f7fAndrew Trick %0 = phi i64 [ %indvar.next48, %while.body ], [ 0, %entry ] 1975ae20366fd1b480f4cc38400bb075c43c9f4f7fAndrew Trick indirectbr i8* undef, [label %while.end, label %while.body] 2075ae20366fd1b480f4cc38400bb075c43c9f4f7fAndrew Trick 2175ae20366fd1b480f4cc38400bb075c43c9f4f7fAndrew Trickwhile.body: ; preds = %lor.rhs, %lor.lhs.false17, %lor.lhs.false11, %lor.lhs.false, %land.rhs 2275ae20366fd1b480f4cc38400bb075c43c9f4f7fAndrew Trick %indvar.next48 = add i64 %0, 1 2375ae20366fd1b480f4cc38400bb075c43c9f4f7fAndrew Trick indirectbr i8* undef, [label %while.cond] 2475ae20366fd1b480f4cc38400bb075c43c9f4f7fAndrew Trick 2575ae20366fd1b480f4cc38400bb075c43c9f4f7fAndrew Trickwhile.end: ; preds = %lor.rhs, %while.cond 2675ae20366fd1b480f4cc38400bb075c43c9f4f7fAndrew Trick indirectbr i8* undef, [label %if.end152] 2775ae20366fd1b480f4cc38400bb075c43c9f4f7fAndrew Trick 2875ae20366fd1b480f4cc38400bb075c43c9f4f7fAndrew Trickif.end152: ; preds = %lor.lhs.false144, %if.end110 2975ae20366fd1b480f4cc38400bb075c43c9f4f7fAndrew Trick indirectbr i8* undef, [label %lor.lhs.false184, label %for.cond] 3075ae20366fd1b480f4cc38400bb075c43c9f4f7fAndrew Trick 3175ae20366fd1b480f4cc38400bb075c43c9f4f7fAndrew Tricklor.lhs.false184: ; preds = %lor.lhs.false177 3275ae20366fd1b480f4cc38400bb075c43c9f4f7fAndrew Trick indirectbr i8* undef, [label %return, label %for.cond] 3375ae20366fd1b480f4cc38400bb075c43c9f4f7fAndrew Trick 3475ae20366fd1b480f4cc38400bb075c43c9f4f7fAndrew Trickfor.cond: ; preds = %for.inc, %lor.lhs.false184, %if.end152 3575ae20366fd1b480f4cc38400bb075c43c9f4f7fAndrew Trick %indvar65 = phi i64 [ %indvar.next66, %for.inc ], [ 0, %lor.lhs.false184 ], [ 0, %if.end152 ] 3675ae20366fd1b480f4cc38400bb075c43c9f4f7fAndrew Trick %tmp128 = add i64 %0, %indvar65 3775ae20366fd1b480f4cc38400bb075c43c9f4f7fAndrew Trick %s.4 = getelementptr i8* %cmd, i64 %tmp128 3875ae20366fd1b480f4cc38400bb075c43c9f4f7fAndrew Trick %tmp195 = load i8* %s.4, align 1 3975ae20366fd1b480f4cc38400bb075c43c9f4f7fAndrew Trick indirectbr i8* undef, [label %return, label %land.rhs198] 4075ae20366fd1b480f4cc38400bb075c43c9f4f7fAndrew Trick 4175ae20366fd1b480f4cc38400bb075c43c9f4f7fAndrew Trickland.rhs198: ; preds = %for.cond 4275ae20366fd1b480f4cc38400bb075c43c9f4f7fAndrew Trick indirectbr i8* undef, [label %return, label %for.inc] 4375ae20366fd1b480f4cc38400bb075c43c9f4f7fAndrew Trick 4475ae20366fd1b480f4cc38400bb075c43c9f4f7fAndrew Trickfor.inc: ; preds = %lor.rhs234, %land.lhs.true228, %land.lhs.true216, %land.lhs.true204 4575ae20366fd1b480f4cc38400bb075c43c9f4f7fAndrew Trick %indvar.next66 = add i64 %indvar65, 1 4675ae20366fd1b480f4cc38400bb075c43c9f4f7fAndrew Trick indirectbr i8* undef, [label %for.cond] 4775ae20366fd1b480f4cc38400bb075c43c9f4f7fAndrew Trick 4875ae20366fd1b480f4cc38400bb075c43c9f4f7fAndrew Trickreturn: ; preds = %if.end677, %doshell, %if.then96 4975ae20366fd1b480f4cc38400bb075c43c9f4f7fAndrew Trick ret void 5075ae20366fd1b480f4cc38400bb075c43c9f4f7fAndrew Trick} 51f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trick 52a3b10b83597dabd926a5153ac2eb867e7920f471Andrew Trick; Another case with a dominating loop that does not contain the IV 53a3b10b83597dabd926a5153ac2eb867e7920f471Andrew Trick; User. Just make sure it doesn't assert. 54f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trickdefine void @nopreheader2() nounwind ssp { 55f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trickentry: 56f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trick indirectbr i8* undef, [label %while.cond, label %return] 57f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trick 58f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trickwhile.cond: ; preds = %while.cond.backedge, %entry 59f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trick indirectbr i8* undef, [label %while.cond.backedge, label %lor.rhs] 60f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trick 61f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Tricklor.rhs: ; preds = %while.cond 62f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trick indirectbr i8* undef, [label %while.cond.backedge, label %while.end] 63f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trick 64f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trickwhile.cond.backedge: ; preds = %lor.rhs, %while.cond 65f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trick indirectbr i8* undef, [label %while.cond] 66f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trick 67f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trickwhile.end: ; preds = %lor.rhs 68f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trick indirectbr i8* undef, [label %if.then18, label %return] 69f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trick 70f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trickif.then18: ; preds = %while.end 71f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trick indirectbr i8* undef, [label %if.end35, label %lor.lhs.false] 72f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trick 73f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Tricklor.lhs.false: ; preds = %if.then18 74f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trick indirectbr i8* undef, [label %if.end35, label %return] 75f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trick 76f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trickif.end35: ; preds = %lor.lhs.false, %if.then18 77f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trick indirectbr i8* undef, [label %while.cond36] 78f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trick 79f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trickwhile.cond36: ; preds = %while.body49, %if.end35 80f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trick %0 = phi i64 [ %indvar.next13, %while.body49 ], [ 0, %if.end35 ] 81f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trick indirectbr i8* undef, [label %while.body49, label %lor.rhs42] 82f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trick 83f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Tricklor.rhs42: ; preds = %while.cond36 84f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trick indirectbr i8* undef, [label %while.body49, label %while.end52] 85f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trick 86f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trickwhile.body49: ; preds = %lor.rhs42, %while.cond36 87f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trick %indvar.next13 = add i64 %0, 1 88f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trick indirectbr i8* undef, [label %while.cond36] 89f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trick 90f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trickwhile.end52: ; preds = %lor.rhs42 91f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trick indirectbr i8* undef, [label %land.lhs.true, label %return] 92f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trick 93f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trickland.lhs.true: ; preds = %while.end52 94f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trick indirectbr i8* undef, [label %while.cond66.preheader, label %return] 95f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trick 96f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trickwhile.cond66.preheader: ; preds = %land.lhs.true 97f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trick indirectbr i8* undef, [label %while.cond66] 98f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trick 99f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trickwhile.cond66: ; preds = %while.body77, %while.cond66.preheader 100f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trick indirectbr i8* undef, [label %land.rhs, label %while.cond81.preheader] 101f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trick 102f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trickland.rhs: ; preds = %while.cond66 103f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trick indirectbr i8* undef, [label %while.body77, label %while.cond81.preheader] 104f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trick 105f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trickwhile.cond81.preheader: ; preds = %land.rhs, %while.cond66 106f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trick %tmp45 = add i64 undef, %0 107f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trick %tmp46 = add i64 %tmp45, undef 108f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trick indirectbr i8* undef, [label %while.cond81] 109f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trick 110f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trickwhile.body77: ; preds = %land.rhs 111f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trick indirectbr i8* undef, [label %while.cond66] 112f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trick 113f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trickwhile.cond81: ; preds = %while.body94, %while.cond81.preheader 114f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trick %tmp25 = add i64 %tmp46, undef 115f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trick indirectbr i8* undef, [label %while.body94, label %lor.rhs87] 116f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trick 117f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Tricklor.rhs87: ; preds = %while.cond81 118f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trick indirectbr i8* undef, [label %while.body94, label %return] 119f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trick 120f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trickwhile.body94: ; preds = %lor.rhs87, %while.cond81 121f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trick indirectbr i8* undef, [label %while.cond81] 122f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trick 123f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trickreturn: ; preds = %if.end216, %land.lhs.true183, %land.lhs.true, %while.end52, %lor.lhs.false, %while.end, %entry 124f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trick ret void 125f9492288bbc51e5d34f19ba53dc778bc83be807cAndrew Trick} 126a3b10b83597dabd926a5153ac2eb867e7920f471Andrew Trick 127a3b10b83597dabd926a5153ac2eb867e7920f471Andrew Trick; Test a phi operand IV User dominated by a no-preheader loop. 128a3b10b83597dabd926a5153ac2eb867e7920f471Andrew Trickdefine void @nopreheader3() nounwind uwtable ssp align 2 { 129a3b10b83597dabd926a5153ac2eb867e7920f471Andrew Trickentry: 130a3b10b83597dabd926a5153ac2eb867e7920f471Andrew Trick indirectbr i8* blockaddress(@nopreheader3, %if.end10), [label %if.end22, label %if.end10] 131a3b10b83597dabd926a5153ac2eb867e7920f471Andrew Trick 132a3b10b83597dabd926a5153ac2eb867e7920f471Andrew Trickif.end10: ; preds = %entry 133a3b10b83597dabd926a5153ac2eb867e7920f471Andrew Trick indirectbr i8* blockaddress(@nopreheader3, %if.end6.i), [label %if.end22, label %if.end6.i] 134a3b10b83597dabd926a5153ac2eb867e7920f471Andrew Trick 135a3b10b83597dabd926a5153ac2eb867e7920f471Andrew Trickif.end6.i: ; preds = %if.end10 136a3b10b83597dabd926a5153ac2eb867e7920f471Andrew Trick indirectbr i8* blockaddress(@nopreheader3, %while.cond2.preheader.i.i), [label %if.then12, label %while.cond2.preheader.i.i] 137a3b10b83597dabd926a5153ac2eb867e7920f471Andrew Trick 138a3b10b83597dabd926a5153ac2eb867e7920f471Andrew Trickwhile.cond2.preheader.i.i: ; preds = %while.end.i18.i, %if.end6.i 139a3b10b83597dabd926a5153ac2eb867e7920f471Andrew Trick indirectbr i8* blockaddress(@nopreheader3, %while.cond2.i.i), [label %while.cond2.i.i] 140a3b10b83597dabd926a5153ac2eb867e7920f471Andrew Trick 141a3b10b83597dabd926a5153ac2eb867e7920f471Andrew Trickwhile.cond2.i.i: ; preds = %while.cond2.i.i, %while.cond2.preheader.i.i 142a3b10b83597dabd926a5153ac2eb867e7920f471Andrew Trick %i1.1.i14.i = phi i32 [ %add.i15.i, %while.cond2.i.i ], [ undef, %while.cond2.preheader.i.i ] 143a3b10b83597dabd926a5153ac2eb867e7920f471Andrew Trick %add.i15.i = add nsw i32 %i1.1.i14.i, undef 144a3b10b83597dabd926a5153ac2eb867e7920f471Andrew Trick indirectbr i8* blockaddress(@nopreheader3, %while.end.i18.i), [label %while.cond2.i.i, label %while.end.i18.i] 145a3b10b83597dabd926a5153ac2eb867e7920f471Andrew Trick 146a3b10b83597dabd926a5153ac2eb867e7920f471Andrew Trickwhile.end.i18.i: ; preds = %while.cond2.i.i 147a3b10b83597dabd926a5153ac2eb867e7920f471Andrew Trick indirectbr i8* blockaddress(@nopreheader3, %while.cond2.preheader.i.i), [label %if.then12, label %while.cond2.preheader.i.i] 148a3b10b83597dabd926a5153ac2eb867e7920f471Andrew Trick 149a3b10b83597dabd926a5153ac2eb867e7920f471Andrew Trickif.then12: ; preds = %while.end.i18.i, %if.end6.i 150a3b10b83597dabd926a5153ac2eb867e7920f471Andrew Trick %i1.0.lcssa.i.i = phi i32 [ undef, %if.end6.i ], [ %i1.1.i14.i, %while.end.i18.i ] 151a3b10b83597dabd926a5153ac2eb867e7920f471Andrew Trick indirectbr i8* blockaddress(@nopreheader3, %if.end22), [label %if.end22] 152a3b10b83597dabd926a5153ac2eb867e7920f471Andrew Trick 153a3b10b83597dabd926a5153ac2eb867e7920f471Andrew Trickif.end22: ; preds = %if.then12, %if.end10, %entry 154a3b10b83597dabd926a5153ac2eb867e7920f471Andrew Trick ret void 155a3b10b83597dabd926a5153ac2eb867e7920f471Andrew Trick} 156