summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen/SelectionDAG
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/CodeGen/SelectionDAG')
-rw-r--r--llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp11
1 files changed, 9 insertions, 2 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
index e22fe19f9f8..285f7eba099 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
@@ -3871,7 +3871,7 @@ static bool getUniformBase(const Value* &Ptr, SDValue& Base, SDValue& Index,
assert(Ptr->getType()->isVectorTy() && "Uexpected pointer type");
const GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(Ptr);
- if (!GEP || GEP->getNumOperands() > 2)
+ if (!GEP)
return false;
const Value *GEPPtr = GEP->getPointerOperand();
@@ -3880,7 +3880,14 @@ static bool getUniformBase(const Value* &Ptr, SDValue& Base, SDValue& Index,
else if (!(Ptr = getSplatValue(GEPPtr)))
return false;
- Value *IndexVal = GEP->getOperand(1);
+ unsigned FinalIndex = GEP->getNumOperands() - 1;
+ Value *IndexVal = GEP->getOperand(FinalIndex);
+
+ // Ensure all the other indices are 0.
+ for (unsigned i = 1; i < FinalIndex; ++i)
+ if (auto *C = dyn_cast<ConstantInt>(GEP->getOperand(i)))
+ if (!C->isZero())
+ return false;
// The operands of the GEP may be defined in another basic block.
// In this case we'll not find nodes for the operands.
OpenPOWER on IntegriCloud