diff options
| author | Nadav Rotem <nrotem@apple.com> | 2013-05-01 19:53:30 +0000 |
|---|---|---|
| committer | Nadav Rotem <nrotem@apple.com> | 2013-05-01 19:53:30 +0000 |
| commit | fee6969463d455201a5179620ccd8c3171effaa6 (patch) | |
| tree | d0409f54fd1c3472bf545f29eca59cb2eb2bbe8b /lib/Transforms | |
| parent | f0b0755b6ea0b5c55bbf51ddd29439c01c7102e5 (diff) | |
| download | external_llvm-fee6969463d455201a5179620ccd8c3171effaa6.zip external_llvm-fee6969463d455201a5179620ccd8c3171effaa6.tar.gz external_llvm-fee6969463d455201a5179620ccd8c3171effaa6.tar.bz2 | |
SROA: Generate selects instead of shuffles when blending values because this is the cannonical form.
Shuffles are more difficult to lower and we usually don't touch them, while we do optimize selects more often.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@180875 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms')
| -rw-r--r-- | lib/Transforms/Scalar/SROA.cpp | 14 |
1 files changed, 6 insertions, 8 deletions
diff --git a/lib/Transforms/Scalar/SROA.cpp b/lib/Transforms/Scalar/SROA.cpp index c383e2f..d073e78 100644 --- a/lib/Transforms/Scalar/SROA.cpp +++ b/lib/Transforms/Scalar/SROA.cpp @@ -2322,17 +2322,15 @@ static Value *insertVector(IRBuilderTy &IRB, Value *Old, Value *V, V = IRB.CreateShuffleVector(V, UndefValue::get(V->getType()), ConstantVector::get(Mask), Name + ".expand"); - DEBUG(dbgs() << " shuffle1: " << *V << "\n"); + DEBUG(dbgs() << " shuffle: " << *V << "\n"); Mask.clear(); for (unsigned i = 0; i != VecTy->getNumElements(); ++i) - if (i >= BeginIndex && i < EndIndex) - Mask.push_back(IRB.getInt32(i)); - else - Mask.push_back(IRB.getInt32(i + VecTy->getNumElements())); - V = IRB.CreateShuffleVector(V, Old, ConstantVector::get(Mask), - Name + "insert"); - DEBUG(dbgs() << " shuffle2: " << *V << "\n"); + Mask.push_back(IRB.getInt1(i >= BeginIndex && i < EndIndex)); + + V = IRB.CreateSelect(ConstantVector::get(Mask), V, Old, Name + "blend"); + + DEBUG(dbgs() << " blend: " << *V << "\n"); return V; } |
