[PATCH] Implement more expansions of extloads

Ahmed Bougacha ahmed.bougacha at gmail.com
Tue Jan 13 16:03:08 PST 2015


> From: Matt Arsenault <Matthew.Arsenault at amd.com>
> Date: Wed, 7 Jan 2015 22:42:21 -0500
> Subject: [PATCH 1/3] Implement new way of expanding extloads.

This mostly LGTM, with one concern; comments inline.  I'll leave the
other patches and R600 parts to others.

-Ahmed

> Now that the source and destination types can be specified,
> allow doing an expansion that doesn't use an EXTLOAD of the
> result type. Try to do a legal extload to an intermediate type
> and extend that if possible.
>
> This generalizes the special case custom lowering of extloads
> R600 has been using to work around this problem.
>
> This also happens to fix a bug that would incorrectly use more
> aligned loads than should be used.
> ---

> diff --git a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
> index ce8f96b..d86c20c 100644
> --- a/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
> +++ b/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
> @@ -1090,22 +1090,35 @@ void SelectionDAGLegalize::LegalizeLoadOps(SDNode *Node) {
>        break;
>      }
>      case TargetLowering::Expand:
> -      if (!TLI.isLoadExtLegal(ISD::EXTLOAD, Node->getValueType(0),
> -                              SrcVT) && TLI.isTypeLegal(SrcVT)) {
> -        SDValue Load = DAG.getLoad(SrcVT, dl, Chain, Ptr, LD->getMemOperand());
> -        unsigned ExtendOp;
> -        switch (ExtType) {
> -        case ISD::EXTLOAD:
> -          ExtendOp = (SrcVT.isFloatingPoint() ?
> -                      ISD::FP_EXTEND : ISD::ANY_EXTEND);
> +      if (!TLI.isLoadExtLegal(ISD::EXTLOAD, Node->getValueType(0), SrcVT)) {
> +        // Figure out the type to load to before extending.
> +        EVT LoadVT = SrcVT;
> +
> +        if (TLI.isLoadExtLegal(ISD::EXTLOAD, Node->getValueType(0),
> +                               SrcVT) && TLI.isTypeLegal(SrcVT)) {

This contradicts the outer if, no? Should it be just "TLI.isTypeLegal(SrcVT)" ?
If so, since this doesn't break, I'm guessing it's no longer tested?
(not that I know where one would do that.)

> +          SDValue Load = DAG.getLoad(SrcVT, dl, Chain, Ptr, LD->getMemOperand());

Nit: 80 cols (same later)

> +          unsigned ExtendOp
> +            = ISD::getExtForLoadExtType(SrcVT.isFloatingPoint(), ExtType);

Nit: clang-format? The "=" would go in the first line (same later).

> +          Value = DAG.getNode(ExtendOp, dl, Node->getValueType(0), Load);
> +          Chain = Load.getValue(1);
> +          break;
> +        }
> +
> +        // If the source type is not legal, see if there is a legal extload to
> +        // an intermediate type that we can then extend further.
> +        LoadVT = TLI.getRegisterType(SrcVT.getSimpleVT());
> +        if (LoadVT == SrcVT || TLI.isLoadExtLegal(ExtType, LoadVT, SrcVT)) {
> +          ISD::LoadExtType MidExtTy

Nit: how about matching ExtType, and naming this MidExtType

> +            = (LoadVT == SrcVT) ? ISD::NON_EXTLOAD : ExtType;
> +
> +          SDValue Load = DAG.getExtLoad(MidExtTy, dl, LoadVT, Chain,
> +                                        Ptr, SrcVT, LD->getMemOperand());
> +          unsigned ExtendOp
> +            = ISD::getExtForLoadExtType(SrcVT.isFloatingPoint(), ExtType);
> +          Value = DAG.getNode(ExtendOp, dl, Node->getValueType(0), Load);
> +          Chain = Load.getValue(1);

Nit: both blocks are pretty much the same, with a different MidExtTy.
I'm not sure it would be more readable, but maybe there's a way to
avoid the duplication?

>            break;
> -        case ISD::SEXTLOAD: ExtendOp = ISD::SIGN_EXTEND; break;
> -        case ISD::ZEXTLOAD: ExtendOp = ISD::ZERO_EXTEND; break;
> -        default: llvm_unreachable("Unexpected extend load type!");
>          }
> -        Value = DAG.getNode(ExtendOp, dl, Node->getValueType(0), Load);
> -        Chain = Load.getValue(1);
> -        break;
>        }
>
>        assert(!SrcVT.isVector() &&



More information about the llvm-commits mailing list