Skip to content

Commit e91e62d

Browse files
committed
[LV] Sink scalar operands and merge regions repeatedly.
Merging regions can enable new sinking opportunities (e.g. if users of a scalar value are moved from different VPBBs into the same VPBB). Sinking in turn can also enable new merging opportunities (e.g. if a recipe between to merge-able regions is moved. To enable more sinking opportunities, repeat sinking & merging if regions could be merged. Also fix mergeReplicateRegions to return the correct Changed status. Reviewed By: Ayal Differential Revision: https://reviews.llvm.org/D139788
1 parent 6d323e7 commit e91e62d

File tree

4 files changed

+15
-26
lines changed

4 files changed

+15
-26
lines changed

llvm/lib/Transforms/Vectorize/LoopVectorize.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9146,8 +9146,14 @@ VPlanPtr LoopVectorizationPlanner::buildVPlanWithVPRecipes(
91469146

91479147
VPlanTransforms::optimizeInductions(*Plan, *PSE.getSE());
91489148
VPlanTransforms::removeDeadRecipes(*Plan);
9149-
VPlanTransforms::sinkScalarOperands(*Plan);
9150-
VPlanTransforms::mergeReplicateRegions(*Plan);
9149+
9150+
bool ShouldSimplify = true;
9151+
while (ShouldSimplify) {
9152+
ShouldSimplify = VPlanTransforms::sinkScalarOperands(*Plan);
9153+
ShouldSimplify |= VPlanTransforms::mergeReplicateRegions(*Plan);
9154+
ShouldSimplify |= VPlanTransforms::mergeBlocksIntoPredecessors(*Plan);
9155+
}
9156+
91519157
VPlanTransforms::removeRedundantExpandSCEVRecipes(*Plan);
91529158
VPlanTransforms::mergeBlocksIntoPredecessors(*Plan);
91539159

llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,6 @@ static VPBasicBlock *getPredicatedThenBlock(VPRegionBlock *R) {
225225

226226
bool VPlanTransforms::mergeReplicateRegions(VPlan &Plan) {
227227
SetVector<VPRegionBlock *> DeletedRegions;
228-
bool Changed = false;
229228

230229
// Collect region blocks to process up-front, to avoid iterator invalidation
231230
// issues while merging regions.
@@ -304,7 +303,7 @@ bool VPlanTransforms::mergeReplicateRegions(VPlan &Plan) {
304303

305304
for (VPRegionBlock *ToDelete : DeletedRegions)
306305
delete ToDelete;
307-
return Changed;
306+
return !DeletedRegions.empty();
308307
}
309308

310309
bool VPlanTransforms::mergeBlocksIntoPredecessors(VPlan &Plan) {

llvm/test/Transforms/LoopVectorize/first-order-recurrence-sink-replicate-region.ll

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -356,24 +356,6 @@ define void @sink_replicate_region_after_replicate_region(i32* %ptr, i32* noalia
356356
; CHECK-NEXT: EMIT vp<[[MASK:%.+]]> = icmp ule ir<%iv> vp<[[BTC]]>
357357
; CHECK-NEXT: WIDEN ir<%recur.next> = sext ir<%y>
358358
; CHECK-NEXT: EMIT vp<[[SPLICE:%.+]]> = first-order splice ir<%recur> ir<%recur.next>
359-
; CHECK-NEXT: Successor(s): pred.srem
360-
; CHECK-EMPTY:
361-
; CHECK-NEXT: <xVFxUF> pred.srem: {
362-
; CHECK-NEXT: pred.srem.entry:
363-
; CHECK-NEXT: BRANCH-ON-MASK vp<[[MASK]]>
364-
; CHECK-NEXT: Successor(s): pred.srem.if, pred.srem.continue
365-
; CHECK-EMPTY:
366-
; CHECK-NEXT: pred.srem.if:
367-
; CHECK-NEXT: REPLICATE ir<%rem> = srem vp<[[SPLICE]]>, ir<%x>
368-
; CHECK-NEXT: Successor(s): pred.srem.continue
369-
; CHECK-EMPTY:
370-
; CHECK-NEXT: pred.srem.continue:
371-
; CHECK-NEXT: PHI-PREDICATED-INSTRUCTION vp<[[PRED:%.+]]> = ir<%rem>
372-
; CHECK-NEXT: No successors
373-
; CHECK-NEXT: }
374-
; CHECK-NEXT: Successor(s): loop.1.split
375-
; CHECK-EMPTY:
376-
; CHECK-NEXT: loop.1.split:
377359
; CHECK-NEXT: Successor(s): pred.store
378360
; CHECK-EMPTY:
379361
; CHECK-NEXT: <xVFxUF> pred.store: {
@@ -382,14 +364,16 @@ define void @sink_replicate_region_after_replicate_region(i32* %ptr, i32* noalia
382364
; CHECK-NEXT: Successor(s): pred.store.if, pred.store.continue
383365
; CHECK-EMPTY:
384366
; CHECK-NEXT: pred.store.if:
385-
; CHECK-NEXT: REPLICATE ir<%rem.div> = sdiv ir<20>, vp<[[PRED]]>
367+
; CHECK-NEXT: REPLICATE ir<%rem> = srem vp<[[SPLICE]]>, ir<%x>
368+
; CHECK-NEXT: REPLICATE ir<%rem.div> = sdiv ir<20>, ir<%rem>
386369
; CHECK-NEXT: REPLICATE ir<%gep> = getelementptr ir<%ptr>, vp<[[STEPS]]>
387370
; CHECK-NEXT: REPLICATE store ir<%rem.div>, ir<%gep>
388371
; CHECK-NEXT: REPLICATE ir<%gep.2> = getelementptr ir<%dst.2>, vp<[[STEPS]]>
389372
; CHECK-NEXT: REPLICATE store ir<%rem.div>, ir<%gep.2>
390373
; CHECK-NEXT: Successor(s): pred.store.continue
391374
; CHECK-EMPTY:
392375
; CHECK-NEXT: pred.store.continue:
376+
; CHECK-NEXT: PHI-PREDICATED-INSTRUCTION vp<[[PRED:%.+]]> = ir<%rem>
393377
; CHECK-NEXT: PHI-PREDICATED-INSTRUCTION vp<[[PRED2:%.+]]> = ir<%rem.div>
394378
; CHECK-NEXT: No successors
395379
; CHECK-NEXT: }

llvm/test/Transforms/LoopVectorize/vplan-sink-scalars-and-merge.ll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -621,7 +621,6 @@ define void @merge_3_replicate_region(i32 %k, i32 %j) {
621621
; CHECK-NEXT: WIDEN-INDUCTION %iv = phi 0, %iv.next, ir<1>
622622
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>
623623
; CHECK-NEXT: EMIT vp<[[MASK:%.+]]> = icmp ule ir<%iv> vp<[[BTC]]>
624-
; CHECK-NEXT: REPLICATE ir<%gep.a> = getelementptr ir<@a>, ir<0>, vp<[[STEPS]]>
625624
; CHECK-NEXT: Successor(s): pred.store
626625
; CHECK-EMPTY:
627626
; CHECK-NEXT: <xVFxUF> pred.store: {
@@ -630,6 +629,7 @@ define void @merge_3_replicate_region(i32 %k, i32 %j) {
630629
; CHECK-NEXT: Successor(s): pred.store.if, pred.store.continue
631630
; CHECK-EMPTY:
632631
; CHECK-NEXT: pred.store.if:
632+
; CHECK-NEXT: REPLICATE ir<%gep.a> = getelementptr ir<@a>, ir<0>, vp<[[STEPS]]>
633633
; CHECK-NEXT: REPLICATE ir<%lv.a> = load ir<%gep.a>
634634
; CHECK-NEXT: REPLICATE ir<%gep.b> = getelementptr ir<@b>, ir<0>, vp<[[STEPS]]>
635635
; CHECK-NEXT: REPLICATE ir<%lv.b> = load ir<%gep.b>
@@ -719,9 +719,7 @@ define void @update_2_uses_in_same_recipe_in_merged_block(i32 %k) {
719719
; CHECK-NEXT: vector.body:
720720
; CHECK-NEXT: EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION
721721
; CHECK-NEXT: WIDEN-INDUCTION %iv = phi 0, %iv.next, ir<1>
722-
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>
723722
; CHECK-NEXT: EMIT vp<[[MASK:%.+]]> = icmp ule ir<%iv> vp<[[BTC]]>
724-
; CHECK-NEXT: REPLICATE ir<%gep.a> = getelementptr ir<@a>, ir<0>, vp<[[STEPS]]>
725723
; CHECK-NEXT: Successor(s): pred.store
726724
; CHECK-EMPTY:
727725
; CHECK-NEXT: <xVFxUF> pred.store: {
@@ -730,6 +728,8 @@ define void @update_2_uses_in_same_recipe_in_merged_block(i32 %k) {
730728
; CHECK-NEXT: Successor(s): pred.store.if, pred.store.continue
731729
; CHECK-EMPTY:
732730
; CHECK-NEXT: pred.store.if:
731+
; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>
732+
; CHECK-NEXT: REPLICATE ir<%gep.a> = getelementptr ir<@a>, ir<0>, vp<[[STEPS]]>
733733
; CHECK-NEXT: REPLICATE ir<%lv.a> = load ir<%gep.a>
734734
; CHECK-NEXT: REPLICATE ir<%div> = sdiv ir<%lv.a>, ir<%lv.a>
735735
; CHECK-NEXT: REPLICATE store ir<%div>, ir<%gep.a>

0 commit comments

Comments
 (0)