Fold bitconv(bitconv(x)) -> x. We now compile this:
authorChris Lattner <sabre@nondot.org>
Fri, 23 Dec 2005 05:37:50 +0000 (05:37 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 23 Dec 2005 05:37:50 +0000 (05:37 +0000)
void foo(double);
void bar(double X) { foo(X); }

to this:

bar:
        save -96, %o6, %o6
        or %g0, %i0, %o0
        or %g0, %i1, %o1
        call foo
        nop
        restore %g0, %g0, %g0
        retl
        nop

instead of this:

bar:
        save -112, %o6, %o6
        st %i1, [%i6+-4]
        st %i0, [%i6+-8]
        ldd [%i6+-8], %f0
        std %f0, [%i6+-16]
        ld [%i6+-12], %o1
        ld [%i6+-16], %o0
        call foo
        nop
        restore %g0, %g0, %g0
        retl
        nop

on V8.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@24981 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/DAGCombiner.cpp
lib/CodeGen/SelectionDAG/SelectionDAG.cpp

index ad26719dca89dfb2dd402e220f30ed991fbe92b2..e4f5125e798d2ed7f3fe3c86d790f14e94ad01c4 100644 (file)
@@ -1757,6 +1757,9 @@ SDOperand DAGCombiner::visitBIT_CONVERT(SDNode *N) {
     if (Res.Val != N) return Res;
   }
   
+  if (N0.getOpcode() == ISD::BIT_CONVERT)  // conv(conv(x,t1),t2) -> conv(x,t2)
+    return DAG.getNode(ISD::BIT_CONVERT, VT, N0.getOperand(0));
+  
   return SDOperand();
 }
 
index 76d983f57e878cb0f1226fe381456df113b3a33a..b510f1cd959ee7bcbc5123fad824d18e571b5743 100644 (file)
@@ -916,6 +916,8 @@ SDOperand SelectionDAG::getNode(unsigned Opcode, MVT::ValueType VT,
     assert(MVT::getSizeInBits(VT)==MVT::getSizeInBits(Operand.getValueType()) &&
            "Cannot BIT_CONVERT between two different types!");
     if (VT == Operand.getValueType()) return Operand;  // noop conversion.
+    if (OpOpcode == ISD::BIT_CONVERT)  // bitconv(bitconv(x)) -> bitconv(x)
+      return getNode(ISD::BIT_CONVERT, VT, Operand.getOperand(0));
     break;
   case ISD::FNEG:
     if (OpOpcode == ISD::FSUB)   // -(X-Y) -> (Y-X)