summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp
diff options
context:
space:
mode:
authorSanjay Patel <spatel@rotateright.com>2018-10-20 17:15:57 +0000
committerSanjay Patel <spatel@rotateright.com>2018-10-20 17:15:57 +0000
commit0522b0da3124cd54faebb65d501ab9311d621971 (patch)
treefa8ad216d556eecc21dba5639e11b7a31a619fb1 /llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp
parentec572ade202efb559e19a837c2b52d682e1889e6 (diff)
downloadbcm5719-llvm-0522b0da3124cd54faebb65d501ab9311d621971.tar.gz
bcm5719-llvm-0522b0da3124cd54faebb65d501ab9311d621971.zip
[InstCombine] use 'match' to simplify code; NFC
llvm-svn: 344855
Diffstat (limited to 'llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp')
-rw-r--r--llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp115
1 files changed, 56 insertions, 59 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp b/llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp
index 0c8d64bff43..75f77779ab7 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp
@@ -876,65 +876,62 @@ Instruction *InstCombiner::visitInsertElementInst(InsertElementInst &IE) {
if (isa<UndefValue>(ScalarOp) || isa<UndefValue>(IdxOp))
replaceInstUsesWith(IE, VecOp);
- // If the inserted element was extracted from some other vector, and if the
- // indexes are constant, try to turn this into a shufflevector operation.
- if (ExtractElementInst *EI = dyn_cast<ExtractElementInst>(ScalarOp)) {
- if (isa<ConstantInt>(EI->getOperand(1)) && isa<ConstantInt>(IdxOp)) {
- unsigned NumInsertVectorElts = IE.getType()->getNumElements();
- unsigned NumExtractVectorElts =
- EI->getOperand(0)->getType()->getVectorNumElements();
- unsigned ExtractedIdx =
- cast<ConstantInt>(EI->getOperand(1))->getZExtValue();
- unsigned InsertedIdx = cast<ConstantInt>(IdxOp)->getZExtValue();
-
- if (ExtractedIdx >= NumExtractVectorElts) // Out of range extract.
- return replaceInstUsesWith(IE, VecOp);
-
- if (InsertedIdx >= NumInsertVectorElts) // Out of range insert.
- return replaceInstUsesWith(IE, UndefValue::get(IE.getType()));
-
- // If we are extracting a value from a vector, then inserting it right
- // back into the same place, just use the input vector.
- if (EI->getOperand(0) == VecOp && ExtractedIdx == InsertedIdx)
- return replaceInstUsesWith(IE, VecOp);
-
- // TODO: Looking at the user(s) to determine if this insert is a
- // fold-to-shuffle opportunity does not match the usual instcombine
- // constraints. We should decide if the transform is worthy based only
- // on this instruction and its operands, but that may not work currently.
- //
- // Here, we are trying to avoid creating shuffles before reaching
- // the end of a chain of extract-insert pairs. This is complicated because
- // we do not generally form arbitrary shuffle masks in instcombine
- // (because those may codegen poorly), but collectShuffleElements() does
- // exactly that.
- //
- // The rules for determining what is an acceptable target-independent
- // shuffle mask are fuzzy because they evolve based on the backend's
- // capabilities and real-world impact.
- auto isShuffleRootCandidate = [](InsertElementInst &Insert) {
- if (!Insert.hasOneUse())
- return true;
- auto *InsertUser = dyn_cast<InsertElementInst>(Insert.user_back());
- if (!InsertUser)
- return true;
- return false;
- };
-
- // Try to form a shuffle from a chain of extract-insert ops.
- if (isShuffleRootCandidate(IE)) {
- SmallVector<Constant*, 16> Mask;
- ShuffleOps LR = collectShuffleElements(&IE, Mask, nullptr, *this);
-
- // The proposed shuffle may be trivial, in which case we shouldn't
- // perform the combine.
- if (LR.first != &IE && LR.second != &IE) {
- // We now have a shuffle of LHS, RHS, Mask.
- if (LR.second == nullptr)
- LR.second = UndefValue::get(LR.first->getType());
- return new ShuffleVectorInst(LR.first, LR.second,
- ConstantVector::get(Mask));
- }
+ // If the inserted element was extracted from some other vector and both
+ // indexes are constant, try to turn this into a shuffle.
+ uint64_t InsertedIdx, ExtractedIdx;
+ Value *ExtVecOp;
+ if (match(IdxOp, m_ConstantInt(InsertedIdx)) &&
+ match(ScalarOp, m_ExtractElement(m_Value(ExtVecOp),
+ m_ConstantInt(ExtractedIdx)))) {
+ unsigned NumInsertVectorElts = IE.getType()->getNumElements();
+ unsigned NumExtractVectorElts = ExtVecOp->getType()->getVectorNumElements();
+ if (ExtractedIdx >= NumExtractVectorElts) // Out of range extract.
+ return replaceInstUsesWith(IE, VecOp);
+
+ if (InsertedIdx >= NumInsertVectorElts) // Out of range insert.
+ return replaceInstUsesWith(IE, UndefValue::get(IE.getType()));
+
+ // If we are extracting a value from a vector, then inserting it right
+ // back into the same place, just use the input vector.
+ if (ExtVecOp == VecOp && ExtractedIdx == InsertedIdx)
+ return replaceInstUsesWith(IE, VecOp);
+
+ // TODO: Looking at the user(s) to determine if this insert is a
+ // fold-to-shuffle opportunity does not match the usual instcombine
+ // constraints. We should decide if the transform is worthy based only
+ // on this instruction and its operands, but that may not work currently.
+ //
+ // Here, we are trying to avoid creating shuffles before reaching
+ // the end of a chain of extract-insert pairs. This is complicated because
+ // we do not generally form arbitrary shuffle masks in instcombine
+ // (because those may codegen poorly), but collectShuffleElements() does
+ // exactly that.
+ //
+ // The rules for determining what is an acceptable target-independent
+ // shuffle mask are fuzzy because they evolve based on the backend's
+ // capabilities and real-world impact.
+ auto isShuffleRootCandidate = [](InsertElementInst &Insert) {
+ if (!Insert.hasOneUse())
+ return true;
+ auto *InsertUser = dyn_cast<InsertElementInst>(Insert.user_back());
+ if (!InsertUser)
+ return true;
+ return false;
+ };
+
+ // Try to form a shuffle from a chain of extract-insert ops.
+ if (isShuffleRootCandidate(IE)) {
+ SmallVector<Constant*, 16> Mask;
+ ShuffleOps LR = collectShuffleElements(&IE, Mask, nullptr, *this);
+
+ // The proposed shuffle may be trivial, in which case we shouldn't
+ // perform the combine.
+ if (LR.first != &IE && LR.second != &IE) {
+ // We now have a shuffle of LHS, RHS, Mask.
+ if (LR.second == nullptr)
+ LR.second = UndefValue::get(LR.first->getType());
+ return new ShuffleVectorInst(LR.first, LR.second,
+ ConstantVector::get(Mask));
}
}
}
OpenPOWER on IntegriCloud