Fortify r152675 a bit. Although I'm not able to come up with a test case that would...
authorEvan Cheng <evan.cheng@apple.com>
Tue, 13 Mar 2012 22:16:11 +0000 (22:16 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Tue, 13 Mar 2012 22:16:11 +0000 (22:16 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@152678 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/DAGCombiner.cpp

index 66c04b42a92aec2cd4f4e260df556167d54ea2e2..e3c14b08730a6d048f529f9f8f644ac2852e7743 100644 (file)
@@ -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.