From 307756e77eb2f53bde1e29d4674167a3e4f632d4 Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Wed, 9 Sep 2015 01:52:45 +0000 Subject: [PATCH] [WebAssembly] Fix lowering of calls with more than one argument. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@247118 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/WebAssembly/WebAssemblyISelLowering.cpp | 7 +++++-- test/CodeGen/WebAssembly/call.ll | 13 +++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp b/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp index f4c2e5bce0d..7e9e1b0e016 100644 --- a/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp +++ b/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp @@ -228,16 +228,19 @@ WebAssemblyTargetLowering::LowerCall(CallLoweringInfo &CLI, SmallVectorImpl &Outs = CLI.Outs; SmallVectorImpl &OutVals = CLI.OutVals; + bool IsStructRet = (Outs.empty()) ? false : Outs[0].Flags.isSRet(); if (IsStructRet) fail(DL, DAG, "WebAssembly doesn't support struct return yet"); - if (Outs.size() > 1) - fail(DL, DAG, "WebAssembly doesn't support more than 1 returned value yet"); SmallVectorImpl &Ins = CLI.Ins; + if (Ins.size() > 1) + fail(DL, DAG, "WebAssembly doesn't support more than 1 returned value yet"); + bool IsVarArg = CLI.IsVarArg; if (IsVarArg) fail(DL, DAG, "WebAssembly doesn't support varargs yet"); + // Analyze operands of the call, assigning locations to each operand. SmallVector ArgLocs; CCState CCInfo(CallConv, IsVarArg, MF, ArgLocs, *DAG.getContext()); diff --git a/test/CodeGen/WebAssembly/call.ll b/test/CodeGen/WebAssembly/call.ll index d0ad7fd3edf..d628ec09630 100644 --- a/test/CodeGen/WebAssembly/call.ll +++ b/test/CodeGen/WebAssembly/call.ll @@ -7,6 +7,7 @@ target triple = "wasm32-unknown-unknown" declare i32 @i32_nullary() declare i32 @i32_unary(i32) +declare i32 @i32_binary(i32, i32) declare i64 @i64_nullary() declare float @float_nullary() declare double @double_nullary() @@ -62,6 +63,18 @@ define i32 @call_i32_unary(i32 %a) { ret i32 %r } +; CHECK-LABEL: (func $call_i32_binary +; CHECK-NEXT: (param i32) (param i32) (result i32) +; CHECK-NEXT: (setlocal @0 (argument 1)) +; CHECK-NEXT: (setlocal @1 (argument 0)) +; CHECK-NEXT: (setlocal @2 (global $i32_binary)) +; CHECK-NEXT: (setlocal @3 (call @2 @1 @0)) +; CHECK-NEXT: (return @3) +define i32 @call_i32_binary(i32 %a, i32 %b) { + %r = call i32 @i32_binary(i32 %a, i32 %b) + ret i32 %r +} + ; FIXME test the following: ; - Functions without return. ; - More argument combinations. -- 2.34.1