[llvm-commits] [llvm] r111586 - /llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp

Nick Lewycky nicholas at mxc.ca
Thu Aug 19 22:38:58 PDT 2010


Bob Wilson wrote:
> Author: bwilson
> Date: Thu Aug 19 18:52:39 2010
> New Revision: 111586
>
> URL: http://llvm.org/viewvc/llvm-project?rev=111586&view=rev
> Log:
> If the target says that an extending load is not legal, regardless of whether
> it involves specific floating-point types, legalize should expand an
> extending load to a non-extending load followed by a separate extend operation.
> For example, we currently expand SEXTLOAD to EXTLOAD+SIGN_EXTEND_INREG (and
> assert that EXTLOAD should always be supported).  Now we can expand that to
> LOAD+SIGN_EXTEND.  This is needed to allow vector SIGN_EXTEND and ZERO_EXTEND
> to be used for NEON.

Woot! Thanks!!

Nick

> Modified:
>      llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
>
> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp?rev=111586&r1=111585&r2=111586&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp (original)
> +++ llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Thu Aug 19 18:52:39 2010
> @@ -1314,17 +1314,22 @@
>             }
>             break;
>           case TargetLowering::Expand:
> -          // f64 = EXTLOAD f32 should expand to LOAD, FP_EXTEND
> -          // f128 = EXTLOAD {f32,f64} too
> -          if ((SrcVT == MVT::f32&&  (Node->getValueType(0) == MVT::f64 ||
> -                                     Node->getValueType(0) == MVT::f128)) ||
> -              (SrcVT == MVT::f64&&  Node->getValueType(0) == MVT::f128)) {
> +          if (!TLI.isLoadExtLegal(ISD::EXTLOAD, SrcVT)) {
>               SDValue Load = DAG.getLoad(SrcVT, dl, Tmp1, Tmp2, LD->getSrcValue(),
>                                          LD->getSrcValueOffset(),
>                                          LD->isVolatile(), LD->isNonTemporal(),
>                                          LD->getAlignment());
> -            Result = DAG.getNode(ISD::FP_EXTEND, dl,
> -                                 Node->getValueType(0), Load);
> +            unsigned ExtendOp;
> +            switch (ExtType) {
> +            case ISD::EXTLOAD:
> +              ExtendOp = (SrcVT.isFloatingPoint() ?
> +                          ISD::FP_EXTEND : ISD::ANY_EXTEND);
> +              break;
> +            case ISD::SEXTLOAD: ExtendOp = ISD::SIGN_EXTEND; break;
> +            case ISD::ZEXTLOAD: ExtendOp = ISD::ZERO_EXTEND; break;
> +            default: assert(0&&  "Unexpected extend load type!");
> +            }
> +            Result = DAG.getNode(ExtendOp, dl, Node->getValueType(0), Load);
>               Tmp1 = LegalizeOp(Result);  // Relegalize new nodes.
>               Tmp2 = LegalizeOp(Load.getValue(1));
>               break;
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>




More information about the llvm-commits mailing list