@@ -4038,41 +4038,35 @@ SDValue SITargetLowering::lowerDYNAMIC_STACKALLOCImpl(SDValue Op,
4038
4038
Chain = DAG.getCALLSEQ_START(Chain, 0, 0, dl);
4039
4039
4040
4040
SDValue Size = Tmp2.getOperand(1);
4041
- SDValue SPOld = DAG.getCopyFromReg(Chain, dl, SPReg, VT);
4042
- Chain = SPOld.getValue(1 );
4043
- MaybeAlign Alignment = cast<ConstantSDNode>(Tmp3)->getMaybeAlignValue();
4041
+ SDValue BaseAddr = DAG.getCopyFromReg(Chain, dl, SPReg, VT);
4042
+ Align Alignment = cast<ConstantSDNode>(Tmp3)->getAlignValue( );
4043
+
4044
4044
const TargetFrameLowering *TFL = Subtarget->getFrameLowering();
4045
4045
assert(TFL->getStackGrowthDirection() == TargetFrameLowering::StackGrowsUp &&
4046
4046
"Stack grows upwards for AMDGPU");
4047
+
4048
+ Chain = BaseAddr.getValue(1);
4047
4049
Align StackAlign = TFL->getStackAlign();
4048
- if (Alignment && *Alignment > StackAlign) {
4049
- SDValue ScaledAlignment = DAG.getSignedConstant(
4050
- (uint64_t)Alignment->value() << Subtarget->getWavefrontSizeLog2(), dl,
4051
- VT) ;
4052
- SDValue StackAlignMask = DAG.getNode(ISD::SUB , dl, VT, ScaledAlignment ,
4053
- DAG.getConstant(1 , dl, VT));
4054
- Tmp1 = DAG.getNode(ISD::ADD , dl, VT, SPOld, StackAlignMask);
4055
- Tmp1 = DAG.getNode(ISD::AND , dl, VT, Tmp1, ScaledAlignment );
4050
+ if (Alignment > StackAlign) {
4051
+ auto ScaledAlignment = (uint64_t)Alignment.value()
4052
+ << Subtarget->getWavefrontSizeLog2();
4053
+ auto StackAlignMask = ScaledAlignment - 1 ;
4054
+ auto TmpAddr = DAG.getNode(ISD::ADD , dl, VT, BaseAddr ,
4055
+ DAG.getConstant(StackAlignMask , dl, VT));
4056
+ BaseAddr = DAG.getNode(ISD::AND , dl, VT, TmpAddr,
4057
+ DAG.getConstant(ScaledAlignment , dl, VT) );
4056
4058
}
4057
4059
4058
4060
SDValue ScaledSize = DAG.getNode(
4059
4061
ISD::SHL, dl, VT, Size,
4060
4062
DAG.getConstant(Subtarget->getWavefrontSizeLog2(), dl, MVT::i32));
4061
4063
4062
- Align StackAlign = TFL->getStackAlign();
4063
- Tmp1 = DAG.getNode(ISD::ADD, dl, VT, SPOld, ScaledSize); // Value
4064
- if (Alignment && *Alignment > StackAlign) {
4065
- Tmp1 = DAG.getNode(
4066
- ISD::AND, dl, VT, Tmp1,
4067
- DAG.getSignedConstant(-(uint64_t)Alignment->value()
4068
- << Subtarget->getWavefrontSizeLog2(),
4069
- dl, VT));
4070
- }
4064
+ auto NewSP = DAG.getNode(ISD::ADD, dl, VT, BaseAddr, ScaledSize); // Value
4071
4065
4072
- Chain = DAG.getCopyToReg(Chain, dl, SPReg, Tmp1 ); // Output chain
4066
+ Chain = DAG.getCopyToReg(Chain, dl, SPReg, NewSP ); // Output chain
4073
4067
Tmp2 = DAG.getCALLSEQ_END(Chain, 0, 0, SDValue(), dl);
4074
4068
4075
- return DAG.getMergeValues({SPOld , Tmp2}, dl);
4069
+ return DAG.getMergeValues({BaseAddr , Tmp2}, dl);
4076
4070
}
4077
4071
4078
4072
SDValue SITargetLowering::LowerDYNAMIC_STACKALLOC(SDValue Op,
0 commit comments