[PATCH] D144434: [VPlan] Handle invariant GEPs in isUniformAfterVectorization.
Florian Hahn via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Feb 20 15:08:33 PST 2023
fhahn created this revision.
fhahn added reviewers: Ayal, gilr, rengolin.
Herald added subscribers: StephenFan, tschuett, psnobl, rogfer01, bollu, hiraditya.
Herald added a project: All.
fhahn requested review of this revision.
Herald added subscribers: pcwang-thead, alextsao1999, vkmr.
Herald added a project: LLVM.
This fixes a crash caused by legal treating a scalable GEP as invariant,
but isUniformAfterVectorization does not handle GEPs.
Fixes https://github.com/llvm/llvm-project/issues/60831.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D144434
Files:
llvm/lib/Transforms/Vectorize/VPlan.h
llvm/test/Transforms/LoopVectorize/AArch64/sve-inv-store.ll
Index: llvm/test/Transforms/LoopVectorize/AArch64/sve-inv-store.ll
===================================================================
--- llvm/test/Transforms/LoopVectorize/AArch64/sve-inv-store.ll
+++ llvm/test/Transforms/LoopVectorize/AArch64/sve-inv-store.ll
@@ -139,6 +139,23 @@
ret void
}
+; Test case for PR60831.
+define void @test_invar_gep(i8* %store_dest) #0 {
+entry:
+ br label %loop
+
+loop:
+ %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
+ %gep.invar = getelementptr i8, i8* %store_dest, i64 0
+ store i64 %iv, i8* %gep.invar, align 1
+ %iv.next = add nsw i64 %iv, 1
+ %ec = icmp eq i64 %iv.next, 100
+ br i1 %ec, label %exit, label %loop, !llvm.loop !0
+
+exit:
+ ret void
+}
+
attributes #0 = { "target-features"="+neon,+sve" vscale_range(1, 16) }
!0 = distinct !{!0, !1, !2, !3, !4, !5}
Index: llvm/lib/Transforms/Vectorize/VPlan.h
===================================================================
--- llvm/lib/Transforms/Vectorize/VPlan.h
+++ llvm/lib/Transforms/Vectorize/VPlan.h
@@ -2706,6 +2706,8 @@
assert(Def && "Must have definition for value defined inside vector region");
if (auto Rep = dyn_cast<VPReplicateRecipe>(Def))
return Rep->isUniform();
+ if (auto *GEP = dyn_cast<VPWidenGEPRecipe>(Def))
+ return all_of(GEP->operands(), isUniformAfterVectorization);
return false;
}
} // end namespace vputils
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D144434.498969.patch
Type: text/x-patch
Size: 1375 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230220/60924a4f/attachment.bin>
More information about the llvm-commits
mailing list