diff options
| author | Sanjay Patel <spatel@rotateright.com> | 2017-09-25 17:00:04 +0000 |
|---|---|---|
| committer | Sanjay Patel <spatel@rotateright.com> | 2017-09-25 17:00:04 +0000 |
| commit | aa7f750becff41e71d29865b28d7b94d25785564 (patch) | |
| tree | 84658ca6158b0279b9ac63cf9e7769f4b7d09885 /llvm/lib | |
| parent | 9639897d7786d176f4c0e42ab4a9a7029ea50b78 (diff) | |
| download | bcm5719-llvm-aa7f750becff41e71d29865b28d7b94d25785564.tar.gz bcm5719-llvm-aa7f750becff41e71d29865b28d7b94d25785564.zip | |
revert r314117 because there are bogus clang tests that depend on the optimizer
llvm-svn: 314118
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp b/llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp index d760101281a..0d327795acf 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp @@ -255,6 +255,39 @@ Instruction *InstCombiner::visitExtractElementInst(ExtractElementInst &EI) { Worklist.AddValue(EE); return CastInst::Create(CI->getOpcode(), EE, EI.getType()); } + } else if (SelectInst *SI = dyn_cast<SelectInst>(I)) { + if (SI->hasOneUse()) { + // TODO: For a select on vectors, it might be useful to do this if it + // has multiple extractelement uses. For vector select, that seems to + // fight the vectorizer. + + // If we are extracting an element from a vector select or a select on + // vectors, create a select on the scalars extracted from the vector + // arguments. + Value *TrueVal = SI->getTrueValue(); + Value *FalseVal = SI->getFalseValue(); + + Value *Cond = SI->getCondition(); + if (Cond->getType()->isVectorTy()) { + Cond = Builder.CreateExtractElement(Cond, + EI.getIndexOperand(), + Cond->getName() + ".elt"); + } + + Value *V1Elem + = Builder.CreateExtractElement(TrueVal, + EI.getIndexOperand(), + TrueVal->getName() + ".elt"); + + Value *V2Elem + = Builder.CreateExtractElement(FalseVal, + EI.getIndexOperand(), + FalseVal->getName() + ".elt"); + return SelectInst::Create(Cond, + V1Elem, + V2Elem, + SI->getName() + ".elt"); + } } } return nullptr; |

