[LV] Add SCEV workaround from 80e8025 to epilogue vector code path.
authorFlorian Hahn <flo@fhahn.com>
Fri, 1 Apr 2022 14:14:47 +0000 (15:14 +0100)
committerFlorian Hahn <flo@fhahn.com>
Fri, 1 Apr 2022 14:14:47 +0000 (15:14 +0100)
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.

llvm/lib/Transforms/Vectorize/LoopVectorize.cpp

index d1f6f5c..0cfe64a 100644 (file)
@@ -7741,6 +7741,15 @@ Value *InnerLoopUnroller::getBroadcastInstrs(Value *V) { return V; }
 std::pair<BasicBlock *, Value *>
 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