13c5e0d87SMiguel Saldivar; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 253f7f857SNikita Popov; RUN: opt -passes=loop-distribute,loop-vectorize -enable-loop-distribute -force-vector-width=4 -force-vector-interleave=1 -S \ 33c5e0d87SMiguel Saldivar; RUN: %s | FileCheck %s 43c5e0d87SMiguel Saldivar 53c5e0d87SMiguel Saldivar; This test is to assure LoopAccessInfo invalidation after LoopVectorize 63c5e0d87SMiguel Saldivar; modifies the IR. 753f7f857SNikita Popovdefine void @reduced(ptr %0, ptr %1, i64 %iv, ptr %2, i64 %iv76, i64 %iv93) { 83c5e0d87SMiguel Saldivar; CHECK-LABEL: @reduced( 93c5e0d87SMiguel Saldivar; CHECK-NEXT: entry: 1053f7f857SNikita Popov; CHECK-NEXT: [[TMP3:%.*]] = add i64 [[IV:%.*]], 1 1153f7f857SNikita Popov; CHECK-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[TMP3]], 4 123c5e0d87SMiguel Saldivar; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK]], label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]] 133c5e0d87SMiguel Saldivar; CHECK: vector.ph: 1453f7f857SNikita Popov; CHECK-NEXT: [[N_MOD_VF:%.*]] = urem i64 [[TMP3]], 4 1553f7f857SNikita Popov; CHECK-NEXT: [[IND_END:%.*]] = sub i64 [[TMP3]], [[N_MOD_VF]] 163c5e0d87SMiguel Saldivar; CHECK-NEXT: br label [[VECTOR_BODY:%.*]] 173c5e0d87SMiguel Saldivar; CHECK: vector.body: 183c5e0d87SMiguel Saldivar; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ] 193c5e0d87SMiguel Saldivar; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4 2053f7f857SNikita Popov; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[IND_END]] 2153f7f857SNikita Popov; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]] 223c5e0d87SMiguel Saldivar; CHECK: middle.block: 2353f7f857SNikita Popov; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[TMP3]], [[IND_END]] 243c5e0d87SMiguel Saldivar; CHECK-NEXT: [[IND_ESCAPE:%.*]] = sub i64 [[IND_END]], 1 253c5e0d87SMiguel Saldivar; CHECK-NEXT: br i1 [[CMP_N]], label [[LOOP_2_PREHEADER:%.*]], label [[SCALAR_PH]] 263c5e0d87SMiguel Saldivar; CHECK: scalar.ph: 273c5e0d87SMiguel Saldivar; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[IND_END]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ] 283c5e0d87SMiguel Saldivar; CHECK-NEXT: [[BC_RESUME_VAL1:%.*]] = phi i64 [ [[IND_END]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY]] ] 293c5e0d87SMiguel Saldivar; CHECK-NEXT: br label [[LOOP_1:%.*]] 303c5e0d87SMiguel Saldivar; CHECK: loop.1: 313c5e0d87SMiguel Saldivar; CHECK-NEXT: [[IV761:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[IV_NEXT77:%.*]], [[LOOP_1]] ] 323c5e0d87SMiguel Saldivar; CHECK-NEXT: [[IV4:%.*]] = phi i64 [ [[BC_RESUME_VAL1]], [[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP_1]] ] 333c5e0d87SMiguel Saldivar; CHECK-NEXT: [[IV_NEXT77]] = add i64 [[IV761]], 1 3453f7f857SNikita Popov; CHECK-NEXT: [[ARRAYIDX_I_I50:%.*]] = getelementptr i32, ptr [[TMP0:%.*]], i64 [[IV76:%.*]] 353c5e0d87SMiguel Saldivar; CHECK-NEXT: [[IV_NEXT]] = add i64 [[IV4]], 1 363c5e0d87SMiguel Saldivar; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i64 [[IV4]], [[IV]] 3753f7f857SNikita Popov; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label [[LOOP_2_PREHEADER]], label [[LOOP_1]], !llvm.loop [[LOOP3:![0-9]+]] 383c5e0d87SMiguel Saldivar; CHECK: loop.2.preheader: 393c5e0d87SMiguel Saldivar; CHECK-NEXT: [[IV761_LCSSA:%.*]] = phi i64 [ [[IV761]], [[LOOP_1]] ], [ [[IND_ESCAPE]], [[MIDDLE_BLOCK]] ] 4053f7f857SNikita Popov; CHECK-NEXT: [[MIN_ITERS_CHECK6:%.*]] = icmp ult i64 [[TMP3]], 4 4153f7f857SNikita Popov; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK6]], label [[SCALAR_PH5:%.*]], label [[VECTOR_MEMCHECK:%.*]] 423c5e0d87SMiguel Saldivar; CHECK: vector.memcheck: 4353f7f857SNikita Popov; CHECK-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, ptr [[TMP1:%.*]], i64 4 4453f7f857SNikita Popov; CHECK-NEXT: [[TMP9:%.*]] = shl i64 [[IV761_LCSSA]], 2 4553f7f857SNikita Popov; CHECK-NEXT: [[SCEVGEP2:%.*]] = getelementptr i8, ptr [[TMP0]], i64 [[TMP9]] 4653f7f857SNikita Popov; CHECK-NEXT: [[TMP10:%.*]] = add i64 [[TMP9]], 4 4753f7f857SNikita Popov; CHECK-NEXT: [[SCEVGEP3:%.*]] = getelementptr i8, ptr [[TMP0]], i64 [[TMP10]] 4853f7f857SNikita Popov; CHECK-NEXT: [[BOUND0:%.*]] = icmp ult ptr [[TMP1]], [[SCEVGEP3]] 4953f7f857SNikita Popov; CHECK-NEXT: [[BOUND1:%.*]] = icmp ult ptr [[SCEVGEP2]], [[SCEVGEP]] 503c5e0d87SMiguel Saldivar; CHECK-NEXT: [[FOUND_CONFLICT:%.*]] = and i1 [[BOUND0]], [[BOUND1]] 5153f7f857SNikita Popov; CHECK-NEXT: br i1 [[FOUND_CONFLICT]], label [[SCALAR_PH5]], label [[VECTOR_PH7:%.*]] 5253f7f857SNikita Popov; CHECK: vector.ph7: 5353f7f857SNikita Popov; CHECK-NEXT: [[N_MOD_VF8:%.*]] = urem i64 [[TMP3]], 4 5453f7f857SNikita Popov; CHECK-NEXT: [[N_VEC:%.*]] = sub i64 [[TMP3]], [[N_MOD_VF8]] 55*7f3428d3SFlorian Hahn; CHECK-NEXT: br label [[VECTOR_BODY10:%.*]] 56*7f3428d3SFlorian Hahn; CHECK: vector.body10: 57*7f3428d3SFlorian Hahn; CHECK-NEXT: [[INDEX12:%.*]] = phi i64 [ 0, [[VECTOR_PH7]] ], [ [[INDEX_NEXT13:%.*]], [[VECTOR_BODY10]] ] 5853f7f857SNikita Popov; CHECK-NEXT: store i32 0, ptr [[TMP1]], align 4, !alias.scope !4, !noalias !7 5953f7f857SNikita Popov; CHECK-NEXT: [[INDEX_NEXT13]] = add nuw i64 [[INDEX12]], 4 6053f7f857SNikita Popov; CHECK-NEXT: [[TMP11:%.*]] = icmp eq i64 [[INDEX_NEXT13]], [[N_VEC]] 61*7f3428d3SFlorian Hahn; CHECK-NEXT: br i1 [[TMP11]], label [[MIDDLE_BLOCK4:%.*]], label [[VECTOR_BODY10]], !llvm.loop [[LOOP9:![0-9]+]] 6253f7f857SNikita Popov; CHECK: middle.block4: 6353f7f857SNikita Popov; CHECK-NEXT: [[CMP_N10:%.*]] = icmp eq i64 [[TMP3]], [[N_VEC]] 6453f7f857SNikita Popov; CHECK-NEXT: br i1 [[CMP_N10]], label [[LOOP_3_LR_PH:%.*]], label [[SCALAR_PH5]] 6553f7f857SNikita Popov; CHECK: scalar.ph5: 664ad0fdd1SFlorian Hahn; CHECK-NEXT: [[BC_RESUME_VAL13:%.*]] = phi i64 [ [[N_VEC]], [[MIDDLE_BLOCK4]] ], [ 0, [[VECTOR_MEMCHECK]] ], [ 0, [[LOOP_2_PREHEADER]] ] 673c5e0d87SMiguel Saldivar; CHECK-NEXT: br label [[LOOP_2:%.*]] 683c5e0d87SMiguel Saldivar; CHECK: loop.3.lr.ph: 693c5e0d87SMiguel Saldivar; CHECK-NEXT: [[IDXPROM_I_I61:%.*]] = and i64 [[IV761_LCSSA]], 1 7053f7f857SNikita Popov; CHECK-NEXT: [[ARRAYIDX_I_I62:%.*]] = getelementptr i32, ptr [[TMP0]], i64 [[IDXPROM_I_I61]] 7153f7f857SNikita Popov; CHECK-NEXT: [[MIN_ITERS_CHECK22:%.*]] = icmp ult i64 [[TMP3]], 4 72*7f3428d3SFlorian Hahn; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK22]], label [[SCALAR_PH22:%.*]], label [[VECTOR_MEMCHECK15:%.*]] 73*7f3428d3SFlorian Hahn; CHECK: vector.memcheck15: 7453f7f857SNikita Popov; CHECK-NEXT: [[SCEVGEP15:%.*]] = getelementptr i8, ptr [[TMP1]], i64 4 7553f7f857SNikita Popov; CHECK-NEXT: [[TMP12:%.*]] = shl nuw nsw i64 [[IDXPROM_I_I61]], 2 7653f7f857SNikita Popov; CHECK-NEXT: [[TMP13:%.*]] = add nuw nsw i64 [[TMP12]], 4 7753f7f857SNikita Popov; CHECK-NEXT: [[SCEVGEP16:%.*]] = getelementptr i8, ptr [[TMP0]], i64 [[TMP13]] 7853f7f857SNikita Popov; CHECK-NEXT: [[BOUND017:%.*]] = icmp ult ptr [[TMP1]], [[SCEVGEP16]] 7953f7f857SNikita Popov; CHECK-NEXT: [[BOUND118:%.*]] = icmp ult ptr [[ARRAYIDX_I_I62]], [[SCEVGEP15]] 8053f7f857SNikita Popov; CHECK-NEXT: [[FOUND_CONFLICT19:%.*]] = and i1 [[BOUND017]], [[BOUND118]] 81*7f3428d3SFlorian Hahn; CHECK-NEXT: br i1 [[FOUND_CONFLICT19]], label [[SCALAR_PH22]], label [[VECTOR_PH24:%.*]] 82*7f3428d3SFlorian Hahn; CHECK: vector.ph24: 8353f7f857SNikita Popov; CHECK-NEXT: [[N_MOD_VF24:%.*]] = urem i64 [[TMP3]], 4 8453f7f857SNikita Popov; CHECK-NEXT: [[N_VEC25:%.*]] = sub i64 [[TMP3]], [[N_MOD_VF24]] 85*7f3428d3SFlorian Hahn; CHECK-NEXT: br label [[VECTOR_BODY27:%.*]] 86*7f3428d3SFlorian Hahn; CHECK: vector.body27: 87*7f3428d3SFlorian Hahn; CHECK-NEXT: [[INDEX29:%.*]] = phi i64 [ 0, [[VECTOR_PH24]] ], [ [[INDEX_NEXT29:%.*]], [[VECTOR_BODY27]] ] 8853f7f857SNikita Popov; CHECK-NEXT: store i32 0, ptr [[TMP1]], align 4, !alias.scope !10, !noalias !13 897f7f540aSFlorian Hahn; CHECK-NEXT: [[INDEX_NEXT29]] = add nuw i64 [[INDEX29]], 4 907f7f540aSFlorian Hahn; CHECK-NEXT: [[TMP10:%.*]] = icmp eq i64 [[INDEX_NEXT29]], [[N_VEC25]] 91*7f3428d3SFlorian Hahn; CHECK-NEXT: br i1 [[TMP10]], label [[MIDDLE_BLOCK21:%.*]], label [[VECTOR_BODY27]], !llvm.loop [[LOOP15:![0-9]+]] 92*7f3428d3SFlorian Hahn; CHECK: middle.block21: 9353f7f857SNikita Popov; CHECK-NEXT: [[CMP_N27:%.*]] = icmp eq i64 [[TMP3]], [[N_VEC25]] 94*7f3428d3SFlorian Hahn; CHECK-NEXT: br i1 [[CMP_N27]], label [[LOOP_CLEANUP:%.*]], label [[SCALAR_PH22]] 95*7f3428d3SFlorian Hahn; CHECK: scalar.ph22: 96*7f3428d3SFlorian Hahn; CHECK-NEXT: [[BC_RESUME_VAL26:%.*]] = phi i64 [ [[N_VEC25]], [[MIDDLE_BLOCK21]] ], [ 0, [[VECTOR_MEMCHECK15]] ], [ 0, [[LOOP_3_LR_PH]] ] 973c5e0d87SMiguel Saldivar; CHECK-NEXT: br label [[LOOP_3:%.*]] 983c5e0d87SMiguel Saldivar; CHECK: loop.2: 997f7f540aSFlorian Hahn; CHECK-NEXT: [[IV846:%.*]] = phi i64 [ [[IV_NEXT85:%.*]], [[LOOP_2]] ], [ [[BC_RESUME_VAL13]], [[SCALAR_PH5]] ] 1003c5e0d87SMiguel Saldivar; CHECK-NEXT: [[IV_NEXT87:%.*]] = add i64 0, 0 10153f7f857SNikita Popov; CHECK-NEXT: [[ARRAYIDX_I_I56:%.*]] = getelementptr i32, ptr [[TMP0]], i64 [[IV761_LCSSA]] 1027f7f540aSFlorian Hahn; CHECK-NEXT: [[TMP11:%.*]] = load i32, ptr [[ARRAYIDX_I_I56]], align 4 10353f7f857SNikita Popov; CHECK-NEXT: store i32 0, ptr [[TMP1]], align 4 1043c5e0d87SMiguel Saldivar; CHECK-NEXT: [[IV_NEXT85]] = add i64 [[IV846]], 1 1053c5e0d87SMiguel Saldivar; CHECK-NEXT: [[EXITCOND92_NOT:%.*]] = icmp eq i64 [[IV846]], [[IV]] 1063c5e0d87SMiguel Saldivar; CHECK-NEXT: br i1 [[EXITCOND92_NOT]], label [[LOOP_3_LR_PH]], label [[LOOP_2]], !llvm.loop [[LOOP16:![0-9]+]] 1073c5e0d87SMiguel Saldivar; CHECK: loop.3: 108*7f3428d3SFlorian Hahn; CHECK-NEXT: [[IV932:%.*]] = phi i64 [ [[BC_RESUME_VAL26]], [[SCALAR_PH22]] ], [ [[IV_NEXT94:%.*]], [[LOOP_3]] ] 10953f7f857SNikita Popov; CHECK-NEXT: [[TMP16:%.*]] = load i32, ptr [[ARRAYIDX_I_I62]], align 4 11053f7f857SNikita Popov; CHECK-NEXT: [[ARRAYIDX_I_I653:%.*]] = getelementptr i32, ptr [[TMP2:%.*]], i64 [[IV93:%.*]] 11153f7f857SNikita Popov; CHECK-NEXT: store i32 0, ptr [[TMP1]], align 4 1123c5e0d87SMiguel Saldivar; CHECK-NEXT: [[IV_NEXT94]] = add i64 [[IV932]], 1 1133c5e0d87SMiguel Saldivar; CHECK-NEXT: [[EXITCOND97_NOT:%.*]] = icmp eq i64 [[IV932]], [[IV]] 1143c5e0d87SMiguel Saldivar; CHECK-NEXT: br i1 [[EXITCOND97_NOT]], label [[LOOP_CLEANUP]], label [[LOOP_3]], !llvm.loop [[LOOP17:![0-9]+]] 1153c5e0d87SMiguel Saldivar; CHECK: loop.cleanup: 1163c5e0d87SMiguel Saldivar; CHECK-NEXT: ret void 1173c5e0d87SMiguel Saldivar; 1183c5e0d87SMiguel Saldivarentry: 1193c5e0d87SMiguel Saldivar br label %loop.1 1203c5e0d87SMiguel Saldivar 1213c5e0d87SMiguel Saldivarloop.1: ; preds = %loop.1, %entry 1223c5e0d87SMiguel Saldivar %iv761 = phi i64 [ 0, %entry ], [ %iv.next77, %loop.1 ] 1233c5e0d87SMiguel Saldivar %iv4 = phi i64 [ 0, %entry ], [ %iv.next, %loop.1 ] 1243c5e0d87SMiguel Saldivar %iv.next77 = add i64 %iv761, 1 12553f7f857SNikita Popov %arrayidx.i.i50 = getelementptr i32, ptr %0, i64 %iv76 1263c5e0d87SMiguel Saldivar %iv.next = add i64 %iv4, 1 1273c5e0d87SMiguel Saldivar %exitcond.not = icmp eq i64 %iv4, %iv 1283c5e0d87SMiguel Saldivar br i1 %exitcond.not, label %loop.2.preheader, label %loop.1 1293c5e0d87SMiguel Saldivar 1303c5e0d87SMiguel Saldivarloop.2.preheader: ; preds = %loop.1 1313c5e0d87SMiguel Saldivar br label %loop.2 1323c5e0d87SMiguel Saldivar 1333c5e0d87SMiguel Saldivarloop.3.lr.ph: ; preds = %loop.2 1343c5e0d87SMiguel Saldivar %idxprom.i.i61 = and i64 %iv761, 1 13553f7f857SNikita Popov %arrayidx.i.i62 = getelementptr i32, ptr %0, i64 %idxprom.i.i61 1363c5e0d87SMiguel Saldivar br label %loop.3 1373c5e0d87SMiguel Saldivar 1383c5e0d87SMiguel Saldivarloop.2: ; preds = %loop.2, %loop.2.preheader 1393c5e0d87SMiguel Saldivar %iv846 = phi i64 [ %iv.next85, %loop.2 ], [ 0, %loop.2.preheader ] 1403c5e0d87SMiguel Saldivar %iv.next87 = add i64 0, 0 14153f7f857SNikita Popov %arrayidx.i.i56 = getelementptr i32, ptr %0, i64 %iv761 14253f7f857SNikita Popov %3 = load i32, ptr %arrayidx.i.i56, align 4 14353f7f857SNikita Popov store i32 0, ptr %1, align 4 1443c5e0d87SMiguel Saldivar %iv.next85 = add i64 %iv846, 1 1453c5e0d87SMiguel Saldivar %exitcond92.not = icmp eq i64 %iv846, %iv 1463c5e0d87SMiguel Saldivar br i1 %exitcond92.not, label %loop.3.lr.ph, label %loop.2 1473c5e0d87SMiguel Saldivar 1483c5e0d87SMiguel Saldivarloop.3: ; preds = %loop.3, %loop.3.lr.ph 1493c5e0d87SMiguel Saldivar %iv932 = phi i64 [ 0, %loop.3.lr.ph ], [ %iv.next94, %loop.3 ] 15053f7f857SNikita Popov %4 = load i32, ptr %arrayidx.i.i62, align 4 15153f7f857SNikita Popov %arrayidx.i.i653 = getelementptr i32, ptr %2, i64 %iv93 15253f7f857SNikita Popov store i32 0, ptr %1, align 4 1533c5e0d87SMiguel Saldivar %iv.next94 = add i64 %iv932, 1 1543c5e0d87SMiguel Saldivar %exitcond97.not = icmp eq i64 %iv932, %iv 1553c5e0d87SMiguel Saldivar br i1 %exitcond97.not, label %loop.cleanup, label %loop.3 1563c5e0d87SMiguel Saldivar 1573c5e0d87SMiguel Saldivarloop.cleanup: ; preds = %loop.3 1583c5e0d87SMiguel Saldivar ret void 1593c5e0d87SMiguel Saldivar} 160