[llvm] cbaac14 - [LV] Remove induction recipes only used outside vector loop.

Florian Hahn via llvm-commits llvm-commits at lists.llvm.org
Mon Feb 28 03:14:45 PST 2022


Author: Florian Hahn
Date: 2022-02-28T11:14:22Z
New Revision: cbaac1473403835d585857fef24fc3de4b456577

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

LOG: [LV] Remove induction recipes only used outside vector loop.

Exit values of vector inductions are generated completely independent of
the induction recipes. Consider them for removal, if they are not used
in loop.

This fixes a crash exposed by 49b23f451cf7130.

Added: 
    

Modified: 
    llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
    llvm/test/Transforms/LoopVectorize/iv_outside_user.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
index 5e8e91bec3f51..90fdb69fc26b2 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
@@ -368,9 +368,12 @@ void VPlanTransforms::removeDeadRecipes(VPlan &Plan, Loop &OrigLoop) {
     if (R.mayHaveSideEffects() ||
         any_of(R.definedValues(),
                [](VPValue *V) { return V->getNumUsers() > 0; }) ||
-        (R.getUnderlyingInstr() &&
+        (R.getUnderlyingInstr() && !isa<VPWidenIntOrFpInductionRecipe>(&R) &&
          any_of(R.getUnderlyingInstr()->users(), [&OrigLoop](User *U) {
            // Check for live-out users currently not modeled in VPlan.
+           // Note that exit values of VPWidenIntOrFpInductionRecipes are
+           // generated independent of the recipe. Such recipes can be removed,
+           // independent of uses outside the loop.
            // TODO: Remove once live-outs are modeled in VPlan.
            return !OrigLoop.contains(cast<Instruction>(U));
          })))

diff  --git a/llvm/test/Transforms/LoopVectorize/iv_outside_user.ll b/llvm/test/Transforms/LoopVectorize/iv_outside_user.ll
index 373aa9b0a5352..fb96e4a9edbc2 100644
--- a/llvm/test/Transforms/LoopVectorize/iv_outside_user.ll
+++ b/llvm/test/Transforms/LoopVectorize/iv_outside_user.ll
@@ -1,5 +1,5 @@
 ; RUN: opt -S -loop-vectorize -force-vector-interleave=1 -force-vector-width=2 < %s | FileCheck --check-prefixes=CHECK,VEC %s
-; RUN: opt -S -loop-vectorize -force-vector-interleave=2 -force-vector-width=1 < %s | FileCheck --check-prefixes=CHECK,INTERLEAVE %s
+; RUN: opt -S -loop-vectorize -force-vector-interleave=2 -force-vector-width=1 < %s | FileCheck --check-prefixes=CHECK %s
 
 ; CHECK-LABEL: @postinc
 ; CHECK-LABEL: scalar.ph:
@@ -208,12 +208,7 @@ define i32 @iv_2_dead_in_loop_only_used_outside(i64* %ptr) {
 ; VEC-NEXT:     [[VEC_IND:%.+]] = phi <2 x i64> [ <i64 0, i64 1>, %vector.ph ], [ [[VEC_IND_NEXT:%.+]], %vector.body ]
 ; CHECK-NEXT:   [[IV_0:%.+]] = add i64 [[INDEX]], 0
 ; CHECK-NEXT:   [[IV_1:%.+]] = add i64 [[INDEX]], 1
-; CHECK-NEXT:   [[INDEX_TRUNC:%.+]] = trunc i64 [[INDEX]] to i32
-; CHECK-NEXT:   [[IV_2_OFFSET:%.+]] = mul i32 [[INDEX_TRUNC]], 2
-; CHECK-NEXT:   [[IV_2_0:%.+]] = add i32 %offset.idx, 0
-; INTERLEAVE-NEXT: [[IV_2_1:%.+]] = add i32 %offset.idx, 2
-; CHECK-NOT:    [[IV_2_0]]
-; INTERLEAVE-NOT:  [[IV_2_1]]
+; CHECK-NOT:    [[IV_2_0:%.+]] = add i32 %offset.idx, 0
 ; CHECK-LABEL: scalar.ph:
 ; CHECK-NEXT:    {{.+}} = phi i64 [ 1002, %middle.block ], [ 0, %entry ]
 ; CHECK-NEXT:    {{.+}} = phi i32 [ 2004, %middle.block ], [ 0, %entry ]


        


More information about the llvm-commits mailing list