From 888f4e6fb0ce6b9dea24e20a2ca3b8a3efed2cf2 Mon Sep 17 00:00:00 2001 From: Mon P Wang Date: Thu, 6 Nov 2008 22:52:21 +0000 Subject: [PATCH] Fixed scalarizing an extract subvector and prevent an infinite loop when simplify a vector. llvm-svn: 58820 --- lib/CodeGen/SelectionDAG/LegalizeDAG.cpp | 6 +++--- lib/Transforms/Scalar/InstructionCombining.cpp | 6 ++++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp index f9d1ddc6157..c17ef9cedcb 100644 --- a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -7516,8 +7516,8 @@ SDValue SelectionDAGLegalize::ScalarizeVectorOp(SDValue Op) { break; } case ISD::EXTRACT_SUBVECTOR: - Result = Node->getOperand(0); - assert(Result.getValueType() == NewVT); + Result = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, NewVT, Node->getOperand(0), + Node->getOperand(1)); break; case ISD::BIT_CONVERT: { SDValue Op0 = Op.getOperand(0); @@ -8174,7 +8174,7 @@ void SelectionDAGLegalize::genWidenVectorStores(SDValueVector& StChain, SDValue VecOp = DAG.getNode(ISD::BIT_CONVERT, VecEVT, ValOp); SDValue EOp = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, EVT, VecOp, - DAG.getIntPtrConstant(0)); + DAG.getIntPtrConstant(0)); SDValue StOp = DAG.getStore(Chain, EOp, BasePtr, SV, SVOffset, isVolatile, Alignment); StChain.push_back(StOp); diff --git a/lib/Transforms/Scalar/InstructionCombining.cpp b/lib/Transforms/Scalar/InstructionCombining.cpp index 3210b12cbb9..743d8bb15f7 100644 --- a/lib/Transforms/Scalar/InstructionCombining.cpp +++ b/lib/Transforms/Scalar/InstructionCombining.cpp @@ -1410,6 +1410,12 @@ Value *InstCombiner::SimplifyDemandedVectorElts(Value *V, uint64_t DemandedElts, } else if (isa(V)) { // Simplify the CAZ to a ConstantVector where the non-demanded elements are // set to undef. + + // Check if this is identity. If so, return 0 since we are not simplifying + // anything. + if (DemandedElts == ((1ULL << VWidth) -1)) + return 0; + const Type *EltTy = cast(V->getType())->getElementType(); Constant *Zero = Constant::getNullValue(EltTy); Constant *Undef = UndefValue::get(EltTy);