[llvm-commits] [llvm] r170324 - /llvm/trunk/lib/Transforms/Scalar/SROA.cpp

Chandler Carruth chandlerc at gmail.com
Mon Dec 17 04:50:21 PST 2012


Author: chandlerc
Date: Mon Dec 17 06:50:21 2012
New Revision: 170324

URL: http://llvm.org/viewvc/llvm-project?rev=170324&view=rev
Log:
Factor the vector load rewriting into a more generic form.

This makes it suitable for use in rewriting memcpy in the presence of
subvector memcpy intrinsics.

No functionality changed.

Modified:
    llvm/trunk/lib/Transforms/Scalar/SROA.cpp

Modified: llvm/trunk/lib/Transforms/Scalar/SROA.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/SROA.cpp?rev=170324&r1=170323&r2=170324&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/SROA.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/SROA.cpp Mon Dec 17 06:50:21 2012
@@ -2388,31 +2388,42 @@
       Pass.DeadInsts.insert(I);
   }
 
-  Value *rewriteVectorizedLoadInst(IRBuilder<> &IRB, LoadInst &LI, Value *OldOp) {
-    Value *V = IRB.CreateAlignedLoad(&NewAI, NewAI.getAlignment(),
-                                     getName(".load"));
-    unsigned BeginIndex = getIndex(BeginOffset);
-    unsigned EndIndex = getIndex(EndOffset);
-    assert(EndIndex > BeginIndex && "Empty vector!");
+  Value *extractVector(IRBuilder<> &IRB,
+                      unsigned BeginIndex, unsigned EndIndex) {
     unsigned NumElements = EndIndex - BeginIndex;
     assert(NumElements <= VecTy->getNumElements() && "Too many elements!");
+
+    Value *V = IRB.CreateAlignedLoad(&NewAI, NewAI.getAlignment(),
+                                     getName(".load"));
+
+    if (NumElements == VecTy->getNumElements())
+      return V;
+
     if (NumElements == 1) {
       V = IRB.CreateExtractElement(V, IRB.getInt32(BeginIndex),
                                    getName(".extract"));
       DEBUG(dbgs() << "     extract: " << *V << "\n");
-    } else if (NumElements < VecTy->getNumElements()) {
-      SmallVector<Constant*, 8> Mask;
-      Mask.reserve(NumElements);
-      for (unsigned i = BeginIndex; i != EndIndex; ++i)
-        Mask.push_back(IRB.getInt32(i));
-      V = IRB.CreateShuffleVector(V, UndefValue::get(V->getType()),
-                                  ConstantVector::get(Mask),
-                                  getName(".extract"));
-      DEBUG(dbgs() << "     shuffle: " << *V << "\n");
+      return V;
     }
+
+    SmallVector<Constant*, 8> Mask;
+    Mask.reserve(NumElements);
+    for (unsigned i = BeginIndex; i != EndIndex; ++i)
+      Mask.push_back(IRB.getInt32(i));
+    V = IRB.CreateShuffleVector(V, UndefValue::get(V->getType()),
+                                ConstantVector::get(Mask),
+                                getName(".extract"));
+    DEBUG(dbgs() << "     shuffle: " << *V << "\n");
     return V;
   }
 
+  Value *rewriteVectorizedLoadInst(IRBuilder<> &IRB) {
+    unsigned BeginIndex = getIndex(BeginOffset);
+    unsigned EndIndex = getIndex(EndOffset);
+    assert(EndIndex > BeginIndex && "Empty vector!");
+    return extractVector(IRB, BeginIndex, EndIndex);
+  }
+
   Value *rewriteIntegerLoad(IRBuilder<> &IRB, LoadInst &LI) {
     assert(IntTy && "We cannot insert an integer to the alloca");
     assert(!LI.isVolatile());
@@ -2457,7 +2468,7 @@
     bool IsPtrAdjusted = false;
     Value *V;
     if (VecTy) {
-      V = rewriteVectorizedLoadInst(IRB, LI, OldOp);
+      V = rewriteVectorizedLoadInst(IRB);
     } else if (IntTy && LI.getType()->isIntegerTy()) {
       V = rewriteIntegerLoad(IRB, LI);
     } else if (BeginOffset == NewAllocaBeginOffset &&





More information about the llvm-commits mailing list