Index: lib/Target/WebAssembly/WebAssemblyISelLowering.cpp =================================================================== --- lib/Target/WebAssembly/WebAssemblyISelLowering.cpp +++ lib/Target/WebAssembly/WebAssemblyISelLowering.cpp @@ -359,8 +359,11 @@ unsigned NumBytes = CCInfo.getAlignedCallFrameSize(); - auto NB = DAG.getConstant(NumBytes, DL, PtrVT, true); - Chain = DAG.getCALLSEQ_START(Chain, NB, DL); + SDValue NB; + if (NumBytes) { + NB = DAG.getConstant(NumBytes, DL, PtrVT, true); + Chain = DAG.getCALLSEQ_START(Chain, NB, DL); + } if (IsVarArg) { // For non-fixed arguments, next emit stores to store the argument values @@ -420,8 +423,10 @@ Chain = Res.getValue(1); } - SDValue Unused = DAG.getUNDEF(PtrVT); - Chain = DAG.getCALLSEQ_END(Chain, NB, Unused, SDValue(), DL); + if (NumBytes) { + SDValue Unused = DAG.getUNDEF(PtrVT); + Chain = DAG.getCALLSEQ_END(Chain, NB, Unused, SDValue(), DL); + } return Chain; } Index: lib/Target/WebAssembly/WebAssemblyInstrCall.td =================================================================== --- lib/Target/WebAssembly/WebAssemblyInstrCall.td +++ lib/Target/WebAssembly/WebAssemblyInstrCall.td @@ -18,7 +18,7 @@ // Call sequence markers. These have an immediate which represents the amount of // stack space to allocate or free, which is used for varargs lowering. -let isCodeGenOnly = 1 in { +let Uses = [SP32, SP64], Defs = [SP32, SP64], isCodeGenOnly = 1 in { def ADJCALLSTACKDOWN : I<(outs), (ins i32imm:$amt), [(WebAssemblycallseq_start timm:$amt)]>; def ADJCALLSTACKUP : I<(outs), (ins i32imm:$amt),