summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan Gohman <dan433584@gmail.com>2015-10-02 20:54:23 +0000
committerDan Gohman <dan433584@gmail.com>2015-10-02 20:54:23 +0000
commit9cc692b06ef88a92dfebac3115926a84cb436134 (patch)
treee19b46153ad85557bdf8ddae89aa7f37070cc7be
parente0129e474da7feb61806cd7fc1552143368e1996 (diff)
downloadbcm5719-llvm-9cc692b06ef88a92dfebac3115926a84cb436134.tar.gz
bcm5719-llvm-9cc692b06ef88a92dfebac3115926a84cb436134.zip
[WebAssembly] Support calls marked as "tail", fastcc, and coldcc.
llvm-svn: 249184
-rw-r--r--llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp18
-rw-r--r--llvm/test/CodeGen/WebAssembly/call.ll25
2 files changed, 38 insertions, 5 deletions
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp
index c9be0b3f2df..475d13ceefa 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp
@@ -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;
diff --git a/llvm/test/CodeGen/WebAssembly/call.ll b/llvm/test/CodeGen/WebAssembly/call.ll
index bf2ae7615ad..60195a9c3e4 100644
--- a/llvm/test/CodeGen/WebAssembly/call.ll
+++ b/llvm/test/CodeGen/WebAssembly/call.ll
@@ -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).
OpenPOWER on IntegriCloud