1fd5bccb8SFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2fd5bccb8SFlorian Hahn; RUN: opt -passes=loop-vectorize -force-vector-width=4 -force-vector-interleave=1 -S %s | FileCheck %s 3fd5bccb8SFlorian Hahn 4*b0da9984SFlorian Hahndefine i32 @sink_load_that_uses_for_past_other_loads(ptr noalias %A, ptr noalias %B) { 5*b0da9984SFlorian Hahn; CHECK-LABEL: @sink_load_that_uses_for_past_other_loads( 6fd5bccb8SFlorian Hahn; CHECK-NEXT: entry: 7fd5bccb8SFlorian Hahn; CHECK-NEXT: br label [[LOOP:%.*]] 8fd5bccb8SFlorian Hahn; CHECK: loop: 9fd5bccb8SFlorian Hahn; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ] 10fd5bccb8SFlorian Hahn; CHECK-NEXT: [[FOR:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[FOR_NEXT:%.*]], [[LOOP]] ] 11fd5bccb8SFlorian Hahn; CHECK-NEXT: [[RED:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[RED_NEXT:%.*]], [[LOOP]] ] 12fd5bccb8SFlorian Hahn; CHECK-NEXT: [[GEP_A:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[FOR]] 13fd5bccb8SFlorian Hahn; CHECK-NEXT: [[L_A:%.*]] = load i32, ptr [[GEP_A]], align 4 14fd5bccb8SFlorian Hahn; CHECK-NEXT: [[GEP_B:%.*]] = getelementptr inbounds i32, ptr [[B:%.*]], i32 [[IV]] 15fd5bccb8SFlorian Hahn; CHECK-NEXT: [[FOR_NEXT]] = load i32, ptr [[GEP_B]], align 4 16fd5bccb8SFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add i32 [[FOR]], [[L_A]] 17fd5bccb8SFlorian Hahn; CHECK-NEXT: [[RED_NEXT]] = add i32 [[RED]], [[ADD]] 18fd5bccb8SFlorian Hahn; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1 19fd5bccb8SFlorian Hahn; CHECK-NEXT: [[EC:%.*]] = icmp eq i32 [[IV_NEXT]], 1000 20fd5bccb8SFlorian Hahn; CHECK-NEXT: br i1 [[EC]], label [[EXIT:%.*]], label [[LOOP]] 21fd5bccb8SFlorian Hahn; CHECK: exit: 22fd5bccb8SFlorian Hahn; CHECK-NEXT: [[RED_NEXT_LCSSA:%.*]] = phi i32 [ [[RED_NEXT]], [[LOOP]] ] 23fd5bccb8SFlorian Hahn; CHECK-NEXT: ret i32 [[RED_NEXT_LCSSA]] 24fd5bccb8SFlorian Hahn; 25fd5bccb8SFlorian Hahnentry: 26fd5bccb8SFlorian Hahn br label %loop 27fd5bccb8SFlorian Hahn 28fd5bccb8SFlorian Hahnloop: 29fd5bccb8SFlorian Hahn %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] 30fd5bccb8SFlorian Hahn %for = phi i32 [ 0, %entry ], [ %for.next, %loop ] 31fd5bccb8SFlorian Hahn %red = phi i32 [ 0, %entry ], [ %red.next, %loop ] 32fd5bccb8SFlorian Hahn %gep.a = getelementptr inbounds i32, ptr %A, i32 %for 33fd5bccb8SFlorian Hahn %l.a = load i32, ptr %gep.a 34fd5bccb8SFlorian Hahn %gep.b = getelementptr inbounds i32, ptr %B, i32 %iv 35fd5bccb8SFlorian Hahn %for.next = load i32, ptr %gep.b 36fd5bccb8SFlorian Hahn %add = add i32 %for, %l.a 37fd5bccb8SFlorian Hahn %red.next = add i32 %red, %add 38fd5bccb8SFlorian Hahn %iv.next = add nuw nsw i32 %iv, 1 39fd5bccb8SFlorian Hahn %ec = icmp eq i32 %iv.next, 1000 40fd5bccb8SFlorian Hahn br i1 %ec, label %exit, label %loop 41fd5bccb8SFlorian Hahn 42fd5bccb8SFlorian Hahnexit: 43fd5bccb8SFlorian Hahn ret i32 %red.next 44fd5bccb8SFlorian Hahn} 45fd5bccb8SFlorian Hahn 46fd5bccb8SFlorian Hahndefine void @cannot_sink_load_past_mayalias_store(ptr noalias %A, ptr noalias %B) { 47fd5bccb8SFlorian Hahn; CHECK-LABEL: @cannot_sink_load_past_mayalias_store( 48fd5bccb8SFlorian Hahn; CHECK-NEXT: entry: 49fd5bccb8SFlorian Hahn; CHECK-NEXT: br label [[LOOP:%.*]] 50fd5bccb8SFlorian Hahn; CHECK: loop: 51fd5bccb8SFlorian Hahn; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ] 52fd5bccb8SFlorian Hahn; CHECK-NEXT: [[FOR:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[FOR_NEXT:%.*]], [[LOOP]] ] 53fd5bccb8SFlorian Hahn; CHECK-NEXT: [[GEP_A:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[FOR]] 54fd5bccb8SFlorian Hahn; CHECK-NEXT: [[L_A:%.*]] = load i32, ptr [[GEP_A]], align 4 55fd5bccb8SFlorian Hahn; CHECK-NEXT: [[GEP_A_2:%.*]] = getelementptr inbounds i32, ptr [[A]], i32 [[IV]] 56fd5bccb8SFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add i32 [[FOR]], [[L_A]] 57fd5bccb8SFlorian Hahn; CHECK-NEXT: store i32 [[ADD]], ptr [[GEP_A_2]], align 4 58fd5bccb8SFlorian Hahn; CHECK-NEXT: [[FOR_NEXT]] = load i32, ptr [[GEP_A_2]], align 4 59fd5bccb8SFlorian Hahn; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1 60fd5bccb8SFlorian Hahn; CHECK-NEXT: [[EC:%.*]] = icmp eq i32 [[IV_NEXT]], 1000 61fd5bccb8SFlorian Hahn; CHECK-NEXT: br i1 [[EC]], label [[EXIT:%.*]], label [[LOOP]] 62fd5bccb8SFlorian Hahn; CHECK: exit: 63fd5bccb8SFlorian Hahn; CHECK-NEXT: ret void 64fd5bccb8SFlorian Hahn; 65fd5bccb8SFlorian Hahnentry: 66fd5bccb8SFlorian Hahn br label %loop 67fd5bccb8SFlorian Hahn 68fd5bccb8SFlorian Hahnloop: 69fd5bccb8SFlorian Hahn %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] 70fd5bccb8SFlorian Hahn %for = phi i32 [ 0, %entry ], [ %for.next, %loop ] 71fd5bccb8SFlorian Hahn %gep.a = getelementptr inbounds i32, ptr %A, i32 %for 72fd5bccb8SFlorian Hahn %l.a = load i32, ptr %gep.a 73fd5bccb8SFlorian Hahn %gep.a.2 = getelementptr inbounds i32, ptr %A, i32 %iv 74fd5bccb8SFlorian Hahn %add = add i32 %for, %l.a 75fd5bccb8SFlorian Hahn store i32 %add, ptr %gep.a.2 76fd5bccb8SFlorian Hahn %for.next = load i32, ptr %gep.a.2 77fd5bccb8SFlorian Hahn %iv.next = add nuw nsw i32 %iv, 1 78fd5bccb8SFlorian Hahn %ec = icmp eq i32 %iv.next, 1000 79fd5bccb8SFlorian Hahn br i1 %ec, label %exit, label %loop 80fd5bccb8SFlorian Hahn 81fd5bccb8SFlorian Hahnexit: 82fd5bccb8SFlorian Hahn ret void 83fd5bccb8SFlorian Hahn} 84*b0da9984SFlorian Hahn 85*b0da9984SFlorian Hahndefine void @sink_store_that_uses_for_past_instructions(ptr noalias %A, ptr noalias %B) { 86*b0da9984SFlorian Hahn; CHECK-LABEL: @sink_store_that_uses_for_past_instructions( 87*b0da9984SFlorian Hahn; CHECK-NEXT: entry: 88*b0da9984SFlorian Hahn; CHECK-NEXT: br label [[LOOP:%.*]] 89*b0da9984SFlorian Hahn; CHECK: loop: 90*b0da9984SFlorian Hahn; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ] 91*b0da9984SFlorian Hahn; CHECK-NEXT: [[FOR:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[FOR_NEXT:%.*]], [[LOOP]] ] 92*b0da9984SFlorian Hahn; CHECK-NEXT: [[GEP_A:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[IV]] 93*b0da9984SFlorian Hahn; CHECK-NEXT: store i32 [[FOR]], ptr [[GEP_A]], align 4 94*b0da9984SFlorian Hahn; CHECK-NEXT: [[FOR_NEXT]] = add i32 [[IV]], 2 95*b0da9984SFlorian Hahn; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1 96*b0da9984SFlorian Hahn; CHECK-NEXT: [[EC:%.*]] = icmp eq i32 [[IV_NEXT]], 1000 97*b0da9984SFlorian Hahn; CHECK-NEXT: br i1 [[EC]], label [[EXIT:%.*]], label [[LOOP]] 98*b0da9984SFlorian Hahn; CHECK: exit: 99*b0da9984SFlorian Hahn; CHECK-NEXT: ret void 100*b0da9984SFlorian Hahn; 101*b0da9984SFlorian Hahnentry: 102*b0da9984SFlorian Hahn br label %loop 103*b0da9984SFlorian Hahn 104*b0da9984SFlorian Hahnloop: 105*b0da9984SFlorian Hahn %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] 106*b0da9984SFlorian Hahn %for = phi i32 [ 0, %entry ], [ %for.next, %loop ] 107*b0da9984SFlorian Hahn %gep.a = getelementptr inbounds i32, ptr %A, i32 %iv 108*b0da9984SFlorian Hahn store i32 %for, ptr %gep.a 109*b0da9984SFlorian Hahn %for.next = add i32 %iv, 2 110*b0da9984SFlorian Hahn %iv.next = add nuw nsw i32 %iv, 1 111*b0da9984SFlorian Hahn %ec = icmp eq i32 %iv.next, 1000 112*b0da9984SFlorian Hahn br i1 %ec, label %exit, label %loop 113*b0da9984SFlorian Hahn 114*b0da9984SFlorian Hahnexit: 115*b0da9984SFlorian Hahn ret void 116*b0da9984SFlorian Hahn} 117*b0da9984SFlorian Hahn 118*b0da9984SFlorian Hahndefine void @sink_store_past_non_aliasing_load(ptr noalias %A, ptr noalias %B) { 119*b0da9984SFlorian Hahn; CHECK-LABEL: @sink_store_past_non_aliasing_load( 120*b0da9984SFlorian Hahn; CHECK-NEXT: entry: 121*b0da9984SFlorian Hahn; CHECK-NEXT: br label [[LOOP:%.*]] 122*b0da9984SFlorian Hahn; CHECK: loop: 123*b0da9984SFlorian Hahn; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ] 124*b0da9984SFlorian Hahn; CHECK-NEXT: [[FOR:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[FOR_NEXT:%.*]], [[LOOP]] ] 125*b0da9984SFlorian Hahn; CHECK-NEXT: [[GEP_A:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[IV]] 126*b0da9984SFlorian Hahn; CHECK-NEXT: store i32 [[FOR]], ptr [[GEP_A]], align 4 127*b0da9984SFlorian Hahn; CHECK-NEXT: [[GEP_B:%.*]] = getelementptr inbounds i32, ptr [[B:%.*]], i32 [[IV]] 128*b0da9984SFlorian Hahn; CHECK-NEXT: [[FOR_NEXT]] = load i32, ptr [[GEP_B]], align 4 129*b0da9984SFlorian Hahn; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1 130*b0da9984SFlorian Hahn; CHECK-NEXT: [[EC:%.*]] = icmp eq i32 [[IV_NEXT]], 1000 131*b0da9984SFlorian Hahn; CHECK-NEXT: br i1 [[EC]], label [[EXIT:%.*]], label [[LOOP]] 132*b0da9984SFlorian Hahn; CHECK: exit: 133*b0da9984SFlorian Hahn; CHECK-NEXT: ret void 134*b0da9984SFlorian Hahn; 135*b0da9984SFlorian Hahnentry: 136*b0da9984SFlorian Hahn br label %loop 137*b0da9984SFlorian Hahn 138*b0da9984SFlorian Hahnloop: 139*b0da9984SFlorian Hahn %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] 140*b0da9984SFlorian Hahn %for = phi i32 [ 0, %entry ], [ %for.next, %loop ] 141*b0da9984SFlorian Hahn %gep.a = getelementptr inbounds i32, ptr %A, i32 %iv 142*b0da9984SFlorian Hahn store i32 %for, ptr %gep.a 143*b0da9984SFlorian Hahn %gep.b = getelementptr inbounds i32, ptr %B, i32 %iv 144*b0da9984SFlorian Hahn %for.next = load i32, ptr %gep.b 145*b0da9984SFlorian Hahn %iv.next = add nuw nsw i32 %iv, 1 146*b0da9984SFlorian Hahn %ec = icmp eq i32 %iv.next, 1000 147*b0da9984SFlorian Hahn br i1 %ec, label %exit, label %loop 148*b0da9984SFlorian Hahn 149*b0da9984SFlorian Hahnexit: 150*b0da9984SFlorian Hahn ret void 151*b0da9984SFlorian Hahn} 152*b0da9984SFlorian Hahn 153*b0da9984SFlorian Hahndefine void @sink_store_past_aliasing_load(ptr %A, ptr %B) { 154*b0da9984SFlorian Hahn; CHECK-LABEL: @sink_store_past_aliasing_load( 155*b0da9984SFlorian Hahn; CHECK-NEXT: entry: 156*b0da9984SFlorian Hahn; CHECK-NEXT: br label [[LOOP:%.*]] 157*b0da9984SFlorian Hahn; CHECK: loop: 158*b0da9984SFlorian Hahn; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ] 159*b0da9984SFlorian Hahn; CHECK-NEXT: [[FOR:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[FOR_NEXT:%.*]], [[LOOP]] ] 160*b0da9984SFlorian Hahn; CHECK-NEXT: [[GEP_A:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[IV]] 161*b0da9984SFlorian Hahn; CHECK-NEXT: store i32 [[FOR]], ptr [[GEP_A]], align 4 162*b0da9984SFlorian Hahn; CHECK-NEXT: [[GEP_B:%.*]] = getelementptr inbounds i32, ptr [[B:%.*]], i32 [[IV]] 163*b0da9984SFlorian Hahn; CHECK-NEXT: [[FOR_NEXT]] = load i32, ptr [[GEP_B]], align 4 164*b0da9984SFlorian Hahn; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1 165*b0da9984SFlorian Hahn; CHECK-NEXT: [[EC:%.*]] = icmp eq i32 [[IV_NEXT]], 1000 166*b0da9984SFlorian Hahn; CHECK-NEXT: br i1 [[EC]], label [[EXIT:%.*]], label [[LOOP]] 167*b0da9984SFlorian Hahn; CHECK: exit: 168*b0da9984SFlorian Hahn; CHECK-NEXT: ret void 169*b0da9984SFlorian Hahn; 170*b0da9984SFlorian Hahnentry: 171*b0da9984SFlorian Hahn br label %loop 172*b0da9984SFlorian Hahn 173*b0da9984SFlorian Hahnloop: 174*b0da9984SFlorian Hahn %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] 175*b0da9984SFlorian Hahn %for = phi i32 [ 0, %entry ], [ %for.next, %loop ] 176*b0da9984SFlorian Hahn %gep.a = getelementptr inbounds i32, ptr %A, i32 %iv 177*b0da9984SFlorian Hahn store i32 %for, ptr %gep.a 178*b0da9984SFlorian Hahn %gep.b = getelementptr inbounds i32, ptr %B, i32 %iv 179*b0da9984SFlorian Hahn %for.next = load i32, ptr %gep.b 180*b0da9984SFlorian Hahn %iv.next = add nuw nsw i32 %iv, 1 181*b0da9984SFlorian Hahn %ec = icmp eq i32 %iv.next, 1000 182*b0da9984SFlorian Hahn br i1 %ec, label %exit, label %loop 183*b0da9984SFlorian Hahn 184*b0da9984SFlorian Hahnexit: 185*b0da9984SFlorian Hahn ret void 186*b0da9984SFlorian Hahn} 187*b0da9984SFlorian Hahn 188*b0da9984SFlorian Hahndefine void @sink_store_past_non_aliasing_store(ptr noalias %A, ptr noalias %B) { 189*b0da9984SFlorian Hahn; CHECK-LABEL: @sink_store_past_non_aliasing_store( 190*b0da9984SFlorian Hahn; CHECK-NEXT: entry: 191*b0da9984SFlorian Hahn; CHECK-NEXT: br label [[LOOP:%.*]] 192*b0da9984SFlorian Hahn; CHECK: loop: 193*b0da9984SFlorian Hahn; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ] 194*b0da9984SFlorian Hahn; CHECK-NEXT: [[FOR:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[FOR_NEXT:%.*]], [[LOOP]] ] 195*b0da9984SFlorian Hahn; CHECK-NEXT: [[GEP_A:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[IV]] 196*b0da9984SFlorian Hahn; CHECK-NEXT: store i32 [[FOR]], ptr [[GEP_A]], align 4 197*b0da9984SFlorian Hahn; CHECK-NEXT: [[GEP_B:%.*]] = getelementptr inbounds i32, ptr [[B:%.*]], i32 [[IV]] 198*b0da9984SFlorian Hahn; CHECK-NEXT: store i32 123, ptr [[GEP_B]], align 4 199*b0da9984SFlorian Hahn; CHECK-NEXT: [[FOR_NEXT]] = add i32 [[IV]], 2 200*b0da9984SFlorian Hahn; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1 201*b0da9984SFlorian Hahn; CHECK-NEXT: [[EC:%.*]] = icmp eq i32 [[IV_NEXT]], 1000 202*b0da9984SFlorian Hahn; CHECK-NEXT: br i1 [[EC]], label [[EXIT:%.*]], label [[LOOP]] 203*b0da9984SFlorian Hahn; CHECK: exit: 204*b0da9984SFlorian Hahn; CHECK-NEXT: ret void 205*b0da9984SFlorian Hahn; 206*b0da9984SFlorian Hahnentry: 207*b0da9984SFlorian Hahn br label %loop 208*b0da9984SFlorian Hahn 209*b0da9984SFlorian Hahnloop: 210*b0da9984SFlorian Hahn %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] 211*b0da9984SFlorian Hahn %for = phi i32 [ 0, %entry ], [ %for.next, %loop ] 212*b0da9984SFlorian Hahn %gep.a = getelementptr inbounds i32, ptr %A, i32 %iv 213*b0da9984SFlorian Hahn store i32 %for, ptr %gep.a 214*b0da9984SFlorian Hahn %gep.b = getelementptr inbounds i32, ptr %B, i32 %iv 215*b0da9984SFlorian Hahn store i32 123, ptr %gep.b 216*b0da9984SFlorian Hahn %for.next = add i32 %iv, 2 217*b0da9984SFlorian Hahn %iv.next = add nuw nsw i32 %iv, 1 218*b0da9984SFlorian Hahn %ec = icmp eq i32 %iv.next, 1000 219*b0da9984SFlorian Hahn br i1 %ec, label %exit, label %loop 220*b0da9984SFlorian Hahn 221*b0da9984SFlorian Hahnexit: 222*b0da9984SFlorian Hahn ret void 223*b0da9984SFlorian Hahn} 224*b0da9984SFlorian Hahn 225*b0da9984SFlorian Hahndefine void @sink_store_past_aliasing_store(ptr %A, ptr %B) { 226*b0da9984SFlorian Hahn; CHECK-LABEL: @sink_store_past_aliasing_store( 227*b0da9984SFlorian Hahn; CHECK-NEXT: entry: 228*b0da9984SFlorian Hahn; CHECK-NEXT: br label [[LOOP:%.*]] 229*b0da9984SFlorian Hahn; CHECK: loop: 230*b0da9984SFlorian Hahn; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ] 231*b0da9984SFlorian Hahn; CHECK-NEXT: [[FOR:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[FOR_NEXT:%.*]], [[LOOP]] ] 232*b0da9984SFlorian Hahn; CHECK-NEXT: [[GEP_A:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[IV]] 233*b0da9984SFlorian Hahn; CHECK-NEXT: store i32 [[FOR]], ptr [[GEP_A]], align 4 234*b0da9984SFlorian Hahn; CHECK-NEXT: [[GEP_B:%.*]] = getelementptr inbounds i32, ptr [[B:%.*]], i32 [[IV]] 235*b0da9984SFlorian Hahn; CHECK-NEXT: store i32 123, ptr [[GEP_B]], align 4 236*b0da9984SFlorian Hahn; CHECK-NEXT: [[FOR_NEXT]] = add i32 [[IV]], 2 237*b0da9984SFlorian Hahn; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1 238*b0da9984SFlorian Hahn; CHECK-NEXT: [[EC:%.*]] = icmp eq i32 [[IV_NEXT]], 1000 239*b0da9984SFlorian Hahn; CHECK-NEXT: br i1 [[EC]], label [[EXIT:%.*]], label [[LOOP]] 240*b0da9984SFlorian Hahn; CHECK: exit: 241*b0da9984SFlorian Hahn; CHECK-NEXT: ret void 242*b0da9984SFlorian Hahn; 243*b0da9984SFlorian Hahnentry: 244*b0da9984SFlorian Hahn br label %loop 245*b0da9984SFlorian Hahn 246*b0da9984SFlorian Hahnloop: 247*b0da9984SFlorian Hahn %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] 248*b0da9984SFlorian Hahn %for = phi i32 [ 0, %entry ], [ %for.next, %loop ] 249*b0da9984SFlorian Hahn %gep.a = getelementptr inbounds i32, ptr %A, i32 %iv 250*b0da9984SFlorian Hahn store i32 %for, ptr %gep.a 251*b0da9984SFlorian Hahn %gep.b = getelementptr inbounds i32, ptr %B, i32 %iv 252*b0da9984SFlorian Hahn store i32 123, ptr %gep.b 253*b0da9984SFlorian Hahn %for.next = add i32 %iv, 2 254*b0da9984SFlorian Hahn %iv.next = add nuw nsw i32 %iv, 1 255*b0da9984SFlorian Hahn %ec = icmp eq i32 %iv.next, 1000 256*b0da9984SFlorian Hahn br i1 %ec, label %exit, label %loop 257*b0da9984SFlorian Hahn 258*b0da9984SFlorian Hahnexit: 259*b0da9984SFlorian Hahn ret void 260*b0da9984SFlorian Hahn} 261