[llvm] cf98a4b - [LV] Simplify the latch branch before rewriting ALM for a scalar VF (#216257)

via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 14 13:52:52 PDT 2026


Author: Florian Hahn
Date: 2026-08-14T20:52:47Z
New Revision: cf98a4bf35f296f734b3a6ba3202baf468386c51

URL: https://github.com/llvm/llvm-project/commit/cf98a4bf35f296f734b3a6ba3202baf468386c51
DIFF: https://github.com/llvm/llvm-project/commit/cf98a4bf35f296f734b3a6ba3202baf468386c51.diff

LOG: [LV] Simplify the latch branch before rewriting ALM for a scalar VF (#216257)

Run simplifyBranchConditionForVFAndUF before replaceMaskWithCompare
before, so the simplification triggers before replaceMaskWithCompare
writes the plan.

PR: https://github.com/llvm/llvm-project/pull/216257

Added: 
    

Modified: 
    llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
    llvm/test/Transforms/LoopVectorize/vector-loop-backedge-elimination-tail-folding-interleave-only.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
index eb5958c37043d..e75e9cf4e9103 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
@@ -2142,8 +2142,9 @@ void VPlanTransforms::optimizeForVFAndUF(VPlan &Plan, ElementCount BestVF,
   assert(Plan.hasVF(BestVF) && "BestVF is not available in Plan");
   assert(Plan.hasUF(BestUF) && "BestUF is not available in Plan");
 
-  bool MadeChange = replaceMaskWithCompare(Plan, BestVF);
-  MadeChange |= simplifyBranchConditionForVFAndUF(Plan, BestVF, BestUF, PSE);
+  bool MadeChange =
+      simplifyBranchConditionForVFAndUF(Plan, BestVF, BestUF, PSE);
+  MadeChange |= replaceMaskWithCompare(Plan, BestVF);
   MadeChange |= optimizeVectorInductionWidthForTCAndVFUF(Plan, BestVF, BestUF);
 
   if (MadeChange) {

diff  --git a/llvm/test/Transforms/LoopVectorize/vector-loop-backedge-elimination-tail-folding-interleave-only.ll b/llvm/test/Transforms/LoopVectorize/vector-loop-backedge-elimination-tail-folding-interleave-only.ll
index a9eb11b609945..56c6d1c7421f9 100644
--- a/llvm/test/Transforms/LoopVectorize/vector-loop-backedge-elimination-tail-folding-interleave-only.ll
+++ b/llvm/test/Transforms/LoopVectorize/vector-loop-backedge-elimination-tail-folding-interleave-only.ll
@@ -10,63 +10,37 @@ define void @scalar_vf_single_iteration(ptr noalias %dst, ptr noalias %src) {
 ; CHECK:       [[VECTOR_PH]]:
 ; CHECK-NEXT:    br label %[[VECTOR_BODY:.*]]
 ; CHECK:       [[VECTOR_BODY]]:
-; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[PRED_STORE_CONTINUE9:.*]] ]
-; CHECK-NEXT:    [[ACTIVE_LANE_MASK:%.*]] = phi i1 [ true, %[[VECTOR_PH]] ], [ [[TMP19:%.*]], %[[PRED_STORE_CONTINUE9]] ]
-; CHECK-NEXT:    [[ACTIVE_LANE_MASK1:%.*]] = phi i1 [ true, %[[VECTOR_PH]] ], [ [[TMP21:%.*]], %[[PRED_STORE_CONTINUE9]] ]
-; CHECK-NEXT:    [[ACTIVE_LANE_MASK2:%.*]] = phi i1 [ true, %[[VECTOR_PH]] ], [ [[TMP23:%.*]], %[[PRED_STORE_CONTINUE9]] ]
-; CHECK-NEXT:    [[ACTIVE_LANE_MASK3:%.*]] = phi i1 [ false, %[[VECTOR_PH]] ], [ [[TMP25:%.*]], %[[PRED_STORE_CONTINUE9]] ]
-; CHECK-NEXT:    br i1 [[ACTIVE_LANE_MASK]], label %[[PRED_STORE_IF:.*]], label %[[PRED_STORE_CONTINUE:.*]]
-; CHECK:       [[PRED_STORE_IF]]:
-; CHECK-NEXT:    [[TMP0:%.*]] = getelementptr inbounds i64, ptr [[SRC]], i64 [[INDEX]]
-; CHECK-NEXT:    [[TMP1:%.*]] = load i64, ptr [[TMP0]], align 8
-; CHECK-NEXT:    [[TMP2:%.*]] = getelementptr inbounds i64, ptr [[DST]], i64 [[INDEX]]
-; CHECK-NEXT:    [[TMP3:%.*]] = mul i64 [[TMP1]], 3
-; CHECK-NEXT:    store i64 [[TMP3]], ptr [[TMP2]], align 8
-; CHECK-NEXT:    br label %[[PRED_STORE_CONTINUE]]
+; CHECK-NEXT:    br label %[[PRED_STORE_CONTINUE:.*]]
 ; CHECK:       [[PRED_STORE_CONTINUE]]:
-; CHECK-NEXT:    br i1 [[ACTIVE_LANE_MASK1]], label %[[PRED_STORE_IF4:.*]], label %[[PRED_STORE_CONTINUE5:.*]]
-; CHECK:       [[PRED_STORE_IF4]]:
-; CHECK-NEXT:    [[TMP4:%.*]] = add i64 [[INDEX]], 1
-; CHECK-NEXT:    [[TMP5:%.*]] = getelementptr inbounds i64, ptr [[SRC]], i64 [[TMP4]]
-; CHECK-NEXT:    [[TMP6:%.*]] = load i64, ptr [[TMP5]], align 8
-; CHECK-NEXT:    [[TMP7:%.*]] = getelementptr inbounds i64, ptr [[DST]], i64 [[TMP4]]
+; CHECK-NEXT:    [[TMP6:%.*]] = load i64, ptr [[SRC]], align 8
 ; CHECK-NEXT:    [[TMP8:%.*]] = mul i64 [[TMP6]], 3
-; CHECK-NEXT:    store i64 [[TMP8]], ptr [[TMP7]], align 8
-; CHECK-NEXT:    br label %[[PRED_STORE_CONTINUE5]]
+; CHECK-NEXT:    store i64 [[TMP8]], ptr [[DST]], align 8
+; CHECK-NEXT:    br label %[[PRED_STORE_CONTINUE5:.*]]
 ; CHECK:       [[PRED_STORE_CONTINUE5]]:
-; CHECK-NEXT:    br i1 [[ACTIVE_LANE_MASK2]], label %[[PRED_STORE_IF6:.*]], label %[[PRED_STORE_CONTINUE7:.*]]
+; CHECK-NEXT:    br label %[[PRED_STORE_IF6:.*]]
 ; CHECK:       [[PRED_STORE_IF6]]:
-; CHECK-NEXT:    [[TMP9:%.*]] = add i64 [[INDEX]], 2
-; CHECK-NEXT:    [[TMP10:%.*]] = getelementptr inbounds i64, ptr [[SRC]], i64 [[TMP9]]
+; CHECK-NEXT:    [[TMP10:%.*]] = getelementptr inbounds i64, ptr [[SRC]], i64 1
 ; CHECK-NEXT:    [[TMP11:%.*]] = load i64, ptr [[TMP10]], align 8
-; CHECK-NEXT:    [[TMP12:%.*]] = getelementptr inbounds i64, ptr [[DST]], i64 [[TMP9]]
+; CHECK-NEXT:    [[TMP12:%.*]] = getelementptr inbounds i64, ptr [[DST]], i64 1
 ; CHECK-NEXT:    [[TMP13:%.*]] = mul i64 [[TMP11]], 3
 ; CHECK-NEXT:    store i64 [[TMP13]], ptr [[TMP12]], align 8
-; CHECK-NEXT:    br label %[[PRED_STORE_CONTINUE7]]
+; CHECK-NEXT:    br label %[[PRED_STORE_CONTINUE7:.*]]
 ; CHECK:       [[PRED_STORE_CONTINUE7]]:
-; CHECK-NEXT:    br i1 [[ACTIVE_LANE_MASK3]], label %[[PRED_STORE_IF8:.*]], label %[[PRED_STORE_CONTINUE9]]
+; CHECK-NEXT:    br label %[[PRED_STORE_IF8:.*]]
 ; CHECK:       [[PRED_STORE_IF8]]:
-; CHECK-NEXT:    [[TMP14:%.*]] = add i64 [[INDEX]], 3
-; CHECK-NEXT:    [[TMP15:%.*]] = getelementptr inbounds i64, ptr [[SRC]], i64 [[TMP14]]
+; CHECK-NEXT:    [[TMP15:%.*]] = getelementptr inbounds i64, ptr [[SRC]], i64 2
 ; CHECK-NEXT:    [[TMP16:%.*]] = load i64, ptr [[TMP15]], align 8
-; CHECK-NEXT:    [[TMP17:%.*]] = getelementptr inbounds i64, ptr [[DST]], i64 [[TMP14]]
+; CHECK-NEXT:    [[TMP17:%.*]] = getelementptr inbounds i64, ptr [[DST]], i64 2
 ; CHECK-NEXT:    [[TMP18:%.*]] = mul i64 [[TMP16]], 3
 ; CHECK-NEXT:    store i64 [[TMP18]], ptr [[TMP17]], align 8
-; CHECK-NEXT:    br label %[[PRED_STORE_CONTINUE9]]
+; CHECK-NEXT:    br label %[[PRED_STORE_CONTINUE9:.*]]
 ; CHECK:       [[PRED_STORE_CONTINUE9]]:
-; CHECK-NEXT:    [[INDEX_NEXT]] = add i64 [[INDEX]], 4
-; CHECK-NEXT:    [[TMP19]] = icmp ult i64 [[INDEX_NEXT]], 3
-; CHECK-NEXT:    [[TMP20:%.*]] = add i64 [[INDEX_NEXT]], 1
-; CHECK-NEXT:    [[TMP21]] = icmp ult i64 [[TMP20]], 3
-; CHECK-NEXT:    [[TMP22:%.*]] = add i64 [[INDEX_NEXT]], 2
-; CHECK-NEXT:    [[TMP23]] = icmp ult i64 [[TMP22]], 3
-; CHECK-NEXT:    [[TMP24:%.*]] = add i64 [[INDEX_NEXT]], 3
-; CHECK-NEXT:    [[TMP25]] = icmp ult i64 [[TMP24]], 3
-; CHECK-NEXT:    [[TMP26:%.*]] = xor i1 [[TMP19]], true
-; CHECK-NEXT:    br i1 [[TMP26]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
-; CHECK:       [[MIDDLE_BLOCK]]:
 ; CHECK-NEXT:    br label %[[EXIT:.*]]
 ; CHECK:       [[EXIT]]:
+; CHECK-NEXT:    br label %[[MIDDLE_BLOCK:.*]]
+; CHECK:       [[MIDDLE_BLOCK]]:
+; CHECK-NEXT:    br label %[[EXIT1:.*]]
+; CHECK:       [[EXIT1]]:
 ; CHECK-NEXT:    ret void
 ;
 entry:


        


More information about the llvm-commits mailing list