[PATCH] D134083: [IVDescriptors] Before moving an instruction in SinkAfter checking if it is target of other instructions
Guozhi Wei via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Sep 26 15:36:10 PDT 2022
Carrot updated this revision to Diff 463040.
Carrot marked 2 inline comments as done.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D134083/new/
https://reviews.llvm.org/D134083
Files:
llvm/lib/Analysis/IVDescriptors.cpp
llvm/test/Transforms/LoopVectorize/first-order-recurrence-chains.ll
Index: llvm/test/Transforms/LoopVectorize/first-order-recurrence-chains.ll
===================================================================
--- llvm/test/Transforms/LoopVectorize/first-order-recurrence-chains.ll
+++ llvm/test/Transforms/LoopVectorize/first-order-recurrence-chains.ll
@@ -637,3 +637,30 @@
exit:
ret void
}
+
+; Make sure LLVM doesn't generate wrong data in SinkAfter, and causes crash in
+; loop vectorizer.
+define void @test_crash(ptr %p) {
+; CHECK-LABEL: @test_crash
+; CHECK: ret
+Entry:
+ br label %Loop
+
+Loop:
+ %for.1 = phi double [ %iv1, %Loop ], [ 0.000000e+00, %Entry ]
+ %for.2 = phi double [ %iv2, %Loop ], [ 0.000000e+00, %Entry ]
+ %for.3 = phi double [ %for.2, %Loop ], [ 0.000000e+00, %Entry ]
+ %for.4 = phi i64 [ %count, %Loop ], [ 0, %Entry ]
+ %USE_2_INDVARS = fdiv double %for.3, %for.1
+ %div = fdiv double 0.000000e+00, %for.1
+ %iv1 = load double, ptr null, align 8
+ %count = add nuw nsw i64 %for.4, 1
+ %iv2 = load double, ptr null, align 8
+ store double %div, ptr %p, align 8
+ %cond = icmp eq i64 %count, 0
+ br i1 %cond, label %End, label %Loop
+
+End:
+ ret void
+}
+
Index: llvm/lib/Analysis/IVDescriptors.cpp
===================================================================
--- llvm/lib/Analysis/IVDescriptors.cpp
+++ llvm/lib/Analysis/IVDescriptors.cpp
@@ -1025,6 +1025,16 @@
// Previous. Nothing left to do.
if (DT->dominates(Previous, OtherPrev) || Previous == OtherPrev)
return true;
+
+ // If there are other instructions to be sunk after SinkCandidate, remove
+ // and re-insert SinkCandidate can break those instructions. Bail out for
+ // simplicity.
+ if (any_of(SinkAfter,
+ [SinkCandidate](const std::pair<Instruction *, Instruction *> &P) {
+ return P.second == SinkCandidate;
+ }))
+ return false;
+
// Otherwise, Previous comes after OtherPrev and SinkCandidate needs to be
// re-sunk to Previous, instead of sinking to OtherPrev. Remove
// SinkCandidate from SinkAfter to ensure it's insert position is updated.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D134083.463040.patch
Type: text/x-patch
Size: 2110 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220926/bc0a70ac/attachment.bin>
More information about the llvm-commits
mailing list