OSDN Git Service

[LIR] Factor out the code to compute base ptr for negative strided loops.
authorChad Rosier <mcrosier@codeaurora.org>
Fri, 13 Nov 2015 19:11:07 +0000 (19:11 +0000)
committerChad Rosier <mcrosier@codeaurora.org>
Fri, 13 Nov 2015 19:11:07 +0000 (19:11 +0000)
This will allow for the code to be reused in the memcpy optimization.

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

lib/Transforms/Scalar/LoopIdiomRecognize.cpp

index e177d4a..de0dc3c 100644 (file)
@@ -494,6 +494,19 @@ static Constant *getMemSetPatternValue(Value *V, const DataLayout *DL) {
   return ConstantArray::get(AT, std::vector<Constant *>(ArraySize, C));
 }
 
+// If we have a negative stride, Start refers to the end of the memory location
+// we're trying to memset.  Therefore, we need to recompute the base pointer,
+// which is just Start - BECount*Size.
+static const SCEV *getStartForNegStride(const SCEV *Start, const SCEV *BECount,
+                                        Type *IntPtr, unsigned StoreSize,
+                                        ScalarEvolution *SE) {
+  const SCEV *Index = SE->getTruncateOrZeroExtend(BECount, IntPtr);
+  if (StoreSize != 1)
+    Index = SE->getMulExpr(Index, SE->getConstant(IntPtr, StoreSize),
+                           SCEV::FlagNUW);
+  return SE->getMinusSCEV(Start, Index);
+}
+
 /// processLoopStridedStore - We see a strided store of some value.  If we can
 /// transform this into a memset or memset_pattern in the loop preheader, do so.
 bool LoopIdiomRecognize::processLoopStridedStore(
@@ -539,16 +552,8 @@ bool LoopIdiomRecognize::processLoopStridedStore(
   Type *IntPtr = Builder.getIntPtrTy(*DL, DestAS);
 
   const SCEV *Start = Ev->getStart();
-  // If we have a negative stride, Start refers to the end of the memory
-  // location we're trying to memset.  Therefore, we need to recompute the start
-  // point, which is just Start - BECount*Size.
-  if (NegStride) {
-    const SCEV *Index = SE->getTruncateOrZeroExtend(BECount, IntPtr);
-    if (StoreSize != 1)
-      Index = SE->getMulExpr(Index, SE->getConstant(IntPtr, StoreSize),
-                             SCEV::FlagNUW);
-    Start = SE->getMinusSCEV(Ev->getStart(), Index);
-  }
+  if (NegStride)
+    Start = getStartForNegStride(Start, BECount, IntPtr, StoreSize, SE);
 
   // Okay, we have a strided store "p[i]" of a splattable value.  We can turn
   // this into a memset in the loop preheader now if we want.  However, this