From: Florian Hahn Date: Fri, 1 Apr 2022 14:14:47 +0000 (+0100) Subject: [LV] Add SCEV workaround from 80e8025 to epilogue vector code path. X-Git-Tag: upstream/15.0.7~11735 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=14e5f9785c9ccc0b0cc29a21f042b7b562a34a3b;p=platform%2Fupstream%2Fllvm.git [LV] Add SCEV workaround from 80e8025 to epilogue vector code path. This was exposed by 14e3650f. The recommit of 14e3650f will hit the problematic code path requiring the workaround. test case that crashes without the workaround. --- diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp index d1f6f5c..0cfe64a 100644 --- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp +++ b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp @@ -7741,6 +7741,15 @@ Value *InnerLoopUnroller::getBroadcastInstrs(Value *V) { return V; } std::pair EpilogueVectorizerMainLoop::createEpilogueVectorizedLoopSkeleton() { MDNode *OrigLoopID = OrigLoop->getLoopID(); + + // Workaround! Compute the trip count of the original loop and cache it + // before we start modifying the CFG. This code has a systemic problem + // wherein it tries to run analysis over partially constructed IR; this is + // wrong, and not simply for SCEV. The trip count of the original loop + // simply happens to be prone to hitting this in practice. In theory, we + // can hit the same issue for any SCEV, or ValueTracking query done during + // mutation. See PR49900. + getOrCreateTripCount(OrigLoop->getLoopPreheader()); Loop *Lp = createVectorLoopSkeleton(""); // Generate the code to check the minimum iteration count of the vector