forked from OSchip/llvm-project
[WebAssembly] Support calls marked as "tail", fastcc, and coldcc.
llvm-svn: 249184
This commit is contained in:
parent
e0129e474d
commit
9cc692b06e
|
@ -229,13 +229,23 @@ WebAssemblyTargetLowering::LowerCall(CallLoweringInfo &CLI,
|
|||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
|
||||
CallingConv::ID CallConv = CLI.CallConv;
|
||||
if (CallConv != CallingConv::C)
|
||||
fail(DL, DAG, "WebAssembly doesn't support non-C calling conventions");
|
||||
if (CLI.IsTailCall || MF.getTarget().Options.GuaranteedTailCallOpt)
|
||||
fail(DL, DAG, "WebAssembly doesn't support tail call yet");
|
||||
if (CallConv != CallingConv::C &&
|
||||
CallConv != CallingConv::Fast &&
|
||||
CallConv != CallingConv::Cold)
|
||||
fail(DL, DAG,
|
||||
"WebAssembly doesn't support language-specific or target-specific "
|
||||
"calling conventions yet");
|
||||
if (CLI.IsPatchPoint)
|
||||
fail(DL, DAG, "WebAssembly doesn't support patch point yet");
|
||||
|
||||
// WebAssembly doesn't currently support explicit tail calls. If they are
|
||||
// required, fail. Otherwise, just disable them.
|
||||
if ((CallConv == CallingConv::Fast && CLI.IsTailCall &&
|
||||
MF.getTarget().Options.GuaranteedTailCallOpt) ||
|
||||
(CLI.CS && CLI.CS->isMustTailCall()))
|
||||
fail(DL, DAG, "WebAssembly doesn't support tail call yet");
|
||||
CLI.IsTailCall = false;
|
||||
|
||||
SmallVectorImpl<ISD::OutputArg> &Outs = CLI.Outs;
|
||||
SmallVectorImpl<SDValue> &OutVals = CLI.OutVals;
|
||||
|
||||
|
|
|
@ -98,8 +98,31 @@ define i32 @call_indirect_i32(i32 ()* %callee) {
|
|||
ret i32 %t
|
||||
}
|
||||
|
||||
; CHECK-LABEL: (func $tail_call_void_nullary
|
||||
; CHECK-NEXT: (call $void_nullary)
|
||||
; CHECK-NEXT: (return)
|
||||
define void @tail_call_void_nullary() {
|
||||
tail call void @void_nullary()
|
||||
ret void
|
||||
}
|
||||
|
||||
; CHECK-LABEL: (func $fastcc_tail_call_void_nullary
|
||||
; CHECK-NEXT: (call $void_nullary)
|
||||
; CHECK-NEXT: (return)
|
||||
define void @fastcc_tail_call_void_nullary() {
|
||||
tail call fastcc void @void_nullary()
|
||||
ret void
|
||||
}
|
||||
|
||||
; CHECK-LABEL: (func $coldcc_tail_call_void_nullary
|
||||
; CHECK-NEXT: (call $void_nullary)
|
||||
; CHECK-NEXT: (return)
|
||||
define void @coldcc_tail_call_void_nullary() {
|
||||
tail call coldcc void @void_nullary()
|
||||
ret void
|
||||
}
|
||||
|
||||
; FIXME test the following:
|
||||
; - Functions without return.
|
||||
; - More argument combinations.
|
||||
; - Tail call.
|
||||
; - Interesting returns (struct, multiple).
|
||||
|
|
Loading…
Reference in New Issue