123c95345SAnna Welker; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 22e14900dSBjorn Pettersson; RUN: opt < %s -passes=loop-vectorize -force-vector-interleave=1 -force-vector-width=4 -S | FileCheck %s 323c95345SAnna Welkertarget datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" 423c95345SAnna Welker 523c95345SAnna Welker 623c95345SAnna Welker; Function Attrs: nofree norecurse nounwind 723c95345SAnna Welkerdefine void @a(i8* readnone %b) { 823c95345SAnna Welker; CHECK-LABEL: @a( 9278aa65cSJuneyoung Lee; CHECK-NEXT: entry: 10278aa65cSJuneyoung Lee; CHECK-NEXT: [[B1:%.*]] = ptrtoint i8* [[B:%.*]] to i64 11278aa65cSJuneyoung Lee; CHECK-NEXT: [[CMP_NOT4:%.*]] = icmp eq i8* [[B]], null 12278aa65cSJuneyoung Lee; CHECK-NEXT: br i1 [[CMP_NOT4]], label [[FOR_COND_CLEANUP:%.*]], label [[FOR_BODY_PREHEADER:%.*]] 13278aa65cSJuneyoung Lee; CHECK: for.body.preheader: 14278aa65cSJuneyoung Lee; CHECK-NEXT: [[TMP0:%.*]] = sub i64 0, [[B1]] 158f3d1690SEli Friedman; CHECK-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[TMP0]], 4 16278aa65cSJuneyoung Lee; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK]], label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]] 1723c95345SAnna Welker; CHECK: vector.ph: 188f3d1690SEli Friedman; CHECK-NEXT: [[N_MOD_VF:%.*]] = urem i64 [[TMP0]], 4 198f3d1690SEli Friedman; CHECK-NEXT: [[N_VEC:%.*]] = sub i64 [[TMP0]], [[N_MOD_VF]] 2023c95345SAnna Welker; CHECK-NEXT: [[TMP1:%.*]] = mul i64 [[N_VEC]], -1 2123c95345SAnna Welker; CHECK-NEXT: [[IND_END:%.*]] = getelementptr i8, i8* null, i64 [[TMP1]] 2223c95345SAnna Welker; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 2323c95345SAnna Welker; CHECK: vector.body: 2428a4deabSSander de Smalen; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[PRED_STORE_CONTINUE10:%.*]] ] 2528a4deabSSander de Smalen; CHECK-NEXT: [[TMP2:%.*]] = add i64 [[INDEX]], 0 2628a4deabSSander de Smalen; CHECK-NEXT: [[TMP3:%.*]] = mul i64 [[TMP2]], -1 2728a4deabSSander de Smalen; CHECK-NEXT: [[NEXT_GEP:%.*]] = getelementptr i8, i8* null, i64 [[TMP3]] 2828a4deabSSander de Smalen; CHECK-NEXT: [[TMP4:%.*]] = getelementptr inbounds i8, i8* [[NEXT_GEP]], i64 -1 2928a4deabSSander de Smalen; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds i8, i8* [[TMP4]], i32 0 3028a4deabSSander de Smalen; CHECK-NEXT: [[TMP6:%.*]] = getelementptr inbounds i8, i8* [[TMP5]], i32 -3 3123c95345SAnna Welker; CHECK-NEXT: [[TMP7:%.*]] = bitcast i8* [[TMP6]] to <4 x i8>* 3223c95345SAnna Welker; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, <4 x i8>* [[TMP7]], align 1 33278aa65cSJuneyoung Lee; CHECK-NEXT: [[REVERSE:%.*]] = shufflevector <4 x i8> [[WIDE_LOAD]], <4 x i8> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0> 3423c95345SAnna Welker; CHECK-NEXT: [[TMP8:%.*]] = icmp eq <4 x i8> [[REVERSE]], zeroinitializer 3523c95345SAnna Welker; CHECK-NEXT: [[TMP9:%.*]] = xor <4 x i1> [[TMP8]], <i1 true, i1 true, i1 true, i1 true> 3623c95345SAnna Welker; CHECK-NEXT: [[TMP10:%.*]] = extractelement <4 x i1> [[TMP9]], i32 0 37278aa65cSJuneyoung Lee; CHECK-NEXT: br i1 [[TMP10]], label [[PRED_STORE_IF:%.*]], label [[PRED_STORE_CONTINUE:%.*]] 38278aa65cSJuneyoung Lee; CHECK: pred.store.if: 39*bc19b7c3SFlorian Hahn; CHECK-NEXT: store i8 95, i8* [[TMP4]], align 1 40278aa65cSJuneyoung Lee; CHECK-NEXT: br label [[PRED_STORE_CONTINUE]] 41278aa65cSJuneyoung Lee; CHECK: pred.store.continue: 42278aa65cSJuneyoung Lee; CHECK-NEXT: [[TMP12:%.*]] = extractelement <4 x i1> [[TMP9]], i32 1 4328a4deabSSander de Smalen; CHECK-NEXT: br i1 [[TMP12]], label [[PRED_STORE_IF5:%.*]], label [[PRED_STORE_CONTINUE6:%.*]] 4428a4deabSSander de Smalen; CHECK: pred.store.if5: 4528a4deabSSander de Smalen; CHECK-NEXT: [[TMP13:%.*]] = add i64 [[INDEX]], 1 4628a4deabSSander de Smalen; CHECK-NEXT: [[TMP14:%.*]] = mul i64 [[TMP13]], -1 4728a4deabSSander de Smalen; CHECK-NEXT: [[NEXT_GEP2:%.*]] = getelementptr i8, i8* null, i64 [[TMP14]] 4828a4deabSSander de Smalen; CHECK-NEXT: [[TMP15:%.*]] = getelementptr inbounds i8, i8* [[NEXT_GEP2]], i64 -1 49278aa65cSJuneyoung Lee; CHECK-NEXT: store i8 95, i8* [[TMP15]], align 1 5028a4deabSSander de Smalen; CHECK-NEXT: br label [[PRED_STORE_CONTINUE6]] 5128a4deabSSander de Smalen; CHECK: pred.store.continue6: 5228a4deabSSander de Smalen; CHECK-NEXT: [[TMP16:%.*]] = extractelement <4 x i1> [[TMP9]], i32 2 5328a4deabSSander de Smalen; CHECK-NEXT: br i1 [[TMP16]], label [[PRED_STORE_IF7:%.*]], label [[PRED_STORE_CONTINUE8:%.*]] 5428a4deabSSander de Smalen; CHECK: pred.store.if7: 5528a4deabSSander de Smalen; CHECK-NEXT: [[TMP17:%.*]] = add i64 [[INDEX]], 2 5628a4deabSSander de Smalen; CHECK-NEXT: [[TMP18:%.*]] = mul i64 [[TMP17]], -1 5728a4deabSSander de Smalen; CHECK-NEXT: [[NEXT_GEP3:%.*]] = getelementptr i8, i8* null, i64 [[TMP18]] 5828a4deabSSander de Smalen; CHECK-NEXT: [[TMP19:%.*]] = getelementptr inbounds i8, i8* [[NEXT_GEP3]], i64 -1 5928a4deabSSander de Smalen; CHECK-NEXT: store i8 95, i8* [[TMP19]], align 1 6028a4deabSSander de Smalen; CHECK-NEXT: br label [[PRED_STORE_CONTINUE8]] 6128a4deabSSander de Smalen; CHECK: pred.store.continue8: 6228a4deabSSander de Smalen; CHECK-NEXT: [[TMP20:%.*]] = extractelement <4 x i1> [[TMP9]], i32 3 6328a4deabSSander de Smalen; CHECK-NEXT: br i1 [[TMP20]], label [[PRED_STORE_IF9:%.*]], label [[PRED_STORE_CONTINUE10]] 6428a4deabSSander de Smalen; CHECK: pred.store.if9: 6528a4deabSSander de Smalen; CHECK-NEXT: [[TMP21:%.*]] = add i64 [[INDEX]], 3 6628a4deabSSander de Smalen; CHECK-NEXT: [[TMP22:%.*]] = mul i64 [[TMP21]], -1 6728a4deabSSander de Smalen; CHECK-NEXT: [[NEXT_GEP4:%.*]] = getelementptr i8, i8* null, i64 [[TMP22]] 6828a4deabSSander de Smalen; CHECK-NEXT: [[TMP23:%.*]] = getelementptr inbounds i8, i8* [[NEXT_GEP4]], i64 -1 6928a4deabSSander de Smalen; CHECK-NEXT: store i8 95, i8* [[TMP23]], align 1 7028a4deabSSander de Smalen; CHECK-NEXT: br label [[PRED_STORE_CONTINUE10]] 7128a4deabSSander de Smalen; CHECK: pred.store.continue10: 7223c2f2e6SFlorian Hahn; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4 7328a4deabSSander de Smalen; CHECK-NEXT: [[TMP24:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]] 7428a4deabSSander de Smalen; CHECK-NEXT: br i1 [[TMP24]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]] 75278aa65cSJuneyoung Lee; CHECK: middle.block: 768f3d1690SEli Friedman; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[TMP0]], [[N_VEC]] 77278aa65cSJuneyoung Lee; CHECK-NEXT: br i1 [[CMP_N]], label [[FOR_COND_CLEANUP_LOOPEXIT:%.*]], label [[SCALAR_PH]] 78278aa65cSJuneyoung Lee; CHECK: scalar.ph: 79278aa65cSJuneyoung Lee; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i8* [ [[IND_END]], [[MIDDLE_BLOCK]] ], [ null, [[FOR_BODY_PREHEADER]] ] 80278aa65cSJuneyoung Lee; CHECK-NEXT: br label [[FOR_BODY:%.*]] 81278aa65cSJuneyoung Lee; CHECK: for.cond.cleanup.loopexit: 82278aa65cSJuneyoung Lee; CHECK-NEXT: br label [[FOR_COND_CLEANUP]] 83278aa65cSJuneyoung Lee; CHECK: for.cond.cleanup: 84278aa65cSJuneyoung Lee; CHECK-NEXT: ret void 85278aa65cSJuneyoung Lee; CHECK: for.body: 86278aa65cSJuneyoung Lee; CHECK-NEXT: [[C_05:%.*]] = phi i8* [ [[INCDEC_PTR:%.*]], [[IF_END:%.*]] ], [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ] 87278aa65cSJuneyoung Lee; CHECK-NEXT: [[INCDEC_PTR]] = getelementptr inbounds i8, i8* [[C_05]], i64 -1 8828a4deabSSander de Smalen; CHECK-NEXT: [[TMP25:%.*]] = load i8, i8* [[INCDEC_PTR]], align 1 8928a4deabSSander de Smalen; CHECK-NEXT: [[TOBOOL_NOT:%.*]] = icmp eq i8 [[TMP25]], 0 90278aa65cSJuneyoung Lee; CHECK-NEXT: br i1 [[TOBOOL_NOT]], label [[IF_END]], label [[IF_THEN:%.*]] 91278aa65cSJuneyoung Lee; CHECK: if.then: 92278aa65cSJuneyoung Lee; CHECK-NEXT: store i8 95, i8* [[INCDEC_PTR]], align 1 93278aa65cSJuneyoung Lee; CHECK-NEXT: br label [[IF_END]] 94278aa65cSJuneyoung Lee; CHECK: if.end: 95278aa65cSJuneyoung Lee; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i8* [[INCDEC_PTR]], [[B]] 96925cd6b4SEli Friedman; CHECK-NEXT: br i1 [[CMP_NOT]], label [[FOR_COND_CLEANUP_LOOPEXIT]], label [[FOR_BODY]], !llvm.loop [[LOOP2:![0-9]+]] 97278aa65cSJuneyoung Lee; 9823c95345SAnna Welker 9923c95345SAnna Welkerentry: 10023c95345SAnna Welker %cmp.not4 = icmp eq i8* %b, null 10123c95345SAnna Welker br i1 %cmp.not4, label %for.cond.cleanup, label %for.body.preheader 10223c95345SAnna Welker 10323c95345SAnna Welkerfor.body.preheader: ; preds = %entry 10423c95345SAnna Welker br label %for.body 10523c95345SAnna Welker 10623c95345SAnna Welkerfor.cond.cleanup.loopexit: ; preds = %if.end 10723c95345SAnna Welker br label %for.cond.cleanup 10823c95345SAnna Welker 10923c95345SAnna Welkerfor.cond.cleanup: ; preds = %for.cond.cleanup.loopexit, %entry 11023c95345SAnna Welker ret void 11123c95345SAnna Welker 11223c95345SAnna Welkerfor.body: ; preds = %for.body.preheader, %if.end 11323c95345SAnna Welker %c.05 = phi i8* [ %incdec.ptr, %if.end ], [ null, %for.body.preheader ] 11423c95345SAnna Welker %incdec.ptr = getelementptr inbounds i8, i8* %c.05, i64 -1 11523c95345SAnna Welker %0 = load i8, i8* %incdec.ptr, align 1 11623c95345SAnna Welker %tobool.not = icmp eq i8 %0, 0 11723c95345SAnna Welker br i1 %tobool.not, label %if.end, label %if.then 11823c95345SAnna Welker 11923c95345SAnna Welkerif.then: ; preds = %for.body 12023c95345SAnna Welker store i8 95, i8* %incdec.ptr, align 1 12123c95345SAnna Welker br label %if.end 12223c95345SAnna Welker 12323c95345SAnna Welkerif.end: ; preds = %for.body, %if.then 12423c95345SAnna Welker %cmp.not = icmp eq i8* %incdec.ptr, %b 12523c95345SAnna Welker br i1 %cmp.not, label %for.cond.cleanup.loopexit, label %for.body 12623c95345SAnna Welker} 12723c95345SAnna Welker 128156b431cSFlorian Hahn; In the test below the pointer phi %ptr.iv.2 is used as 129156b431cSFlorian Hahn; 1. As a uniform address for the load, and 130156b431cSFlorian Hahn; 2. Non-uniform use by the getelementptr which is stored. This requires the 131156b431cSFlorian Hahn; vector value. 132156b431cSFlorian Hahndefine void @pointer_induction_used_as_vector(i8** noalias %start.1, i8* noalias %start.2, i64 %N) { 133156b431cSFlorian Hahn; CHECK-LABEL: @pointer_induction_used_as_vector( 134156b431cSFlorian Hahn; CHECK-NEXT: entry: 135156b431cSFlorian Hahn; CHECK-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[N:%.*]], 4 136156b431cSFlorian Hahn; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK]], label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]] 137156b431cSFlorian Hahn; CHECK: vector.ph: 138156b431cSFlorian Hahn; CHECK-NEXT: [[N_MOD_VF:%.*]] = urem i64 [[N]], 4 139156b431cSFlorian Hahn; CHECK-NEXT: [[N_VEC:%.*]] = sub i64 [[N]], [[N_MOD_VF]] 140156b431cSFlorian Hahn; CHECK-NEXT: [[IND_END:%.*]] = getelementptr i8*, i8** [[START_1:%.*]], i64 [[N_VEC]] 141156b431cSFlorian Hahn; CHECK-NEXT: [[IND_END3:%.*]] = getelementptr i8, i8* [[START_2:%.*]], i64 [[N_VEC]] 142156b431cSFlorian Hahn; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 143156b431cSFlorian Hahn; CHECK: vector.body: 14428a4deabSSander de Smalen; CHECK-NEXT: [[POINTER_PHI:%.*]] = phi i8* [ [[START_2]], [[VECTOR_PH]] ], [ [[PTR_IND:%.*]], [[VECTOR_BODY]] ] 145156b431cSFlorian Hahn; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ] 146156b431cSFlorian Hahn; CHECK-NEXT: [[TMP0:%.*]] = add i64 [[INDEX]], 0 147da740492SFlorian Hahn; CHECK-NEXT: [[NEXT_GEP:%.*]] = getelementptr i8*, i8** [[START_1]], i64 [[TMP0]] 148872f7000SDávid Bolvanský; CHECK-NEXT: [[TMP2:%.*]] = getelementptr i8, i8* [[POINTER_PHI]], <4 x i64> <i64 0, i64 1, i64 2, i64 3> 149872f7000SDávid Bolvanský; CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds i8, <4 x i8*> [[TMP2]], i64 1 150872f7000SDávid Bolvanský; CHECK-NEXT: [[TMP4:%.*]] = getelementptr i8*, i8** [[NEXT_GEP]], i32 0 151872f7000SDávid Bolvanský; CHECK-NEXT: [[TMP5:%.*]] = bitcast i8** [[TMP4]] to <4 x i8*>* 152872f7000SDávid Bolvanský; CHECK-NEXT: store <4 x i8*> [[TMP3]], <4 x i8*>* [[TMP5]], align 8 153872f7000SDávid Bolvanský; CHECK-NEXT: [[TMP6:%.*]] = extractelement <4 x i8*> [[TMP1]], i32 0 154872f7000SDávid Bolvanský; CHECK-NEXT: [[TMP7:%.*]] = getelementptr i8, i8* [[TMP6]], i32 0 155872f7000SDávid Bolvanský; CHECK-NEXT: [[TMP8:%.*]] = bitcast i8* [[TMP7]] to <4 x i8>* 156872f7000SDávid Bolvanský; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x i8>, <4 x i8>* [[TMP8]], align 1 157872f7000SDávid Bolvanský; CHECK-NEXT: [[TMP9:%.*]] = add <4 x i8> [[WIDE_LOAD]], <i8 1, i8 1, i8 1, i8 1> 158872f7000SDávid Bolvanský; CHECK-NEXT: [[TMP10:%.*]] = bitcast i8* [[TMP7]] to <4 x i8>* 159872f7000SDávid Bolvanský; CHECK-NEXT: store <4 x i8> [[TMP9]], <4 x i8>* [[TMP10]], align 1 160156b431cSFlorian Hahn; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4 16128a4deabSSander de Smalen; CHECK-NEXT: [[PTR_IND]] = getelementptr i8, i8* [[POINTER_PHI]], i64 4 162872f7000SDávid Bolvanský; CHECK-NEXT: [[TMP11:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]] 163872f7000SDávid Bolvanský; CHECK-NEXT: br i1 [[TMP11]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]] 164156b431cSFlorian Hahn; CHECK: middle.block: 165156b431cSFlorian Hahn; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[N]], [[N_VEC]] 166156b431cSFlorian Hahn; CHECK-NEXT: br i1 [[CMP_N]], label [[EXIT:%.*]], label [[SCALAR_PH]] 167156b431cSFlorian Hahn; CHECK: scalar.ph: 168156b431cSFlorian Hahn; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ] 169156b431cSFlorian Hahn; CHECK-NEXT: [[BC_RESUME_VAL1:%.*]] = phi i8** [ [[IND_END]], [[MIDDLE_BLOCK]] ], [ [[START_1]], [[ENTRY]] ] 170156b431cSFlorian Hahn; CHECK-NEXT: [[BC_RESUME_VAL2:%.*]] = phi i8* [ [[IND_END3]], [[MIDDLE_BLOCK]] ], [ [[START_2]], [[ENTRY]] ] 171156b431cSFlorian Hahn; CHECK-NEXT: br label [[LOOP_BODY:%.*]] 172156b431cSFlorian Hahn; CHECK: loop.body: 173156b431cSFlorian Hahn; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP_BODY]] ] 174156b431cSFlorian Hahn; CHECK-NEXT: [[PTR_IV_1:%.*]] = phi i8** [ [[BC_RESUME_VAL1]], [[SCALAR_PH]] ], [ [[PTR_IV_1_NEXT:%.*]], [[LOOP_BODY]] ] 175156b431cSFlorian Hahn; CHECK-NEXT: [[PTR_IV_2:%.*]] = phi i8* [ [[BC_RESUME_VAL2]], [[SCALAR_PH]] ], [ [[PTR_IV_2_NEXT:%.*]], [[LOOP_BODY]] ] 176156b431cSFlorian Hahn; CHECK-NEXT: [[PTR_IV_1_NEXT]] = getelementptr inbounds i8*, i8** [[PTR_IV_1]], i64 1 177156b431cSFlorian Hahn; CHECK-NEXT: [[PTR_IV_2_NEXT]] = getelementptr inbounds i8, i8* [[PTR_IV_2]], i64 1 178156b431cSFlorian Hahn; CHECK-NEXT: store i8* [[PTR_IV_2_NEXT]], i8** [[PTR_IV_1]], align 8 179156b431cSFlorian Hahn; CHECK-NEXT: [[LV:%.*]] = load i8, i8* [[PTR_IV_2]], align 1 180156b431cSFlorian Hahn; CHECK-NEXT: [[ADD:%.*]] = add i8 [[LV]], 1 181156b431cSFlorian Hahn; CHECK-NEXT: store i8 [[ADD]], i8* [[PTR_IV_2]], align 1 182156b431cSFlorian Hahn; CHECK-NEXT: [[IV_NEXT]] = add nuw i64 [[IV]], 1 183156b431cSFlorian Hahn; CHECK-NEXT: [[C:%.*]] = icmp ne i64 [[IV_NEXT]], [[N]] 184156b431cSFlorian Hahn; CHECK-NEXT: br i1 [[C]], label [[LOOP_BODY]], label [[EXIT]], !llvm.loop [[LOOP5:![0-9]+]] 185156b431cSFlorian Hahn; CHECK: exit: 186156b431cSFlorian Hahn; CHECK-NEXT: ret void 187156b431cSFlorian Hahn; 188156b431cSFlorian Hahn 189156b431cSFlorian Hahnentry: 190156b431cSFlorian Hahn br label %loop.body 191156b431cSFlorian Hahn 192156b431cSFlorian Hahnloop.body: ; preds = %loop.body, %entry 193156b431cSFlorian Hahn %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop.body ] 194156b431cSFlorian Hahn %ptr.iv.1 = phi i8** [ %start.1, %entry ], [ %ptr.iv.1.next, %loop.body ] 195156b431cSFlorian Hahn %ptr.iv.2 = phi i8* [ %start.2, %entry ], [ %ptr.iv.2.next, %loop.body ] 196156b431cSFlorian Hahn %ptr.iv.1.next = getelementptr inbounds i8*, i8** %ptr.iv.1, i64 1 197156b431cSFlorian Hahn %ptr.iv.2.next = getelementptr inbounds i8, i8* %ptr.iv.2, i64 1 198156b431cSFlorian Hahn store i8* %ptr.iv.2.next, i8** %ptr.iv.1, align 8 199156b431cSFlorian Hahn %lv = load i8, i8* %ptr.iv.2, align 1 200156b431cSFlorian Hahn %add = add i8 %lv, 1 201156b431cSFlorian Hahn store i8 %add, i8* %ptr.iv.2, align 1 202156b431cSFlorian Hahn %iv.next = add nuw i64 %iv, 1 203156b431cSFlorian Hahn %c = icmp ne i64 %iv.next, %N 204156b431cSFlorian Hahn br i1 %c, label %loop.body, label %exit 205156b431cSFlorian Hahn 206156b431cSFlorian Hahnexit: ; preds = %loop.body 207156b431cSFlorian Hahn ret void 208156b431cSFlorian Hahn} 209