[llvm] [NVPTX] support dynamic allocas with PTX alloca instruction (PR #84585)
Artem Belevich via llvm-commits
llvm-commits at lists.llvm.org
Tue Mar 12 14:02:54 PDT 2024
================
@@ -2211,14 +2210,24 @@ SDValue NVPTXTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
SDValue NVPTXTargetLowering::LowerDYNAMIC_STACKALLOC(SDValue Op,
SelectionDAG &DAG) const {
- const Function &Fn = DAG.getMachineFunction().getFunction();
-
- DiagnosticInfoUnsupported NoDynamicAlloca(
- Fn, "dynamic alloca unsupported by NVPTX backend",
- SDLoc(Op).getDebugLoc());
- DAG.getContext()->diagnose(NoDynamicAlloca);
- auto Ops = {DAG.getConstant(0, SDLoc(), Op.getValueType()), Op.getOperand(0)};
- return DAG.getMergeValues(Ops, SDLoc());
+ SDValue Chain = Op.getOperand(0);
+ SDValue Size = Op.getOperand(1);
+ uint64_t Align = cast<ConstantSDNode>(Op.getOperand(2))->getZExtValue();
+ SDLoc DL(Op.getNode());
+
+ // The size for ptx alloca instruction is 64-bit for m64 and 32-bit for m32.
+ if (nvTM->is64Bit())
+ Size = DAG.getZExtOrTrunc(Size, DL, MVT::i64);
+ else
+ Size = DAG.getZExtOrTrunc(Size, DL, MVT::i32);
+
+ SDValue AllocOps[] = {Chain, Size,
+ DAG.getTargetConstant(Align, DL, MVT::i32)};
+ SDValue Alloca = DAG.getNode(NVPTXISD::DYNAMIC_STACKALLOC, DL,
+ nvTM->is64Bit() ? MVT::i64 : MVT::i32, AllocOps);
+
+ SDValue MergeOps[] = {Alloca, Chain};
+ return DAG.getMergeValues(MergeOps, DL);
----------------
Artem-B wrote:
We still need to diagnose it in some cases, as `alloca` instruction is only available on sm_52+ and PTX7.3+
https://github.com/llvm/llvm-project/pull/84585
More information about the llvm-commits
mailing list