summaryrefslogtreecommitdiff
path: root/lib/Transforms
diff options
context:
space:
mode:
authorNadav Rotem <nrotem@apple.com>2012-10-22 04:38:00 +0000
committerNadav Rotem <nrotem@apple.com>2012-10-22 04:38:00 +0000
commit565048e78a152aa69b66422037b67c0f627bbfec (patch)
tree9bd888d016f8cb8a0f2ca49c9f7c2d81b43451df /lib/Transforms
parente0fa403e23ab5610471c2dbe5c032327ee1ed091 (diff)
downloadllvm-565048e78a152aa69b66422037b67c0f627bbfec.tar.gz
llvm-565048e78a152aa69b66422037b67c0f627bbfec.tar.bz2
llvm-565048e78a152aa69b66422037b67c0f627bbfec.tar.xz
Vectorizer: optimize the generation of selects. If the condition is uniform, generate a scalar-cond select (i1 as selector).
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@166409 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms')
-rw-r--r--lib/Transforms/Vectorize/LoopVectorize.cpp22
1 files changed, 16 insertions, 6 deletions
diff --git a/lib/Transforms/Vectorize/LoopVectorize.cpp b/lib/Transforms/Vectorize/LoopVectorize.cpp
index 0fbf3e0831..59e8e5e5fd 100644
--- a/lib/Transforms/Vectorize/LoopVectorize.cpp
+++ b/lib/Transforms/Vectorize/LoopVectorize.cpp
@@ -725,12 +725,22 @@ SingleBlockLoopVectorizer::vectorizeLoop(LoopVectorizationLegality *Legal) {
}
case Instruction::Select: {
// Widen selects.
- // TODO: If the selector is loop invariant we can issue a select
- // instruction with a scalar condition.
- Value *A = getVectorValue(Inst->getOperand(0));
- Value *B = getVectorValue(Inst->getOperand(1));
- Value *C = getVectorValue(Inst->getOperand(2));
- WidenMap[Inst] = Builder.CreateSelect(A, B, C);
+ // If the selector is loop invariant we can create a select
+ // instruction with a scalar condition. Otherwise, use vector-select.
+ Value *Cond = Inst->getOperand(0);
+ bool InvariantCond = SE->isLoopInvariant(SE->getSCEV(Cond), Orig);
+
+ // The condition can be loop invariant but still defined inside the
+ // loop. This means that we can't just use the original 'cond' value.
+ // We have to take the 'vectorized' value and pick the first lane.
+ // Instcombine will make this a no-op.
+ Cond = getVectorValue(Cond);
+ if (InvariantCond)
+ Cond = Builder.CreateExtractElement(Cond, Builder.getInt32(0));
+
+ Value *Op0 = getVectorValue(Inst->getOperand(1));
+ Value *Op1 = getVectorValue(Inst->getOperand(2));
+ WidenMap[Inst] = Builder.CreateSelect(Cond, Op0, Op1);
break;
}