[llvm] r303800 - [AArch64] Prevent nested ADDs from address calc in splitStoreSplat. NFC
Friedman, Eli via llvm-commits
llvm-commits at lists.llvm.org
Wed May 24 13:08:17 PDT 2017
On 5/24/2017 12:55 PM, Nirav Dave via llvm-commits wrote:
> Author: niravd
> Date: Wed May 24 14:55:49 2017
> New Revision: 303800
>
> URL: http://llvm.org/viewvc/llvm-project?rev=303800&view=rev
> Log:
> [AArch64] Prevent nested ADDs from address calc in splitStoreSplat. NFC
>
> In preparation for late-stage store merging.
>
> Modified:
> llvm/trunk/lib/Target/AArch64/AArch64ISelLowering.cpp
>
> Modified: llvm/trunk/lib/Target/AArch64/AArch64ISelLowering.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/AArch64ISelLowering.cpp?rev=303800&r1=303799&r2=303800&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/AArch64/AArch64ISelLowering.cpp (original)
> +++ llvm/trunk/lib/Target/AArch64/AArch64ISelLowering.cpp Wed May 24 14:55:49 2017
> @@ -9222,16 +9222,26 @@ static SDValue splitStoreSplat(Selection
> // instructions (stp).
> SDLoc DL(&St);
> SDValue BasePtr = St.getBasePtr();
> + int64_t BaseOffset = 0;
> +
> const MachinePointerInfo &PtrInfo = St.getPointerInfo();
> SDValue NewST1 =
> DAG.getStore(St.getChain(), DL, SplatVal, BasePtr, PtrInfo,
> OrigAlignment, St.getMemOperand()->getFlags());
>
> + // As this in ISel, we will not merge this add which may degrate results.
> + if (BasePtr->getOpcode() == ISD::ADD &&
> + isa<ConstantSDNode>(BasePtr->getOperand(1))) {
> + BaseOffset = cast<ConstantSDNode>(BasePtr->getOperand(1))->getSExtValue();
> + BasePtr = BasePtr->getOperand(0);
> + }
> +
> unsigned Offset = EltOffset;
> while (--NumVecElts) {
> unsigned Alignment = MinAlign(OrigAlignment, Offset);
> - SDValue OffsetPtr = DAG.getNode(ISD::ADD, DL, MVT::i64, BasePtr,
> - DAG.getConstant(Offset, DL, MVT::i64));
> + SDValue OffsetPtr = DAG.getNode(
> + ISD::ADD, DL, MVT::i64, BasePtr,
> + DAG.getConstant(BaseOffset + ((int64_t)Offset), DL, MVT::i64));
uint64_t? (Not likely to matter in practice, but "BaseOffset + Offset"
could in theory wrap.)
-Eli
--
Employee of Qualcomm Innovation Center, Inc.
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project
More information about the llvm-commits
mailing list