diff options
| author | Nirav Dave <niravd@google.com> | 2017-05-24 19:55:49 +0000 |
|---|---|---|
| committer | Nirav Dave <niravd@google.com> | 2017-05-24 19:55:49 +0000 |
| commit | bb20b5d5c31b7f6326c7b0db5e6b3357150be83f (patch) | |
| tree | 66a310f24c815d53fd57ea642e14f3cb81e98295 | |
| parent | 25411b768457435c0841735f98ba8418dd0006d9 (diff) | |
| download | bcm5719-llvm-bb20b5d5c31b7f6326c7b0db5e6b3357150be83f.tar.gz bcm5719-llvm-bb20b5d5c31b7f6326c7b0db5e6b3357150be83f.zip | |
[AArch64] Prevent nested ADDs from address calc in splitStoreSplat. NFC
In preparation for late-stage store merging.
llvm-svn: 303800
| -rw-r--r-- | llvm/lib/Target/AArch64/AArch64ISelLowering.cpp | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp index 5b8c645f824..8fbdfccfc57 100644 --- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp +++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp @@ -9222,16 +9222,26 @@ static SDValue splitStoreSplat(SelectionDAG &DAG, StoreSDNode &St, // 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)); NewST1 = DAG.getStore(NewST1.getValue(0), DL, SplatVal, OffsetPtr, PtrInfo.getWithOffset(Offset), Alignment, St.getMemOperand()->getFlags()); |

