summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/ARM
diff options
context:
space:
mode:
authorMartin Storsjo <martin@martin.st>2018-03-19 20:06:50 +0000
committerMartin Storsjo <martin@martin.st>2018-03-19 20:06:50 +0000
commit9a55c1b0dce1b0f03742ceea8292dcdcdcd37509 (patch)
tree6ba91e0a7190274e86b3da0126c9951d00918d2f /llvm/lib/Target/ARM
parenteccd8ac7d825ed8f14f191a8de1d326dc7304beb (diff)
downloadbcm5719-llvm-9a55c1b0dce1b0f03742ceea8292dcdcdcd37509.tar.gz
bcm5719-llvm-9a55c1b0dce1b0f03742ceea8292dcdcdcd37509.zip
[ARM, AArch64] Check the no-stack-arg-probe attribute for dynamic stack probes
This extends the use of this attribute on ARM and AArch64 from SVN r325900 (where it was only checked for fixed stack allocations on ARM/AArch64, but for all stack allocations on X86). This also adds a testcase for the existing use of disabling the fixed stack probe with the attribute on ARM and AArch64. Differential Revision: https://reviews.llvm.org/D44291 llvm-svn: 327897
Diffstat (limited to 'llvm/lib/Target/ARM')
-rw-r--r--llvm/lib/Target/ARM/ARMISelLowering.cpp14
1 files changed, 14 insertions, 0 deletions
diff --git a/llvm/lib/Target/ARM/ARMISelLowering.cpp b/llvm/lib/Target/ARM/ARMISelLowering.cpp
index dc4185752ea..762da041244 100644
--- a/llvm/lib/Target/ARM/ARMISelLowering.cpp
+++ b/llvm/lib/Target/ARM/ARMISelLowering.cpp
@@ -13956,6 +13956,20 @@ ARMTargetLowering::LowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG) const
SDValue Chain = Op.getOperand(0);
SDValue Size = Op.getOperand(1);
+ if (DAG.getMachineFunction().getFunction().hasFnAttribute(
+ "no-stack-arg-probe")) {
+ unsigned Align = cast<ConstantSDNode>(Op.getOperand(2))->getZExtValue();
+ SDValue SP = DAG.getCopyFromReg(Chain, DL, ARM::SP, MVT::i32);
+ Chain = SP.getValue(1);
+ SP = DAG.getNode(ISD::SUB, DL, MVT::i32, SP, Size);
+ if (Align)
+ SP = DAG.getNode(ISD::AND, DL, MVT::i32, SP.getValue(0),
+ DAG.getConstant(-(uint64_t)Align, DL, MVT::i32));
+ Chain = DAG.getCopyToReg(Chain, DL, ARM::SP, SP);
+ SDValue Ops[2] = { SP, Chain };
+ return DAG.getMergeValues(Ops, DL);
+ }
+
SDValue Words = DAG.getNode(ISD::SRL, DL, MVT::i32, Size,
DAG.getConstant(2, DL, MVT::i32));
OpenPOWER on IntegriCloud