Add a comment
authorChris Lattner <sabre@nondot.org>
Tue, 2 Aug 2005 01:32:29 +0000 (01:32 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 2 Aug 2005 01:32:29 +0000 (01:32 +0000)
Make LSR ignore GEP's that have loop variant base values, as we currently
cannot codegen them

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@22576 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/LoopStrengthReduce.cpp

index 0967fb7200b88135bfe9546bfc0ab8e51047fdff..f3834158c1caa8398c166b7b5aa3e6a6392d8af5 100644 (file)
@@ -251,6 +251,9 @@ void LoopStrengthReduce::AnalyzeGetElementPtrUsers(GetElementPtrInst *GEP,
                                                                 UIntPtrTy));
     } else {
       SCEVHandle Idx = SE->getSCEV(GEP->getOperand(i));
+
+      // If this operand is reducible, and it's not the one we are looking at
+      // currently, do not process the GEP at this time.
       if (CanReduceSCEV(Idx, L))
         return;
       Base = SCEVAddExpr::get(Base, GetAdjustedIndex(Idx,
@@ -287,6 +290,13 @@ void LoopStrengthReduce::AnalyzeGetElementPtrUsers(GetElementPtrInst *GEP,
 
   assert(CanReduceSCEV(GEPIndexExpr, L) && "Non reducible idx??");
 
+  // FIXME: If the base is not loop invariant, we currently cannot emit this.
+  if (!Base->isLoopInvariant(L)) {
+    DEBUG(std::cerr << "IGNORING GEP due to non-invaiant base: "
+                    << *Base << "\n");
+    return;
+  }
+  
   Base = SCEVAddExpr::get(Base, cast<SCEVAddRecExpr>(GEPIndexExpr)->getStart());
   SCEVHandle Stride = cast<SCEVAddRecExpr>(GEPIndexExpr)->getOperand(1);