From: Renato Golin Date: Sun, 30 Aug 2015 10:05:30 +0000 (+0000) Subject: Revert "New interface function is added to VectorUtils Value *getSplatValue(Value... X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=10010330775d1a440b817f957121fc25b598d1a4;p=oota-llvm.git Revert "New interface function is added to VectorUtils Value *getSplatValue(Value *Val);" This reverts commit r246371, as it cause a rather obscure bug in AArch64 test-suite paq8p (time outs, seg-faults). I'll investigate it before reapplying. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@246379 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/Analysis/VectorUtils.h b/include/llvm/Analysis/VectorUtils.h index cd9102e571c..d8e9ca42e62 100644 --- a/include/llvm/Analysis/VectorUtils.h +++ b/include/llvm/Analysis/VectorUtils.h @@ -79,11 +79,6 @@ Value *getStrideFromPointer(Value *Ptr, ScalarEvolution *SE, Loop *Lp); /// from the vector. Value *findScalarElement(Value *V, unsigned EltNo); -/// \brief Get splat value if the input is a splat vector or return nullptr. -/// The value may be extracted from a splat constants vector or from -/// a sequence of instructions that broadcast a single value into a vector. -Value *getSplatValue(Value *V); - } // llvm namespace #endif diff --git a/lib/Analysis/VectorUtils.cpp b/lib/Analysis/VectorUtils.cpp index 92a880c3762..72140952ecb 100644 --- a/lib/Analysis/VectorUtils.cpp +++ b/lib/Analysis/VectorUtils.cpp @@ -18,8 +18,6 @@ #include "llvm/IR/GetElementPtrTypeIterator.h" #include "llvm/IR/PatternMatch.h" #include "llvm/IR/Value.h" -#include "llvm/IR/Constants.h" - using namespace llvm; using namespace llvm::PatternMatch; @@ -408,27 +406,3 @@ Value *llvm::findScalarElement(Value *V, unsigned EltNo) { // Otherwise, we don't know. return nullptr; } - -/// \brief Get splat value if the input is a splat vector or return nullptr. -/// The value may be extracted from a splat constants vector or from -/// a sequence of instructions that broadcast a single value into a vector. -llvm::Value *llvm::getSplatValue(Value *V) { - llvm::ConstantDataVector *CV = dyn_cast(V); - if (CV) - return CV->getSplatValue(); - llvm::ShuffleVectorInst *ShuffleInst = dyn_cast(V); - if (!ShuffleInst) - return nullptr; - // All-zero (our undef) shuffle mask elements. - for (int i : ShuffleInst->getShuffleMask()) - if (i != 0 && i != -1) - return nullptr; - // The first shuffle source is 'insertelement' with index 0. - llvm::InsertElementInst *InsertEltInst = - dyn_cast(ShuffleInst->getOperand(0)); - if (!InsertEltInst || !isa(InsertEltInst->getOperand(2)) || - !cast(InsertEltInst->getOperand(2))->isNullValue()) - return nullptr; - - return InsertEltInst->getOperand(1); -} diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp index c958f7df019..63328200f8d 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp @@ -22,7 +22,6 @@ #include "llvm/Analysis/ConstantFolding.h" #include "llvm/Analysis/TargetLibraryInfo.h" #include "llvm/Analysis/ValueTracking.h" -#include "llvm/Analysis/VectorUtils.h" #include "llvm/CodeGen/FastISel.h" #include "llvm/CodeGen/FunctionLoweringInfo.h" #include "llvm/CodeGen/GCMetadata.h" @@ -3151,32 +3150,37 @@ static bool getUniformBase(Value *& Ptr, SDValue& Base, SDValue& Index, SelectionDAGBuilder* SDB) { assert(Ptr->getType()->isVectorTy() && "Unexpected pointer type"); - GetElementPtrInst *GEP = dyn_cast(Ptr); - if (!GEP || GEP->getNumOperands() > 2) + GetElementPtrInst *Gep = dyn_cast(Ptr); + if (!Gep || Gep->getNumOperands() > 2) return false; - Value *GEPPtrs = GEP->getPointerOperand(); - if (!(Ptr = getSplatValue(GEPPtrs))) + ShuffleVectorInst *ShuffleInst = + dyn_cast(Gep->getPointerOperand()); + if (!ShuffleInst || !ShuffleInst->getMask()->isNullValue() || + cast(ShuffleInst->getOperand(0))->getOpcode() != + Instruction::InsertElement) return false; + Ptr = cast(ShuffleInst->getOperand(0))->getOperand(1); + SelectionDAG& DAG = SDB->DAG; const TargetLowering &TLI = DAG.getTargetLoweringInfo(); // Check is the Ptr is inside current basic block // If not, look for the shuffle instruction if (SDB->findValue(Ptr)) Base = SDB->getValue(Ptr); - else if (SDB->findValue(GEPPtrs)) { - SDValue GEPPtrsVal = SDB->getValue(GEPPtrs); - SDLoc sdl = GEPPtrsVal; - EVT IdxVT = TLI.getVectorIdxTy(DAG.getDataLayout()); - Base = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, sdl, - GEPPtrsVal.getValueType().getScalarType(), GEPPtrsVal, - DAG.getConstant(0, sdl, IdxVT)); + else if (SDB->findValue(ShuffleInst)) { + SDValue ShuffleNode = SDB->getValue(ShuffleInst); + SDLoc sdl = ShuffleNode; + Base = DAG.getNode( + ISD::EXTRACT_VECTOR_ELT, sdl, + ShuffleNode.getValueType().getScalarType(), ShuffleNode, + DAG.getConstant(0, sdl, TLI.getVectorIdxTy(DAG.getDataLayout()))); SDB->setValue(Ptr, Base); } else return false; - Value *IndexVal = GEP->getOperand(1); + Value *IndexVal = Gep->getOperand(1); if (SDB->findValue(IndexVal)) { Index = SDB->getValue(IndexVal);