From a03d366c8887755080cf21e11c43d76d22610fdf Mon Sep 17 00:00:00 2001 From: Evan Cheng Date: Tue, 13 Mar 2012 22:16:11 +0000 Subject: [PATCH] Fortify r152675 a bit. Although I'm not able to come up with a test case that would trigger the truncation case. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@152678 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index 66c04b42a92..e3c14b08730 100644 --- a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -7204,7 +7204,7 @@ SDValue DAGCombiner::visitEXTRACT_VECTOR_ELT(SDNode *N) { // If the result of load has to be truncated, then it's not necessarily // profitable. - if (NVT.bitsLT(LVT)) + if (NVT.bitsLT(LVT) && !TLI.isTruncateFree(LVT, NVT)) return SDValue(); if (InVec.getOpcode() == ISD::BITCAST) { @@ -7308,6 +7308,7 @@ SDValue DAGCombiner::visitEXTRACT_VECTOR_ELT(SDNode *N) { // use of the load; that's okay because we don't want to perform this // transformation in other cases anyway. SDValue Load; + SDValue Chain; if (NVT.bitsGT(LVT)) { // If the result type of vextract is wider than the load, then issue an // extending load instead. @@ -7316,14 +7317,21 @@ SDValue DAGCombiner::visitEXTRACT_VECTOR_ELT(SDNode *N) { Load = DAG.getExtLoad(ExtType, N->getDebugLoc(), NVT, LN0->getChain(), NewPtr, LN0->getPointerInfo().getWithOffset(PtrOff), LVT, LN0->isVolatile(), LN0->isNonTemporal(),Align); - } else + Chain = Load.getValue(1); + } else { Load = DAG.getLoad(LVT, N->getDebugLoc(), LN0->getChain(), NewPtr, LN0->getPointerInfo().getWithOffset(PtrOff), LN0->isVolatile(), LN0->isNonTemporal(), LN0->isInvariant(), Align); + Chain = Load.getValue(1); + if (NVT.bitsLT(LVT)) + Load = DAG.getNode(ISD::TRUNCATE, N->getDebugLoc(), NVT, Load); + else + Load = DAG.getNode(ISD::BITCAST, N->getDebugLoc(), NVT, Load); + } WorkListRemover DeadNodes(*this); SDValue From[] = { SDValue(N, 0), SDValue(LN0,1) }; - SDValue To[] = { Load.getValue(0), Load.getValue(1) }; + SDValue To[] = { Load, Chain }; DAG.ReplaceAllUsesOfValuesWith(From, To, 2, &DeadNodes); // Since we're explcitly calling ReplaceAllUses, add the new node to the // worklist explicitly as well. -- 2.11.0