summaryrefslogtreecommitdiffstats
path: root/llvm/lib
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
commit03011f1393f3e93d71c924a3a1dc616e8a4c3285 (patch)
treec234d9a06b62740ec2d30c4ef3b24e44485a71ac /llvm/lib
parentc9741887c308faba9d1841ca49257b24390224c5 (diff)
downloadbcm5719-llvm-03011f1393f3e93d71c924a3a1dc616e8a4c3285.tar.gz
bcm5719-llvm-03011f1393f3e93d71c924a3a1dc616e8a4c3285.zip
Vectorizer: optimize the generation of selects. If the condition is uniform, generate a scalar-cond select (i1 as selector).
llvm-svn: 166409
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Transforms/Vectorize/LoopVectorize.cpp22
1 files changed, 16 insertions, 6 deletions
diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
index 0fbf3e08319..59e8e5e5fd1 100644
--- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+++ b/llvm/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;
}
OpenPOWER on IntegriCloud