1*9880d681SAndroid Build Coastguard Worker; RUN: opt -loop-rotate -disable-output -verify-dom-info -verify-loop-info < %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workertarget 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" 4*9880d681SAndroid Build Coastguard Workertarget triple = "x86_64-apple-darwin10.0.0" 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Worker; PR8955 - Rotating an outer loop that has a condbr for a latch block. 7*9880d681SAndroid Build Coastguard Workerdefine void @test1() nounwind ssp { 8*9880d681SAndroid Build Coastguard Workerentry: 9*9880d681SAndroid Build Coastguard Worker br label %lbl_283 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Workerlbl_283: ; preds = %if.end, %entry 12*9880d681SAndroid Build Coastguard Worker br i1 undef, label %if.else, label %if.then 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %lbl_283 15*9880d681SAndroid Build Coastguard Worker br i1 undef, label %if.end, label %for.condthread-pre-split 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Workerfor.condthread-pre-split: ; preds = %if.then 18*9880d681SAndroid Build Coastguard Worker br label %for.cond 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Workerfor.cond: ; preds = %for.cond, %for.condthread-pre-split 21*9880d681SAndroid Build Coastguard Worker br i1 undef, label %lbl_281, label %for.cond 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Workerlbl_281: ; preds = %if.end, %for.cond 24*9880d681SAndroid Build Coastguard Worker br label %if.end 25*9880d681SAndroid Build Coastguard Worker 26*9880d681SAndroid Build Coastguard Workerif.end: ; preds = %lbl_281, %if.then 27*9880d681SAndroid Build Coastguard Worker br i1 undef, label %lbl_283, label %lbl_281 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Workerif.else: ; preds = %lbl_283 30*9880d681SAndroid Build Coastguard Worker ret void 31*9880d681SAndroid Build Coastguard Worker} 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Worker %struct.relation = type { [4 x i16], i32, [4 x i16], i32, i32 } 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Workerdefine void @test2() { 36*9880d681SAndroid Build Coastguard Workerentry: 37*9880d681SAndroid Build Coastguard Worker br i1 false, label %bb139, label %bb10.i44 38*9880d681SAndroid Build Coastguard Workerbb10.i44: ; preds = %entry 39*9880d681SAndroid Build Coastguard Worker ret void 40*9880d681SAndroid Build Coastguard Workerbb127: ; preds = %bb139 41*9880d681SAndroid Build Coastguard Worker br label %bb139 42*9880d681SAndroid Build Coastguard Workerbb139: ; preds = %bb127, %entry 43*9880d681SAndroid Build Coastguard Worker br i1 false, label %bb127, label %bb142 44*9880d681SAndroid Build Coastguard Workerbb142: ; preds = %bb139 45*9880d681SAndroid Build Coastguard Worker %r91.0.lcssa = phi %struct.relation* [ null, %bb139 ] ; <%struct.relation*> [#uses=0] 46*9880d681SAndroid Build Coastguard Worker ret void 47*9880d681SAndroid Build Coastguard Worker} 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Workerdefine void @test3() { 51*9880d681SAndroid Build Coastguard Workerentry: 52*9880d681SAndroid Build Coastguard Worker br i1 false, label %bb139, label %cond_true 53*9880d681SAndroid Build Coastguard Workercond_true: ; preds = %entry 54*9880d681SAndroid Build Coastguard Worker ret void 55*9880d681SAndroid Build Coastguard Workerbb90: ; preds = %bb139 56*9880d681SAndroid Build Coastguard Worker br i1 false, label %bb136, label %cond_next121 57*9880d681SAndroid Build Coastguard Workercond_next121: ; preds = %bb90 58*9880d681SAndroid Build Coastguard Worker br i1 false, label %bb136, label %bb127 59*9880d681SAndroid Build Coastguard Workerbb127: ; preds = %cond_next121 60*9880d681SAndroid Build Coastguard Worker br label %bb136 61*9880d681SAndroid Build Coastguard Workerbb136: ; preds = %bb127, %cond_next121, %bb90 62*9880d681SAndroid Build Coastguard Worker %changes.1 = phi i32 [ %changes.2, %bb90 ], [ %changes.2, %cond_next121 ], [ 1, %bb127 ] ; <i32> [#uses=1] 63*9880d681SAndroid Build Coastguard Worker br label %bb139 64*9880d681SAndroid Build Coastguard Workerbb139: ; preds = %bb136, %entry 65*9880d681SAndroid Build Coastguard Worker %changes.2 = phi i32 [ %changes.1, %bb136 ], [ 0, %entry ] ; <i32> [#uses=3] 66*9880d681SAndroid Build Coastguard Worker br i1 false, label %bb90, label %bb142 67*9880d681SAndroid Build Coastguard Workerbb142: ; preds = %bb139 68*9880d681SAndroid Build Coastguard Worker %changes.2.lcssa = phi i32 [ %changes.2, %bb139 ] ; <i32> [#uses=0] 69*9880d681SAndroid Build Coastguard Worker ret void 70*9880d681SAndroid Build Coastguard Worker} 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Workerdefine void @test4() { 73*9880d681SAndroid Build Coastguard Workerentry: 74*9880d681SAndroid Build Coastguard Worker br i1 false, label %cond_false485, label %bb405 75*9880d681SAndroid Build Coastguard Workerbb405: ; preds = %entry 76*9880d681SAndroid Build Coastguard Worker ret void 77*9880d681SAndroid Build Coastguard Workercond_false485: ; preds = %entry 78*9880d681SAndroid Build Coastguard Worker br label %bb830 79*9880d681SAndroid Build Coastguard Workerbb511: ; preds = %bb830 80*9880d681SAndroid Build Coastguard Worker br i1 false, label %bb816, label %bb830 81*9880d681SAndroid Build Coastguard Workercond_next667: ; preds = %bb816 82*9880d681SAndroid Build Coastguard Worker br i1 false, label %cond_next695, label %bb680 83*9880d681SAndroid Build Coastguard Workerbb676: ; preds = %bb680 84*9880d681SAndroid Build Coastguard Worker br label %bb680 85*9880d681SAndroid Build Coastguard Workerbb680: ; preds = %bb676, %cond_next667 86*9880d681SAndroid Build Coastguard Worker %iftmp.68.0 = zext i1 false to i8 ; <i8> [#uses=1] 87*9880d681SAndroid Build Coastguard Worker br i1 false, label %bb676, label %cond_next695 88*9880d681SAndroid Build Coastguard Workercond_next695: ; preds = %bb680, %cond_next667 89*9880d681SAndroid Build Coastguard Worker %iftmp.68.2 = phi i8 [ %iftmp.68.0, %bb680 ], [ undef, %cond_next667 ] ; <i8> [#uses=0] 90*9880d681SAndroid Build Coastguard Worker ret void 91*9880d681SAndroid Build Coastguard Workerbb816: ; preds = %bb816, %bb511 92*9880d681SAndroid Build Coastguard Worker br i1 false, label %cond_next667, label %bb816 93*9880d681SAndroid Build Coastguard Workerbb830: ; preds = %bb511, %cond_false485 94*9880d681SAndroid Build Coastguard Worker br i1 false, label %bb511, label %bb835 95*9880d681SAndroid Build Coastguard Workerbb835: ; preds = %bb830 96*9880d681SAndroid Build Coastguard Worker ret void 97*9880d681SAndroid Build Coastguard Worker} 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Worker %struct.NSArray = type { %struct.NSObject } 100*9880d681SAndroid Build Coastguard Worker %struct.NSObject = type { %struct.objc_class* } 101*9880d681SAndroid Build Coastguard Worker %struct.NSRange = type { i64, i64 } 102*9880d681SAndroid Build Coastguard Worker %struct._message_ref_t = type { %struct.NSObject* (%struct.NSObject*, %struct._message_ref_t*, ...)*, %struct.objc_selector* } 103*9880d681SAndroid Build Coastguard Worker %struct.objc_class = type opaque 104*9880d681SAndroid Build Coastguard Worker %struct.objc_selector = type opaque 105*9880d681SAndroid Build Coastguard Worker@"\01L_OBJC_MESSAGE_REF_26" = external global %struct._message_ref_t ; <%struct._message_ref_t*> [#uses=1] 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Workerdefine %struct.NSArray* @test5(%struct.NSArray* %self, %struct._message_ref_t* %_cmd) { 108*9880d681SAndroid Build Coastguard Workerentry: 109*9880d681SAndroid Build Coastguard Worker br label %bb116 110*9880d681SAndroid Build Coastguard Worker 111*9880d681SAndroid Build Coastguard Workerbb116: ; preds = %bb131, %entry 112*9880d681SAndroid Build Coastguard Worker %tmp123 = call %struct.NSRange null( %struct.NSObject* null, %struct._message_ref_t* @"\01L_OBJC_MESSAGE_REF_26", %struct.NSArray* null ) ; <%struct.NSRange> [#uses=1] 113*9880d681SAndroid Build Coastguard Worker br i1 false, label %bb141, label %bb131 114*9880d681SAndroid Build Coastguard Worker 115*9880d681SAndroid Build Coastguard Workerbb131: ; preds = %bb116 116*9880d681SAndroid Build Coastguard Worker %mrv_gr125 = extractvalue %struct.NSRange %tmp123, 1 ; <i64> [#uses=0] 117*9880d681SAndroid Build Coastguard Worker br label %bb116 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard Workerbb141: ; preds = %bb116 120*9880d681SAndroid Build Coastguard Worker ret %struct.NSArray* null 121*9880d681SAndroid Build Coastguard Worker} 122*9880d681SAndroid Build Coastguard Worker 123*9880d681SAndroid Build Coastguard Workerdefine void @test6(i8* %msg) { 124*9880d681SAndroid Build Coastguard Workerentry: 125*9880d681SAndroid Build Coastguard Worker br label %bb15 126*9880d681SAndroid Build Coastguard Workerbb6: ; preds = %bb15 127*9880d681SAndroid Build Coastguard Worker %gep.upgrd.1 = zext i32 %offset.1 to i64 ; <i64> [#uses=1] 128*9880d681SAndroid Build Coastguard Worker %tmp11 = getelementptr i8, i8* %msg, i64 %gep.upgrd.1 ; <i8*> [#uses=0] 129*9880d681SAndroid Build Coastguard Worker br label %bb15 130*9880d681SAndroid Build Coastguard Workerbb15: ; preds = %bb6, %entry 131*9880d681SAndroid Build Coastguard Worker %offset.1 = add i32 0, 1 ; <i32> [#uses=2] 132*9880d681SAndroid Build Coastguard Worker br i1 false, label %bb6, label %bb17 133*9880d681SAndroid Build Coastguard Workerbb17: ; preds = %bb15 134*9880d681SAndroid Build Coastguard Worker %offset.1.lcssa = phi i32 [ %offset.1, %bb15 ] ; <i32> [#uses=0] 135*9880d681SAndroid Build Coastguard Worker %payload_type.1.lcssa = phi i32 [ 0, %bb15 ] ; <i32> [#uses=0] 136*9880d681SAndroid Build Coastguard Worker ret void 137*9880d681SAndroid Build Coastguard Worker} 138*9880d681SAndroid Build Coastguard Worker 139*9880d681SAndroid Build Coastguard Worker 140*9880d681SAndroid Build Coastguard Worker 141*9880d681SAndroid Build Coastguard Worker 142*9880d681SAndroid Build Coastguard Worker; PR9523 - Non-canonical loop. 143*9880d681SAndroid Build Coastguard Workerdefine void @test7(i8* %P) nounwind { 144*9880d681SAndroid Build Coastguard Workerentry: 145*9880d681SAndroid Build Coastguard Worker indirectbr i8* %P, [label %"3", label %"5"] 146*9880d681SAndroid Build Coastguard Worker 147*9880d681SAndroid Build Coastguard Worker"3": ; preds = %"4", %entry 148*9880d681SAndroid Build Coastguard Worker br i1 undef, label %"5", label %"4" 149*9880d681SAndroid Build Coastguard Worker 150*9880d681SAndroid Build Coastguard Worker"4": ; preds = %"3" 151*9880d681SAndroid Build Coastguard Worker br label %"3" 152*9880d681SAndroid Build Coastguard Worker 153*9880d681SAndroid Build Coastguard Worker"5": ; preds = %"3", %entry 154*9880d681SAndroid Build Coastguard Worker ret void 155*9880d681SAndroid Build Coastguard Worker} 156*9880d681SAndroid Build Coastguard Worker 157*9880d681SAndroid Build Coastguard Worker; PR21968 158*9880d681SAndroid Build Coastguard Workerdefine void @test8(i1 %C, i8* %P) #0 { 159*9880d681SAndroid Build Coastguard Workerentry: 160*9880d681SAndroid Build Coastguard Worker br label %for.cond 161*9880d681SAndroid Build Coastguard Worker 162*9880d681SAndroid Build Coastguard Workerfor.cond: ; preds = %for.inc, %entry 163*9880d681SAndroid Build Coastguard Worker br i1 %C, label %l_bad, label %for.body 164*9880d681SAndroid Build Coastguard Worker 165*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %for.cond 166*9880d681SAndroid Build Coastguard Worker indirectbr i8* %P, [label %for.inc, label %l_bad] 167*9880d681SAndroid Build Coastguard Worker 168*9880d681SAndroid Build Coastguard Workerfor.inc: ; preds = %for.body 169*9880d681SAndroid Build Coastguard Worker br label %for.cond 170*9880d681SAndroid Build Coastguard Worker 171*9880d681SAndroid Build Coastguard Workerl_bad: ; preds = %for.body, %for.cond 172*9880d681SAndroid Build Coastguard Worker ret void 173*9880d681SAndroid Build Coastguard Worker} 174