@@ -569,10 +569,7 @@ AArch64TargetLowering::AArch64TargetLowering(const TargetMachine &TM,
569
569
setOperationAction(ISD::FSHL, MVT::i32, Custom);
570
570
setOperationAction(ISD::FSHL, MVT::i64, Custom);
571
571
572
- if (Subtarget->isTargetWindows())
573
- setOperationAction(ISD::DYNAMIC_STACKALLOC, MVT::i64, Custom);
574
- else
575
- setOperationAction(ISD::DYNAMIC_STACKALLOC, MVT::i64, Expand);
572
+ setOperationAction(ISD::DYNAMIC_STACKALLOC, MVT::i64, Custom);
576
573
577
574
// Constant pool entries
578
575
setOperationAction(ISD::ConstantPool, MVT::i64, Custom);
@@ -2353,6 +2350,7 @@ const char *AArch64TargetLowering::getTargetNodeName(unsigned Opcode) const {
2353
2350
MAKE_CASE(AArch64ISD::CSINC)
2354
2351
MAKE_CASE(AArch64ISD::THREAD_POINTER)
2355
2352
MAKE_CASE(AArch64ISD::TLSDESC_CALLSEQ)
2353
+ MAKE_CASE(AArch64ISD::PROBED_ALLOCA)
2356
2354
MAKE_CASE(AArch64ISD::ABDS_PRED)
2357
2355
MAKE_CASE(AArch64ISD::ABDU_PRED)
2358
2356
MAKE_CASE(AArch64ISD::HADDS_PRED)
@@ -2719,6 +2717,22 @@ MachineBasicBlock *AArch64TargetLowering::EmitLoweredCatchRet(
2719
2717
return BB;
2720
2718
}
2721
2719
2720
+ MachineBasicBlock *
2721
+ AArch64TargetLowering::EmitDynamicProbedAlloc(MachineInstr &MI,
2722
+ MachineBasicBlock *MBB) const {
2723
+ MachineFunction &MF = *MBB->getParent();
2724
+ MachineBasicBlock::iterator MBBI = MI.getIterator();
2725
+ DebugLoc DL = MBB->findDebugLoc(MBBI);
2726
+ const AArch64InstrInfo &TII =
2727
+ *MF.getSubtarget<AArch64Subtarget>().getInstrInfo();
2728
+ Register TargetReg = MI.getOperand(0).getReg();
2729
+ MachineBasicBlock::iterator NextInst =
2730
+ TII.probedStackAlloc(MBBI, TargetReg, false);
2731
+
2732
+ MI.eraseFromParent();
2733
+ return NextInst->getParent();
2734
+ }
2735
+
2722
2736
MachineBasicBlock *
2723
2737
AArch64TargetLowering::EmitTileLoad(unsigned Opc, unsigned BaseReg,
2724
2738
MachineInstr &MI,
@@ -2863,6 +2877,10 @@ MachineBasicBlock *AArch64TargetLowering::EmitInstrWithCustomInserter(
2863
2877
2864
2878
case AArch64::CATCHRET:
2865
2879
return EmitLoweredCatchRet(MI, BB);
2880
+
2881
+ case AArch64::PROBED_STACKALLOC_DYN:
2882
+ return EmitDynamicProbedAlloc(MI, BB);
2883
+
2866
2884
case AArch64::LD1_MXIPXX_H_PSEUDO_B:
2867
2885
return EmitTileLoad(AArch64::LD1_MXIPXX_H_B, AArch64::ZAB0, MI, BB);
2868
2886
case AArch64::LD1_MXIPXX_H_PSEUDO_H:
@@ -14052,9 +14070,34 @@ SDValue AArch64TargetLowering::LowerATOMIC_LOAD_AND(SDValue Op,
14052
14070
AN->getMemOperand());
14053
14071
}
14054
14072
14055
- SDValue AArch64TargetLowering::LowerWindowsDYNAMIC_STACKALLOC(
14056
- SDValue Op, SDValue Chain, SDValue &Size, SelectionDAG &DAG) const {
14073
+ SDValue
14074
+ AArch64TargetLowering::LowerWindowsDYNAMIC_STACKALLOC(SDValue Op,
14075
+ SelectionDAG &DAG) const {
14076
+
14057
14077
SDLoc dl(Op);
14078
+ // Get the inputs.
14079
+ SDNode *Node = Op.getNode();
14080
+ SDValue Chain = Op.getOperand(0);
14081
+ SDValue Size = Op.getOperand(1);
14082
+ MaybeAlign Align =
14083
+ cast<ConstantSDNode>(Op.getOperand(2))->getMaybeAlignValue();
14084
+ EVT VT = Node->getValueType(0);
14085
+
14086
+ if (DAG.getMachineFunction().getFunction().hasFnAttribute(
14087
+ "no-stack-arg-probe")) {
14088
+ SDValue SP = DAG.getCopyFromReg(Chain, dl, AArch64::SP, MVT::i64);
14089
+ Chain = SP.getValue(1);
14090
+ SP = DAG.getNode(ISD::SUB, dl, MVT::i64, SP, Size);
14091
+ if (Align)
14092
+ SP = DAG.getNode(ISD::AND, dl, VT, SP.getValue(0),
14093
+ DAG.getConstant(-(uint64_t)Align->value(), dl, VT));
14094
+ Chain = DAG.getCopyToReg(Chain, dl, AArch64::SP, SP);
14095
+ SDValue Ops[2] = {SP, Chain};
14096
+ return DAG.getMergeValues(Ops, dl);
14097
+ }
14098
+
14099
+ Chain = DAG.getCALLSEQ_START(Chain, 0, 0, dl);
14100
+
14058
14101
EVT PtrVT = getPointerTy(DAG.getDataLayout());
14059
14102
SDValue Callee = DAG.getTargetExternalSymbol(Subtarget->getChkStkName(),
14060
14103
PtrVT, 0);
@@ -14078,7 +14121,59 @@ SDValue AArch64TargetLowering::LowerWindowsDYNAMIC_STACKALLOC(
14078
14121
14079
14122
Size = DAG.getNode(ISD::SHL, dl, MVT::i64, Size,
14080
14123
DAG.getConstant(4, dl, MVT::i64));
14081
- return Chain;
14124
+
14125
+ SDValue SP = DAG.getCopyFromReg(Chain, dl, AArch64::SP, MVT::i64);
14126
+ Chain = SP.getValue(1);
14127
+ SP = DAG.getNode(ISD::SUB, dl, MVT::i64, SP, Size);
14128
+ if (Align)
14129
+ SP = DAG.getNode(ISD::AND, dl, VT, SP.getValue(0),
14130
+ DAG.getConstant(-(uint64_t)Align->value(), dl, VT));
14131
+ Chain = DAG.getCopyToReg(Chain, dl, AArch64::SP, SP);
14132
+
14133
+ Chain = DAG.getCALLSEQ_END(Chain, 0, 0, SDValue(), dl);
14134
+
14135
+ SDValue Ops[2] = {SP, Chain};
14136
+ return DAG.getMergeValues(Ops, dl);
14137
+ }
14138
+
14139
+ SDValue
14140
+ AArch64TargetLowering::LowerInlineDYNAMIC_STACKALLOC(SDValue Op,
14141
+ SelectionDAG &DAG) const {
14142
+ // Get the inputs.
14143
+ SDNode *Node = Op.getNode();
14144
+ SDValue Chain = Op.getOperand(0);
14145
+ SDValue Size = Op.getOperand(1);
14146
+
14147
+ MaybeAlign Align =
14148
+ cast<ConstantSDNode>(Op.getOperand(2))->getMaybeAlignValue();
14149
+ SDLoc dl(Op);
14150
+ EVT VT = Node->getValueType(0);
14151
+
14152
+ // Construct the new SP value in a GPR.
14153
+ SDValue SP = DAG.getCopyFromReg(Chain, dl, AArch64::SP, MVT::i64);
14154
+ Chain = SP.getValue(1);
14155
+ SP = DAG.getNode(ISD::SUB, dl, MVT::i64, SP, Size);
14156
+ if (Align)
14157
+ SP = DAG.getNode(ISD::AND, dl, VT, SP.getValue(0),
14158
+ DAG.getConstant(-(uint64_t)Align->value(), dl, VT));
14159
+
14160
+ // Set the real SP to the new value with a probing loop.
14161
+ Chain = DAG.getNode(AArch64ISD::PROBED_ALLOCA, dl, MVT::Other, Chain, SP);
14162
+ SDValue Ops[2] = {SP, Chain};
14163
+ return DAG.getMergeValues(Ops, dl);
14164
+ }
14165
+
14166
+ SDValue
14167
+ AArch64TargetLowering::LowerDYNAMIC_STACKALLOC(SDValue Op,
14168
+ SelectionDAG &DAG) const {
14169
+ MachineFunction &MF = DAG.getMachineFunction();
14170
+
14171
+ if (Subtarget->isTargetWindows())
14172
+ return LowerWindowsDYNAMIC_STACKALLOC(Op, DAG);
14173
+ else if (hasInlineStackProbe(MF))
14174
+ return LowerInlineDYNAMIC_STACKALLOC(Op, DAG);
14175
+ else
14176
+ return SDValue();
14082
14177
}
14083
14178
14084
14179
// When x and y are extended, lower:
@@ -14132,51 +14227,6 @@ SDValue AArch64TargetLowering::LowerAVG(SDValue Op, SelectionDAG &DAG,
14132
14227
return DAG.getNode(ISD::ADD, dl, VT, Add, tmp);
14133
14228
}
14134
14229
14135
- SDValue
14136
- AArch64TargetLowering::LowerDYNAMIC_STACKALLOC(SDValue Op,
14137
- SelectionDAG &DAG) const {
14138
- assert(Subtarget->isTargetWindows() &&
14139
- "Only Windows alloca probing supported");
14140
- SDLoc dl(Op);
14141
- // Get the inputs.
14142
- SDNode *Node = Op.getNode();
14143
- SDValue Chain = Op.getOperand(0);
14144
- SDValue Size = Op.getOperand(1);
14145
- MaybeAlign Align =
14146
- cast<ConstantSDNode>(Op.getOperand(2))->getMaybeAlignValue();
14147
- EVT VT = Node->getValueType(0);
14148
-
14149
- if (DAG.getMachineFunction().getFunction().hasFnAttribute(
14150
- "no-stack-arg-probe")) {
14151
- SDValue SP = DAG.getCopyFromReg(Chain, dl, AArch64::SP, MVT::i64);
14152
- Chain = SP.getValue(1);
14153
- SP = DAG.getNode(ISD::SUB, dl, MVT::i64, SP, Size);
14154
- if (Align)
14155
- SP = DAG.getNode(ISD::AND, dl, VT, SP.getValue(0),
14156
- DAG.getConstant(-(uint64_t)Align->value(), dl, VT));
14157
- Chain = DAG.getCopyToReg(Chain, dl, AArch64::SP, SP);
14158
- SDValue Ops[2] = {SP, Chain};
14159
- return DAG.getMergeValues(Ops, dl);
14160
- }
14161
-
14162
- Chain = DAG.getCALLSEQ_START(Chain, 0, 0, dl);
14163
-
14164
- Chain = LowerWindowsDYNAMIC_STACKALLOC(Op, Chain, Size, DAG);
14165
-
14166
- SDValue SP = DAG.getCopyFromReg(Chain, dl, AArch64::SP, MVT::i64);
14167
- Chain = SP.getValue(1);
14168
- SP = DAG.getNode(ISD::SUB, dl, MVT::i64, SP, Size);
14169
- if (Align)
14170
- SP = DAG.getNode(ISD::AND, dl, VT, SP.getValue(0),
14171
- DAG.getConstant(-(uint64_t)Align->value(), dl, VT));
14172
- Chain = DAG.getCopyToReg(Chain, dl, AArch64::SP, SP);
14173
-
14174
- Chain = DAG.getCALLSEQ_END(Chain, 0, 0, SDValue(), dl);
14175
-
14176
- SDValue Ops[2] = {SP, Chain};
14177
- return DAG.getMergeValues(Ops, dl);
14178
- }
14179
-
14180
14230
SDValue AArch64TargetLowering::LowerVSCALE(SDValue Op,
14181
14231
SelectionDAG &DAG) const {
14182
14232
EVT VT = Op.getValueType();
0 commit comments