diff options
| author | Chandler Carruth <chandlerc@gmail.com> | 2012-12-17 13:07:30 +0000 | 
|---|---|---|
| committer | Chandler Carruth <chandlerc@gmail.com> | 2012-12-17 13:07:30 +0000 | 
| commit | b6bc8749e8a55102fcb601322cd7b3def90466ed (patch) | |
| tree | d9470d9a09800e68fbadb94eb53e3c2a392e5c8d /llvm/lib/Transforms | |
| parent | 769445ef03e3ac5967694f79a66f9af5b8c6acad (diff) | |
| download | bcm5719-llvm-b6bc8749e8a55102fcb601322cd7b3def90466ed.tar.gz bcm5719-llvm-b6bc8749e8a55102fcb601322cd7b3def90466ed.zip | |
Lift the extractVector helper all the way out to a static helper function.
The method helpers all implicitly act upon the alloca, and what we
really want is a fully generic helper. Doing memcpy rewrites is more
special than all other rewrites because we are at times rewriting
instructions which touch pointers *other* than the alloca. As
a consequence all of the helpers needed by memcpy rewriting of
sub-vector copies will need to be generalized fully.
Note that all of these helpers ({insert,extract}{Integer,Vector}) are
woefully uncommented. I'm going to go back through and document them
once I get the factoring correct.
No functionality changed.
llvm-svn: 170325
Diffstat (limited to 'llvm/lib/Transforms')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/SROA.cpp | 62 | 
1 files changed, 32 insertions, 30 deletions
| diff --git a/llvm/lib/Transforms/Scalar/SROA.cpp b/llvm/lib/Transforms/Scalar/SROA.cpp index ffaa131645a..927f996beb3 100644 --- a/llvm/lib/Transforms/Scalar/SROA.cpp +++ b/llvm/lib/Transforms/Scalar/SROA.cpp @@ -2223,6 +2223,34 @@ static Value *insertInteger(const DataLayout &DL, IRBuilder<> &IRB, Value *Old,    return V;  } +static Value *extractVector(IRBuilder<> &IRB, Value *V, +                            unsigned BeginIndex, unsigned EndIndex, +                            const Twine &Name) { +  VectorType *VecTy = cast<VectorType>(V->getType()); +  unsigned NumElements = EndIndex - BeginIndex; +  assert(NumElements <= VecTy->getNumElements() && "Too many elements!"); + +  if (NumElements == VecTy->getNumElements()) +    return V; + +  if (NumElements == 1) { +    V = IRB.CreateExtractElement(V, IRB.getInt32(BeginIndex), +                                 Name + ".extract"); +    DEBUG(dbgs() << "     extract: " << *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), +                              Name + ".extract"); +  DEBUG(dbgs() << "     shuffle: " << *V << "\n"); +  return V; +} +  namespace {  /// \brief Visitor to rewrite instructions using a partition of an alloca to  /// use a new alloca. @@ -2388,40 +2416,14 @@ private:        Pass.DeadInsts.insert(I);    } -  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"); -      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 *V = IRB.CreateAlignedLoad(&NewAI, NewAI.getAlignment(), +                                     getName(".load")); +    return extractVector(IRB, V, BeginIndex, EndIndex, getName(".vec"));    }    Value *rewriteIntegerLoad(IRBuilder<> &IRB, LoadInst &LI) { | 

