From: JF Bastien Date: Tue, 25 Aug 2015 22:58:05 +0000 (+0000) Subject: WebAssembly: emit `(func (param t) (result t))` s-expressions X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=commitdiff_plain;h=0118969fbdfe23849d73bba2df8e8f4a84d8b233 WebAssembly: emit `(func (param t) (result t))` s-expressions Summary: Match spec format: https://github.com/WebAssembly/spec/blob/master/ml-proto/test/fac.wasm Reviewers: sunfish Subscribers: llvm-commits, jfb Differential Revision: http://reviews.llvm.org/D12307 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@245986 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp b/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp index 065ef87fb35..a81e35ea4da 100644 --- a/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp +++ b/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp @@ -27,6 +27,7 @@ #include "llvm/IR/DataLayout.h" #include "llvm/IR/DebugInfo.h" #include "llvm/MC/MCStreamer.h" +#include "llvm/MC/MCSymbol.h" #include "llvm/Support/Debug.h" #include "llvm/Support/TargetRegistry.h" #include "llvm/Support/raw_ostream.h" @@ -66,6 +67,10 @@ private: // AsmPrinter Implementation. //===------------------------------------------------------------------===// + void EmitFunctionEntryLabel() override; + void EmitFunctionBodyStart() override; + void EmitFunctionBodyEnd() override; + void EmitInstruction(const MachineInstr *MI) override; }; @@ -86,6 +91,62 @@ static SmallString<32> Name(const WebAssemblyInstrInfo *TII, static std::string toSymbol(StringRef S) { return ("$" + S).str(); } +static const char *toType(const Type *Ty) { + switch (Ty->getTypeID()) { + default: break; + case Type::FloatTyID: return "f32"; + case Type::DoubleTyID: return "f64"; + case Type::IntegerTyID: + switch (Ty->getIntegerBitWidth()) { + case 32: return "i32"; + case 64: return "i64"; + default: break; + } + } + DEBUG(dbgs() << "Invalid type "; Ty->print(dbgs()); dbgs() << '\n'); + llvm_unreachable("invalid type"); + return ""; +} + +void WebAssemblyAsmPrinter::EmitFunctionEntryLabel() { + SmallString<128> Str; + raw_svector_ostream OS(Str); + + CurrentFnSym->redefineIfPossible(); + + // The function label could have already been emitted if two symbols end up + // conflicting due to asm renaming. Detect this and emit an error. + if (CurrentFnSym->isVariable()) + report_fatal_error("'" + Twine(CurrentFnSym->getName()) + + "' is a protected alias"); + if (CurrentFnSym->isDefined()) + report_fatal_error("'" + Twine(CurrentFnSym->getName()) + + "' label emitted multiple times to assembly file"); + + OS << "(func " << toSymbol(CurrentFnSym->getName()); + OutStreamer->EmitRawText(OS.str()); +} + +void WebAssemblyAsmPrinter::EmitFunctionBodyStart() { + SmallString<128> Str; + raw_svector_ostream OS(Str); + const Function *F = MF->getFunction(); + for (const Argument &A : F->args()) + OS << " (param " << toType(A.getType()) << ')'; + const Type *Rt = F->getReturnType(); + if (!Rt->isVoidTy()) + OS << " (result " << toType(Rt) << ')'; + OS << '\n'; + OutStreamer->EmitRawText(OS.str()); +} + +void WebAssemblyAsmPrinter::EmitFunctionBodyEnd() { + SmallString<128> Str; + raw_svector_ostream OS(Str); + OS << ") ;; end func " << toSymbol(CurrentFnSym->getName()) << '\n'; + OutStreamer->EmitRawText(OS.str()); +} + void WebAssemblyAsmPrinter::EmitInstruction(const MachineInstr *MI) { DEBUG(dbgs() << "EmitInstruction: " << *MI << '\n'); SmallString<128> Str; diff --git a/test/CodeGen/WebAssembly/call.ll b/test/CodeGen/WebAssembly/call.ll index ae66fae840c..d0ad7fd3edf 100644 --- a/test/CodeGen/WebAssembly/call.ll +++ b/test/CodeGen/WebAssembly/call.ll @@ -11,7 +11,8 @@ declare i64 @i64_nullary() declare float @float_nullary() declare double @double_nullary() -; CHECK-LABEL: call_i32_nullary: +; CHECK-LABEL: (func $call_i32_nullary +; CHECK-NEXT: (result i32) ; CHECK-NEXT: (setlocal @0 (global $i32_nullary)) ; CHECK-NEXT: (setlocal @1 (call @0)) ; CHECK-NEXT: (return @1) @@ -20,7 +21,8 @@ define i32 @call_i32_nullary() { ret i32 %r } -; CHECK-LABEL: call_i64_nullary: +; CHECK-LABEL: (func $call_i64_nullary +; CHECK-NEXT: (result i64) ; CHECK-NEXT: (setlocal @0 (global $i64_nullary)) ; CHECK-NEXT: (setlocal @1 (call @0)) ; CHECK-NEXT: (return @1) @@ -29,7 +31,8 @@ define i64 @call_i64_nullary() { ret i64 %r } -; CHECK-LABEL: call_float_nullary: +; CHECK-LABEL: (func $call_float_nullary +; CHECK-NEXT: (result f32) ; CHECK-NEXT: (setlocal @0 (global $float_nullary)) ; CHECK-NEXT: (setlocal @1 (call @0)) ; CHECK-NEXT: (return @1) @@ -38,7 +41,8 @@ define float @call_float_nullary() { ret float %r } -; CHECK-LABEL: call_double_nullary: +; CHECK-LABEL: (func $call_double_nullary +; CHECK-NEXT: (result f64) ; CHECK-NEXT: (setlocal @0 (global $double_nullary)) ; CHECK-NEXT: (setlocal @1 (call @0)) ; CHECK-NEXT: (return @1) @@ -47,7 +51,8 @@ define double @call_double_nullary() { ret double %r } -; CHECK-LABEL: call_i32_unary: +; CHECK-LABEL: (func $call_i32_unary +; CHECK-NEXT: (param i32) (result i32) ; CHECK-NEXT: (setlocal @0 (argument 0)) ; CHECK-NEXT: (setlocal @1 (global $i32_unary)) ; CHECK-NEXT: (setlocal @2 (call @1 @0)) diff --git a/test/CodeGen/WebAssembly/comparisons_f32.ll b/test/CodeGen/WebAssembly/comparisons_f32.ll index 22497ce8eea..c199eef37d4 100644 --- a/test/CodeGen/WebAssembly/comparisons_f32.ll +++ b/test/CodeGen/WebAssembly/comparisons_f32.ll @@ -6,7 +6,8 @@ target datalayout = "e-p:32:32-i64:64-n32:64-S128" target triple = "wasm32-unknown-unknown" -; CHECK-LABEL: ord_f32: +; CHECK-LABEL: (func $ord_f32 +; CHECK-NEXT: (param f32) (param f32) (result i32) ; CHECK-NEXT: (setlocal @0 (argument 0)) ; CHECK-NEXT: (setlocal @1 (argument 1)) ; CHECK-NEXT: (setlocal @2 (eq @1 @1)) @@ -19,7 +20,8 @@ define i32 @ord_f32(float %x, float %y) { ret i32 %b } -; CHECK-LABEL: uno_f32: +; CHECK-LABEL: (func $uno_f32 +; CHECK-NEXT: (param f32) (param f32) (result i32) ; CHECK-NEXT: (setlocal @0 (argument 0)) ; CHECK-NEXT: (setlocal @1 (argument 1)) ; CHECK-NEXT: (setlocal @2 (ne @1 @1)) @@ -32,7 +34,8 @@ define i32 @uno_f32(float %x, float %y) { ret i32 %b } -; CHECK-LABEL: oeq_f32: +; CHECK-LABEL: (func $oeq_f32 +; CHECK-NEXT: (param f32) (param f32) (result i32) ; CHECK-NEXT: (setlocal @0 (argument 1)) ; CHECK-NEXT: (setlocal @1 (argument 0)) ; CHECK-NEXT: (setlocal @2 (eq @1 @0)) @@ -43,7 +46,7 @@ define i32 @oeq_f32(float %x, float %y) { ret i32 %b } -; CHECK-LABEL: une_f32: +; CHECK-LABEL: (func $une_f32 ; CHECK: (setlocal @2 (ne @1 @0)) define i32 @une_f32(float %x, float %y) { %a = fcmp une float %x, %y @@ -51,7 +54,7 @@ define i32 @une_f32(float %x, float %y) { ret i32 %b } -; CHECK-LABEL: olt_f32: +; CHECK-LABEL: (func $olt_f32 ; CHECK: (setlocal @2 (lt @1 @0)) define i32 @olt_f32(float %x, float %y) { %a = fcmp olt float %x, %y @@ -59,7 +62,7 @@ define i32 @olt_f32(float %x, float %y) { ret i32 %b } -; CHECK-LABEL: ole_f32: +; CHECK-LABEL: (func $ole_f32 ; CHECK: (setlocal @2 (le @1 @0)) define i32 @ole_f32(float %x, float %y) { %a = fcmp ole float %x, %y @@ -67,7 +70,7 @@ define i32 @ole_f32(float %x, float %y) { ret i32 %b } -; CHECK-LABEL: ogt_f32: +; CHECK-LABEL: (func $ogt_f32 ; CHECK: (setlocal @2 (gt @1 @0)) define i32 @ogt_f32(float %x, float %y) { %a = fcmp ogt float %x, %y @@ -75,7 +78,7 @@ define i32 @ogt_f32(float %x, float %y) { ret i32 %b } -; CHECK-LABEL: oge_f32: +; CHECK-LABEL: (func $oge_f32 ; CHECK: (setlocal @2 (ge @1 @0)) define i32 @oge_f32(float %x, float %y) { %a = fcmp oge float %x, %y @@ -85,7 +88,8 @@ define i32 @oge_f32(float %x, float %y) { ; Expanded comparisons, which also check for NaN. -; CHECK-LABEL: ueq_f32: +; CHECK-LABEL: (func $ueq_f32 +; CHECK-NEXT: (param f32) (param f32) (result i32) ; CHECK-NEXT: (setlocal @0 (argument 1)) ; CHECK-NEXT: (setlocal @1 (argument 0)) ; CHECK-NEXT: (setlocal @2 (eq @1 @0)) @@ -100,7 +104,7 @@ define i32 @ueq_f32(float %x, float %y) { ret i32 %b } -; CHECK-LABEL: one_f32: +; CHECK-LABEL: (func $one_f32 ; CHECK: (setlocal @2 (ne @1 @0)) define i32 @one_f32(float %x, float %y) { %a = fcmp one float %x, %y @@ -108,7 +112,7 @@ define i32 @one_f32(float %x, float %y) { ret i32 %b } -; CHECK-LABEL: ult_f32: +; CHECK-LABEL: (func $ult_f32 ; CHECK: (setlocal @2 (lt @1 @0)) define i32 @ult_f32(float %x, float %y) { %a = fcmp ult float %x, %y @@ -116,7 +120,7 @@ define i32 @ult_f32(float %x, float %y) { ret i32 %b } -; CHECK-LABEL: ule_f32: +; CHECK-LABEL: (func $ule_f32 ; CHECK: (setlocal @2 (le @1 @0)) define i32 @ule_f32(float %x, float %y) { %a = fcmp ule float %x, %y @@ -124,7 +128,7 @@ define i32 @ule_f32(float %x, float %y) { ret i32 %b } -; CHECK-LABEL: ugt_f32: +; CHECK-LABEL: (func $ugt_f32 ; CHECK: (setlocal @2 (gt @1 @0)) define i32 @ugt_f32(float %x, float %y) { %a = fcmp ugt float %x, %y @@ -132,7 +136,7 @@ define i32 @ugt_f32(float %x, float %y) { ret i32 %b } -; CHECK-LABEL: uge_f32: +; CHECK-LABEL: (func $uge_f32 ; CHECK: (setlocal @2 (ge @1 @0)) define i32 @uge_f32(float %x, float %y) { %a = fcmp uge float %x, %y diff --git a/test/CodeGen/WebAssembly/comparisons_f64.ll b/test/CodeGen/WebAssembly/comparisons_f64.ll index ae56206dbb0..a4df642daa7 100644 --- a/test/CodeGen/WebAssembly/comparisons_f64.ll +++ b/test/CodeGen/WebAssembly/comparisons_f64.ll @@ -6,7 +6,8 @@ target datalayout = "e-p:32:32-i64:64-n32:64-S128" target triple = "wasm32-unknown-unknown" -; CHECK-LABEL: ord_f64: +; CHECK-LABEL: (func $ord_f64 +; CHECK-NEXT: (param f64) (param f64) (result i32) ; CHECK-NEXT: (setlocal @0 (argument 0)) ; CHECK-NEXT: (setlocal @1 (argument 1)) ; CHECK-NEXT: (setlocal @2 (eq @1 @1)) @@ -19,7 +20,8 @@ define i32 @ord_f64(double %x, double %y) { ret i32 %b } -; CHECK-LABEL: uno_f64: +; CHECK-LABEL: (func $uno_f64 +; CHECK-NEXT: (param f64) (param f64) (result i32) ; CHECK-NEXT: (setlocal @0 (argument 0)) ; CHECK-NEXT: (setlocal @1 (argument 1)) ; CHECK-NEXT: (setlocal @2 (ne @1 @1)) @@ -32,7 +34,8 @@ define i32 @uno_f64(double %x, double %y) { ret i32 %b } -; CHECK-LABEL: oeq_f64: +; CHECK-LABEL: (func $oeq_f64 +; CHECK-NEXT: (param f64) (param f64) (result i32) ; CHECK-NEXT: (setlocal @0 (argument 1)) ; CHECK-NEXT: (setlocal @1 (argument 0)) ; CHECK-NEXT: (setlocal @2 (eq @1 @0)) @@ -43,7 +46,7 @@ define i32 @oeq_f64(double %x, double %y) { ret i32 %b } -; CHECK-LABEL: une_f64: +; CHECK-LABEL: (func $une_f64 ; CHECK: (setlocal @2 (ne @1 @0)) define i32 @une_f64(double %x, double %y) { %a = fcmp une double %x, %y @@ -51,7 +54,7 @@ define i32 @une_f64(double %x, double %y) { ret i32 %b } -; CHECK-LABEL: olt_f64: +; CHECK-LABEL: (func $olt_f64 ; CHECK: (setlocal @2 (lt @1 @0)) define i32 @olt_f64(double %x, double %y) { %a = fcmp olt double %x, %y @@ -59,7 +62,7 @@ define i32 @olt_f64(double %x, double %y) { ret i32 %b } -; CHECK-LABEL: ole_f64: +; CHECK-LABEL: (func $ole_f64 ; CHECK: (setlocal @2 (le @1 @0)) define i32 @ole_f64(double %x, double %y) { %a = fcmp ole double %x, %y @@ -67,7 +70,7 @@ define i32 @ole_f64(double %x, double %y) { ret i32 %b } -; CHECK-LABEL: ogt_f64: +; CHECK-LABEL: (func $ogt_f64 ; CHECK: (setlocal @2 (gt @1 @0)) define i32 @ogt_f64(double %x, double %y) { %a = fcmp ogt double %x, %y @@ -75,7 +78,7 @@ define i32 @ogt_f64(double %x, double %y) { ret i32 %b } -; CHECK-LABEL: oge_f64: +; CHECK-LABEL: (func $oge_f64 ; CHECK: (setlocal @2 (ge @1 @0)) define i32 @oge_f64(double %x, double %y) { %a = fcmp oge double %x, %y @@ -85,7 +88,8 @@ define i32 @oge_f64(double %x, double %y) { ; Expanded comparisons, which also check for NaN. -; CHECK-LABEL: ueq_f64: +; CHECK-LABEL: (func $ueq_f64 +; CHECK-NEXT: (param f64) (param f64) (result i32) ; CHECK-NEXT: (setlocal @0 (argument 1)) ; CHECK-NEXT: (setlocal @1 (argument 0)) ; CHECK-NEXT: (setlocal @2 (eq @1 @0)) @@ -100,7 +104,7 @@ define i32 @ueq_f64(double %x, double %y) { ret i32 %b } -; CHECK-LABEL: one_f64: +; CHECK-LABEL: (func $one_f64 ; CHECK: (setlocal @2 (ne @1 @0)) define i32 @one_f64(double %x, double %y) { %a = fcmp one double %x, %y @@ -108,7 +112,7 @@ define i32 @one_f64(double %x, double %y) { ret i32 %b } -; CHECK-LABEL: ult_f64: +; CHECK-LABEL: (func $ult_f64 ; CHECK: (setlocal @2 (lt @1 @0)) define i32 @ult_f64(double %x, double %y) { %a = fcmp ult double %x, %y @@ -116,7 +120,7 @@ define i32 @ult_f64(double %x, double %y) { ret i32 %b } -; CHECK-LABEL: ule_f64: +; CHECK-LABEL: (func $ule_f64 ; CHECK: (setlocal @2 (le @1 @0)) define i32 @ule_f64(double %x, double %y) { %a = fcmp ule double %x, %y @@ -124,7 +128,7 @@ define i32 @ule_f64(double %x, double %y) { ret i32 %b } -; CHECK-LABEL: ugt_f64: +; CHECK-LABEL: (func $ugt_f64 ; CHECK: (setlocal @2 (gt @1 @0)) define i32 @ugt_f64(double %x, double %y) { %a = fcmp ugt double %x, %y @@ -132,7 +136,7 @@ define i32 @ugt_f64(double %x, double %y) { ret i32 %b } -; CHECK-LABEL: uge_f64: +; CHECK-LABEL: (func $uge_f64 ; CHECK: (setlocal @2 (ge @1 @0)) define i32 @uge_f64(double %x, double %y) { %a = fcmp uge double %x, %y diff --git a/test/CodeGen/WebAssembly/comparisons_i32.ll b/test/CodeGen/WebAssembly/comparisons_i32.ll index dbf53442667..a509817a1eb 100644 --- a/test/CodeGen/WebAssembly/comparisons_i32.ll +++ b/test/CodeGen/WebAssembly/comparisons_i32.ll @@ -5,7 +5,8 @@ target datalayout = "e-p:32:32-i64:64-n32:64-S128" target triple = "wasm32-unknown-unknown" -; CHECK-LABEL: eq_i32: +; CHECK-LABEL: (func $eq_i32 +; CHECK-NEXT: (param i32) (param i32) (result i32) ; CHECK-NEXT: (setlocal @0 (argument 1)) ; CHECK-NEXT: (setlocal @1 (argument 0)) ; CHECK-NEXT: (setlocal @2 (eq @1 @0)) @@ -16,7 +17,7 @@ define i32 @eq_i32(i32 %x, i32 %y) { ret i32 %b } -; CHECK-LABEL: ne_i32: +; CHECK-LABEL: (func $ne_i32 ; CHECK: (setlocal @2 (ne @1 @0)) define i32 @ne_i32(i32 %x, i32 %y) { %a = icmp ne i32 %x, %y @@ -24,7 +25,7 @@ define i32 @ne_i32(i32 %x, i32 %y) { ret i32 %b } -; CHECK-LABEL: slt_i32: +; CHECK-LABEL: (func $slt_i32 ; CHECK: (setlocal @2 (slt @1 @0)) define i32 @slt_i32(i32 %x, i32 %y) { %a = icmp slt i32 %x, %y @@ -32,7 +33,7 @@ define i32 @slt_i32(i32 %x, i32 %y) { ret i32 %b } -; CHECK-LABEL: sle_i32: +; CHECK-LABEL: (func $sle_i32 ; CHECK: (setlocal @2 (sle @1 @0)) define i32 @sle_i32(i32 %x, i32 %y) { %a = icmp sle i32 %x, %y @@ -40,7 +41,7 @@ define i32 @sle_i32(i32 %x, i32 %y) { ret i32 %b } -; CHECK-LABEL: ult_i32: +; CHECK-LABEL: (func $ult_i32 ; CHECK: (setlocal @2 (ult @1 @0)) define i32 @ult_i32(i32 %x, i32 %y) { %a = icmp ult i32 %x, %y @@ -48,7 +49,7 @@ define i32 @ult_i32(i32 %x, i32 %y) { ret i32 %b } -; CHECK-LABEL: ule_i32: +; CHECK-LABEL: (func $ule_i32 ; CHECK: (setlocal @2 (ule @1 @0)) define i32 @ule_i32(i32 %x, i32 %y) { %a = icmp ule i32 %x, %y @@ -56,7 +57,7 @@ define i32 @ule_i32(i32 %x, i32 %y) { ret i32 %b } -; CHECK-LABEL: sgt_i32: +; CHECK-LABEL: (func $sgt_i32 ; CHECK: (setlocal @2 (sgt @1 @0)) define i32 @sgt_i32(i32 %x, i32 %y) { %a = icmp sgt i32 %x, %y @@ -64,7 +65,7 @@ define i32 @sgt_i32(i32 %x, i32 %y) { ret i32 %b } -; CHECK-LABEL: sge_i32: +; CHECK-LABEL: (func $sge_i32 ; CHECK: (setlocal @2 (sge @1 @0)) define i32 @sge_i32(i32 %x, i32 %y) { %a = icmp sge i32 %x, %y @@ -72,7 +73,7 @@ define i32 @sge_i32(i32 %x, i32 %y) { ret i32 %b } -; CHECK-LABEL: ugt_i32: +; CHECK-LABEL: (func $ugt_i32 ; CHECK: (setlocal @2 (ugt @1 @0)) define i32 @ugt_i32(i32 %x, i32 %y) { %a = icmp ugt i32 %x, %y @@ -80,7 +81,7 @@ define i32 @ugt_i32(i32 %x, i32 %y) { ret i32 %b } -; CHECK-LABEL: uge_i32: +; CHECK-LABEL: (func $uge_i32 ; CHECK: (setlocal @2 (uge @1 @0)) define i32 @uge_i32(i32 %x, i32 %y) { %a = icmp uge i32 %x, %y diff --git a/test/CodeGen/WebAssembly/comparisons_i64.ll b/test/CodeGen/WebAssembly/comparisons_i64.ll index c1d258664a4..8822de66ca7 100644 --- a/test/CodeGen/WebAssembly/comparisons_i64.ll +++ b/test/CodeGen/WebAssembly/comparisons_i64.ll @@ -5,7 +5,8 @@ target datalayout = "e-p:32:32-i64:64-n32:64-S128" target triple = "wasm32-unknown-unknown" -; CHECK-LABEL: eq_i64: +; CHECK-LABEL: (func $eq_i64 +; CHECK-NEXT: (param i64) (param i64) (result i32) ; CHECK-NEXT: (setlocal @0 (argument 1)) ; CHECK-NEXT: (setlocal @1 (argument 0)) ; CHECK-NEXT: (setlocal @2 (eq @1 @0)) @@ -16,7 +17,7 @@ define i32 @eq_i64(i64 %x, i64 %y) { ret i32 %b } -; CHECK-LABEL: ne_i64: +; CHECK-LABEL: (func $ne_i64 ; CHECK: (setlocal @2 (ne @1 @0)) define i32 @ne_i64(i64 %x, i64 %y) { %a = icmp ne i64 %x, %y @@ -24,7 +25,7 @@ define i32 @ne_i64(i64 %x, i64 %y) { ret i32 %b } -; CHECK-LABEL: slt_i64: +; CHECK-LABEL: (func $slt_i64 ; CHECK: (setlocal @2 (slt @1 @0)) define i32 @slt_i64(i64 %x, i64 %y) { %a = icmp slt i64 %x, %y @@ -32,7 +33,7 @@ define i32 @slt_i64(i64 %x, i64 %y) { ret i32 %b } -; CHECK-LABEL: sle_i64: +; CHECK-LABEL: (func $sle_i64 ; CHECK: (setlocal @2 (sle @1 @0)) define i32 @sle_i64(i64 %x, i64 %y) { %a = icmp sle i64 %x, %y @@ -40,7 +41,7 @@ define i32 @sle_i64(i64 %x, i64 %y) { ret i32 %b } -; CHECK-LABEL: ult_i64: +; CHECK-LABEL: (func $ult_i64 ; CHECK: (setlocal @2 (ult @1 @0)) define i32 @ult_i64(i64 %x, i64 %y) { %a = icmp ult i64 %x, %y @@ -48,7 +49,7 @@ define i32 @ult_i64(i64 %x, i64 %y) { ret i32 %b } -; CHECK-LABEL: ule_i64: +; CHECK-LABEL: (func $ule_i64 ; CHECK: (setlocal @2 (ule @1 @0)) define i32 @ule_i64(i64 %x, i64 %y) { %a = icmp ule i64 %x, %y @@ -56,7 +57,7 @@ define i32 @ule_i64(i64 %x, i64 %y) { ret i32 %b } -; CHECK-LABEL: sgt_i64: +; CHECK-LABEL: (func $sgt_i64 ; CHECK: (setlocal @2 (sgt @1 @0)) define i32 @sgt_i64(i64 %x, i64 %y) { %a = icmp sgt i64 %x, %y @@ -64,7 +65,7 @@ define i32 @sgt_i64(i64 %x, i64 %y) { ret i32 %b } -; CHECK-LABEL: sge_i64: +; CHECK-LABEL: (func $sge_i64 ; CHECK: (setlocal @2 (sge @1 @0)) define i32 @sge_i64(i64 %x, i64 %y) { %a = icmp sge i64 %x, %y @@ -72,7 +73,7 @@ define i32 @sge_i64(i64 %x, i64 %y) { ret i32 %b } -; CHECK-LABEL: ugt_i64: +; CHECK-LABEL: (func $ugt_i64 ; CHECK: (setlocal @2 (ugt @1 @0)) define i32 @ugt_i64(i64 %x, i64 %y) { %a = icmp ugt i64 %x, %y @@ -80,7 +81,7 @@ define i32 @ugt_i64(i64 %x, i64 %y) { ret i32 %b } -; CHECK-LABEL: uge_i64: +; CHECK-LABEL: (func $uge_i64 ; CHECK: (setlocal @2 (uge @1 @0)) define i32 @uge_i64(i64 %x, i64 %y) { %a = icmp uge i64 %x, %y diff --git a/test/CodeGen/WebAssembly/fast-isel.ll b/test/CodeGen/WebAssembly/fast-isel.ll index c4f1c2fa5e8..f0dfc623f60 100644 --- a/test/CodeGen/WebAssembly/fast-isel.ll +++ b/test/CodeGen/WebAssembly/fast-isel.ll @@ -7,13 +7,13 @@ target triple = "wasm32-unknown-unknown" ; This tests very minimal fast-isel functionality. -; CHECK-LABEL: immediate_f32 +; CHECK-LABEL: (func $immediate_f32 ; CHECK: (immediate 0x1.4p1) define float @immediate_f32() { ret float 2.5 } -; CHECK-LABEL: immediate_f64 +; CHECK-LABEL: (func $immediate_f64 ; CHECK: (immediate 0x1.4p1) define double @immediate_f64() { ret double 2.5 diff --git a/test/CodeGen/WebAssembly/fp32.ll b/test/CodeGen/WebAssembly/fp32.ll index 279aaba44b9..754ff95155a 100644 --- a/test/CodeGen/WebAssembly/fp32.ll +++ b/test/CodeGen/WebAssembly/fp32.ll @@ -14,7 +14,8 @@ declare float @llvm.trunc.f32(float) declare float @llvm.nearbyint.f32(float) declare float @llvm.rint.f32(float) -; CHECK-LABEL: fadd32: +; CHECK-LABEL: (func $fadd32 +; CHECK-NEXT: (param f32) (param f32) (result f32) ; CHECK-NEXT: (setlocal @0 (argument 1)) ; CHECK-NEXT: (setlocal @1 (argument 0)) ; CHECK-NEXT: (setlocal @2 (fadd @1 @0)) @@ -24,84 +25,84 @@ define float @fadd32(float %x, float %y) { ret float %a } -; CHECK-LABEL: fsub32: +; CHECK-LABEL: (func $fsub32 ; CHECK: (setlocal @2 (fsub @1 @0)) define float @fsub32(float %x, float %y) { %a = fsub float %x, %y ret float %a } -; CHECK-LABEL: fmul32: +; CHECK-LABEL: (func $fmul32 ; CHECK: (setlocal @2 (fmul @1 @0)) define float @fmul32(float %x, float %y) { %a = fmul float %x, %y ret float %a } -; CHECK-LABEL: fdiv32: +; CHECK-LABEL: (func $fdiv32 ; CHECK: (setlocal @2 (fdiv @1 @0)) define float @fdiv32(float %x, float %y) { %a = fdiv float %x, %y ret float %a } -; CHECK-LABEL: fabs32: +; CHECK-LABEL: (func $fabs32 ; CHECK: (setlocal @1 (fabs @0)) define float @fabs32(float %x) { %a = call float @llvm.fabs.f32(float %x) ret float %a } -; CHECK-LABEL: fneg32: +; CHECK-LABEL: (func $fneg32 ; CHECK: (setlocal @1 (fneg @0)) define float @fneg32(float %x) { %a = fsub float -0., %x ret float %a } -; CHECK-LABEL: copysign32: +; CHECK-LABEL: (func $copysign32 ; CHECK: (setlocal @2 (copysign @1 @0)) define float @copysign32(float %x, float %y) { %a = call float @llvm.copysign.f32(float %x, float %y) ret float %a } -; CHECK-LABEL: sqrt32: +; CHECK-LABEL: (func $sqrt32 ; CHECK: (setlocal @1 (sqrt @0)) define float @sqrt32(float %x) { %a = call float @llvm.sqrt.f32(float %x) ret float %a } -; CHECK-LABEL: ceil32: +; CHECK-LABEL: (func $ceil32 ; CHECK: (setlocal @1 (ceil @0)) define float @ceil32(float %x) { %a = call float @llvm.ceil.f32(float %x) ret float %a } -; CHECK-LABEL: floor32: +; CHECK-LABEL: (func $floor32 ; CHECK: (setlocal @1 (floor @0)) define float @floor32(float %x) { %a = call float @llvm.floor.f32(float %x) ret float %a } -; CHECK-LABEL: trunc32: +; CHECK-LABEL: (func $trunc32 ; CHECK: (setlocal @1 (trunc @0)) define float @trunc32(float %x) { %a = call float @llvm.trunc.f32(float %x) ret float %a } -; CHECK-LABEL: nearestint32: +; CHECK-LABEL: (func $nearestint32 ; CHECK: (setlocal @1 (nearestint @0)) define float @nearestint32(float %x) { %a = call float @llvm.nearbyint.f32(float %x) ret float %a } -; CHECK-LABEL: nearestint32_via_rint: +; CHECK-LABEL: (func $nearestint32_via_rint ; CHECK: (setlocal @1 (nearestint @0)) define float @nearestint32_via_rint(float %x) { %a = call float @llvm.rint.f32(float %x) diff --git a/test/CodeGen/WebAssembly/fp64.ll b/test/CodeGen/WebAssembly/fp64.ll index 948d48470d6..af4d945c4bc 100644 --- a/test/CodeGen/WebAssembly/fp64.ll +++ b/test/CodeGen/WebAssembly/fp64.ll @@ -14,7 +14,8 @@ declare double @llvm.trunc.f64(double) declare double @llvm.nearbyint.f64(double) declare double @llvm.rint.f64(double) -; CHECK-LABEL: fadd64: +; CHECK-LABEL: (func $fadd64 +; CHECK-NEXT: (param f64) (param f64) (result f64) ; CHECK-NEXT: (setlocal @0 (argument 1)) ; CHECK-NEXT: (setlocal @1 (argument 0)) ; CHECK-NEXT: (setlocal @2 (fadd @1 @0)) @@ -24,84 +25,84 @@ define double @fadd64(double %x, double %y) { ret double %a } -; CHECK-LABEL: fsub64: +; CHECK-LABEL: (func $fsub64 ; CHECK: (setlocal @2 (fsub @1 @0)) define double @fsub64(double %x, double %y) { %a = fsub double %x, %y ret double %a } -; CHECK-LABEL: fmul64: +; CHECK-LABEL: (func $fmul64 ; CHECK: (setlocal @2 (fmul @1 @0)) define double @fmul64(double %x, double %y) { %a = fmul double %x, %y ret double %a } -; CHECK-LABEL: fdiv64: +; CHECK-LABEL: (func $fdiv64 ; CHECK: (setlocal @2 (fdiv @1 @0)) define double @fdiv64(double %x, double %y) { %a = fdiv double %x, %y ret double %a } -; CHECK-LABEL: fabs64: +; CHECK-LABEL: (func $fabs64 ; CHECK: (setlocal @1 (fabs @0)) define double @fabs64(double %x) { %a = call double @llvm.fabs.f64(double %x) ret double %a } -; CHECK-LABEL: fneg64: +; CHECK-LABEL: (func $fneg64 ; CHECK: (setlocal @1 (fneg @0)) define double @fneg64(double %x) { %a = fsub double -0., %x ret double %a } -; CHECK-LABEL: copysign64: +; CHECK-LABEL: (func $copysign64 ; CHECK: (setlocal @2 (copysign @1 @0)) define double @copysign64(double %x, double %y) { %a = call double @llvm.copysign.f64(double %x, double %y) ret double %a } -; CHECK-LABEL: sqrt64: +; CHECK-LABEL: (func $sqrt64 ; CHECK: (setlocal @1 (sqrt @0)) define double @sqrt64(double %x) { %a = call double @llvm.sqrt.f64(double %x) ret double %a } -; CHECK-LABEL: ceil64: +; CHECK-LABEL: (func $ceil64 ; CHECK: (setlocal @1 (ceil @0)) define double @ceil64(double %x) { %a = call double @llvm.ceil.f64(double %x) ret double %a } -; CHECK-LABEL: floor64: +; CHECK-LABEL: (func $floor64 ; CHECK: (setlocal @1 (floor @0)) define double @floor64(double %x) { %a = call double @llvm.floor.f64(double %x) ret double %a } -; CHECK-LABEL: trunc64: +; CHECK-LABEL: (func $trunc64 ; CHECK: (setlocal @1 (trunc @0)) define double @trunc64(double %x) { %a = call double @llvm.trunc.f64(double %x) ret double %a } -; CHECK-LABEL: nearestint64: +; CHECK-LABEL: (func $nearestint64 ; CHECK: (setlocal @1 (nearestint @0)) define double @nearestint64(double %x) { %a = call double @llvm.nearbyint.f64(double %x) ret double %a } -; CHECK-LABEL: nearestint64_via_rint: +; CHECK-LABEL: (func $nearestint64_via_rint ; CHECK: (setlocal @1 (nearestint @0)) define double @nearestint64_via_rint(double %x) { %a = call double @llvm.rint.f64(double %x) diff --git a/test/CodeGen/WebAssembly/func.ll b/test/CodeGen/WebAssembly/func.ll new file mode 100644 index 00000000000..edd31b11bb4 --- /dev/null +++ b/test/CodeGen/WebAssembly/func.ll @@ -0,0 +1,39 @@ +; RUN: llc < %s -asm-verbose=false | FileCheck %s + +; Test that basic functions assemble as expected. + +target datalayout = "e-p:32:32-i64:64-v128:8:128-n32:64-S128" +target triple = "wasm32-unknown-unknown" + +; CHECK-LABEL: (func $f0{{$}} +; CHECK: (return){{$}} +; CHECK-NEXT: ) ;; end func $f0{{$}} +define void @f0() { + ret void +} + +; CHECK-LABEL: (func $f1{{$}} +; CHECK-NEXT: (result i32){{$}} +; CHECK-NEXT: (setlocal @0 (immediate 0)){{$}} +; CHECK-NEXT: (return @0){{$}} +; CHECK-NEXT: ) ;; end func $f1{{$}} +define i32 @f1() { + ret i32 0 +} + +; CHECK-LABEL: (func $f2{{$}} +; CHECK-NEXT: (param i32) (param f32) (result i32){{$}} +; CHECK-NEXT: (setlocal @0 (immediate 0)){{$}} +; CHECK-NEXT: (return @0){{$}} +; CHECK-NEXT: ) ;; end func $f2{{$}} +define i32 @f2(i32 %p1, float %p2) { + ret i32 0 +} + +; CHECK-LABEL: (func $f3{{$}} +; CHECK-NEXT: (param i32) (param f32){{$}} +; CHECK-NEXT: (return){{$}} +; CHECK-NEXT: ) ;; end func $f3{{$}} +define void @f3(i32 %p1, float %p2) { + ret void +} diff --git a/test/CodeGen/WebAssembly/globl.ll b/test/CodeGen/WebAssembly/globl.ll index 571f793e3b7..8d8218f4842 100644 --- a/test/CodeGen/WebAssembly/globl.ll +++ b/test/CodeGen/WebAssembly/globl.ll @@ -8,7 +8,7 @@ target triple = "wasm32-unknown-unknown" ; CHECK-NOT: globl ; CHECK: ;; .globl foo ; CHECK-NOT: globl -; CHECK-LABEL: foo: +; CHECK-LABEL: (func $foo define void @foo() { ret void } diff --git a/test/CodeGen/WebAssembly/immediates.ll b/test/CodeGen/WebAssembly/immediates.ll index 35c26450ca9..5ac19c46155 100644 --- a/test/CodeGen/WebAssembly/immediates.ll +++ b/test/CodeGen/WebAssembly/immediates.ll @@ -5,168 +5,192 @@ target datalayout = "e-p:32:32-i64:64-n32:64-S128" target triple = "wasm32-unknown-unknown" -; CHECK-LABEL: zero_i32: +; CHECK-LABEL: (func $zero_i32 +; CHECK-NEXT: (result i32) ; CHECK-NEXT: (setlocal @0 (immediate 0)) ; CHECK-NEXT: (return @0) define i32 @zero_i32() { ret i32 0 } -; CHECK-LABEL: one_i32: +; CHECK-LABEL: (func $one_i32 +; CHECK-NEXT: (result i32) ; CHECK-NEXT: (setlocal @0 (immediate 1)) ; CHECK-NEXT: (return @0) define i32 @one_i32() { ret i32 1 } -; CHECK-LABEL: max_i32: +; CHECK-LABEL: (func $max_i32 +; CHECK-NEXT: (result i32) ; CHECK-NEXT: (setlocal @0 (immediate 2147483647)) ; CHECK-NEXT: (return @0) define i32 @max_i32() { ret i32 2147483647 } -; CHECK-LABEL: min_i32: +; CHECK-LABEL: (func $min_i32 +; CHECK-NEXT: (result i32) ; CHECK-NEXT: (setlocal @0 (immediate -2147483648)) ; CHECK-NEXT: (return @0) define i32 @min_i32() { ret i32 -2147483648 } -; CHECK-LABEL: zero_i64: +; CHECK-LABEL: (func $zero_i64 +; CHECK-NEXT: (result i64) ; CHECK-NEXT: (setlocal @0 (immediate 0)) ; CHECK-NEXT: (return @0) define i64 @zero_i64() { ret i64 0 } -; CHECK-LABEL: one_i64: +; CHECK-LABEL: (func $one_i64 +; CHECK-NEXT: (result i64) ; CHECK-NEXT: (setlocal @0 (immediate 1)) ; CHECK-NEXT: (return @0) define i64 @one_i64() { ret i64 1 } -; CHECK-LABEL: max_i64: +; CHECK-LABEL: (func $max_i64 +; CHECK-NEXT: (result i64) ; CHECK-NEXT: (setlocal @0 (immediate 9223372036854775807)) ; CHECK-NEXT: (return @0) define i64 @max_i64() { ret i64 9223372036854775807 } -; CHECK-LABEL: min_i64: +; CHECK-LABEL: (func $min_i64 +; CHECK-NEXT: (result i64) ; CHECK-NEXT: (setlocal @0 (immediate -9223372036854775808)) ; CHECK-NEXT: (return @0) define i64 @min_i64() { ret i64 -9223372036854775808 } -; CHECK-LABEL: negzero_f32: +; CHECK-LABEL: (func $negzero_f32 +; CHECK-NEXT: (result f32) ; CHECK-NEXT: (setlocal @0 (immediate -0x0p0)) ; CHECK-NEXT: (return @0) define float @negzero_f32() { ret float -0.0 } -; CHECK-LABEL: zero_f32: +; CHECK-LABEL: (func $zero_f32 +; CHECK-NEXT: (result f32) ; CHECK-NEXT: (setlocal @0 (immediate 0x0p0)) ; CHECK-NEXT: (return @0) define float @zero_f32() { ret float 0.0 } -; CHECK-LABEL: one_f32: +; CHECK-LABEL: (func $one_f32 +; CHECK-NEXT: (result f32) ; CHECK-NEXT: (setlocal @0 (immediate 0x1p0)) ; CHECK-NEXT: (return @0) define float @one_f32() { ret float 1.0 } -; CHECK-LABEL: two_f32: +; CHECK-LABEL: (func $two_f32 +; CHECK-NEXT: (result f32) ; CHECK-NEXT: (setlocal @0 (immediate 0x1p1)) ; CHECK-NEXT: (return @0) define float @two_f32() { ret float 2.0 } -; CHECK-LABEL: nan_f32: +; CHECK-LABEL: (func $nan_f32 +; CHECK-NEXT: (result f32) ; CHECK-NEXT: (setlocal @0 (immediate nan)) ; CHECK-NEXT: (return @0) define float @nan_f32() { ret float 0x7FF8000000000000 } -; CHECK-LABEL: negnan_f32: +; CHECK-LABEL: (func $negnan_f32 +; CHECK-NEXT: (result f32) ; CHECK-NEXT: (setlocal @0 (immediate -nan)) ; CHECK-NEXT: (return @0) define float @negnan_f32() { ret float 0xFFF8000000000000 } -; CHECK-LABEL: inf_f32: +; CHECK-LABEL: (func $inf_f32 +; CHECK-NEXT: (result f32) ; CHECK-NEXT: (setlocal @0 (immediate infinity)) ; CHECK-NEXT: (return @0) define float @inf_f32() { ret float 0x7FF0000000000000 } -; CHECK-LABEL: neginf_f32: +; CHECK-LABEL: (func $neginf_f32 +; CHECK-NEXT: (result f32) ; CHECK-NEXT: (setlocal @0 (immediate -infinity)) ; CHECK-NEXT: (return @0) define float @neginf_f32() { ret float 0xFFF0000000000000 } -; CHECK-LABEL: negzero_f64: +; CHECK-LABEL: (func $negzero_f64 +; CHECK-NEXT: (result f64) ; CHECK-NEXT: (setlocal @0 (immediate -0x0p0)) ; CHECK-NEXT: (return @0) define double @negzero_f64() { ret double -0.0 } -; CHECK-LABEL: zero_f64: +; CHECK-LABEL: (func $zero_f64 +; CHECK-NEXT: (result f64) ; CHECK-NEXT: (setlocal @0 (immediate 0x0p0)) ; CHECK-NEXT: (return @0) define double @zero_f64() { ret double 0.0 } -; CHECK-LABEL: one_f64: +; CHECK-LABEL: (func $one_f64 +; CHECK-NEXT: (result f64) ; CHECK-NEXT: (setlocal @0 (immediate 0x1p0)) ; CHECK-NEXT: (return @0) define double @one_f64() { ret double 1.0 } -; CHECK-LABEL: two_f64: +; CHECK-LABEL: (func $two_f64 +; CHECK-NEXT: (result f64) ; CHECK-NEXT: (setlocal @0 (immediate 0x1p1)) ; CHECK-NEXT: (return @0) define double @two_f64() { ret double 2.0 } -; CHECK-LABEL: nan_f64: +; CHECK-LABEL: (func $nan_f64 +; CHECK-NEXT: (result f64) ; CHECK-NEXT: (setlocal @0 (immediate nan)) ; CHECK-NEXT: (return @0) define double @nan_f64() { ret double 0x7FF8000000000000 } -; CHECK-LABEL: negnan_f64: +; CHECK-LABEL: (func $negnan_f64 +; CHECK-NEXT: (result f64) ; CHECK-NEXT: (setlocal @0 (immediate -nan)) ; CHECK-NEXT: (return @0) define double @negnan_f64() { ret double 0xFFF8000000000000 } -; CHECK-LABEL: inf_f64: +; CHECK-LABEL: (func $inf_f64 +; CHECK-NEXT: (result f64) ; CHECK-NEXT: (setlocal @0 (immediate infinity)) ; CHECK-NEXT: (return @0) define double @inf_f64() { ret double 0x7FF0000000000000 } -; CHECK-LABEL: neginf_f64: +; CHECK-LABEL: (func $neginf_f64 +; CHECK-NEXT: (result f64) ; CHECK-NEXT: (setlocal @0 (immediate -infinity)) ; CHECK-NEXT: (return @0) define double @neginf_f64() { diff --git a/test/CodeGen/WebAssembly/integer32.ll b/test/CodeGen/WebAssembly/integer32.ll index ab2d0b9497c..5051d0db30e 100644 --- a/test/CodeGen/WebAssembly/integer32.ll +++ b/test/CodeGen/WebAssembly/integer32.ll @@ -9,7 +9,8 @@ declare i32 @llvm.ctlz.i32(i32, i1) declare i32 @llvm.cttz.i32(i32, i1) declare i32 @llvm.ctpop.i32(i32) -; CHECK-LABEL: add32: +; CHECK-LABEL: (func $add32 +; CHECK-NEXT: (param i32) (param i32) (result i32) ; CHECK-NEXT: (setlocal @0 (argument 1)) ; CHECK-NEXT: (setlocal @1 (argument 0)) ; CHECK-NEXT: (setlocal @2 (add @1 @0)) @@ -19,7 +20,8 @@ define i32 @add32(i32 %x, i32 %y) { ret i32 %a } -; CHECK-LABEL: sub32: +; CHECK-LABEL: (func $sub32 +; CHECK-NEXT: (param i32) (param i32) (result i32) ; CHECK-NEXT: (setlocal @0 (argument 1)) ; CHECK-NEXT: (setlocal @1 (argument 0)) ; CHECK-NEXT: (setlocal @2 (sub @1 @0)) @@ -29,7 +31,8 @@ define i32 @sub32(i32 %x, i32 %y) { ret i32 %a } -; CHECK-LABEL: mul32: +; CHECK-LABEL: (func $mul32 +; CHECK-NEXT: (param i32) (param i32) (result i32) ; CHECK-NEXT: (setlocal @0 (argument 1)) ; CHECK-NEXT: (setlocal @1 (argument 0)) ; CHECK-NEXT: (setlocal @2 (mul @1 @0)) @@ -39,7 +42,8 @@ define i32 @mul32(i32 %x, i32 %y) { ret i32 %a } -; CHECK-LABEL: sdiv32: +; CHECK-LABEL: (func $sdiv32 +; CHECK-NEXT: (param i32) (param i32) (result i32) ; CHECK-NEXT: (setlocal @0 (argument 1)) ; CHECK-NEXT: (setlocal @1 (argument 0)) ; CHECK-NEXT: (setlocal @2 (sdiv @1 @0)) @@ -49,7 +53,8 @@ define i32 @sdiv32(i32 %x, i32 %y) { ret i32 %a } -; CHECK-LABEL: udiv32: +; CHECK-LABEL: (func $udiv32 +; CHECK-NEXT: (param i32) (param i32) (result i32) ; CHECK-NEXT: (setlocal @0 (argument 1)) ; CHECK-NEXT: (setlocal @1 (argument 0)) ; CHECK-NEXT: (setlocal @2 (udiv @1 @0)) @@ -59,7 +64,8 @@ define i32 @udiv32(i32 %x, i32 %y) { ret i32 %a } -; CHECK-LABEL: srem32: +; CHECK-LABEL: (func $srem32 +; CHECK-NEXT: (param i32) (param i32) (result i32) ; CHECK-NEXT: (setlocal @0 (argument 1)) ; CHECK-NEXT: (setlocal @1 (argument 0)) ; CHECK-NEXT: (setlocal @2 (srem @1 @0)) @@ -69,7 +75,8 @@ define i32 @srem32(i32 %x, i32 %y) { ret i32 %a } -; CHECK-LABEL: urem32: +; CHECK-LABEL: (func $urem32 +; CHECK-NEXT: (param i32) (param i32) (result i32) ; CHECK-NEXT: (setlocal @0 (argument 1)) ; CHECK-NEXT: (setlocal @1 (argument 0)) ; CHECK-NEXT: (setlocal @2 (urem @1 @0)) @@ -79,7 +86,8 @@ define i32 @urem32(i32 %x, i32 %y) { ret i32 %a } -; CHECK-LABEL: and32: +; CHECK-LABEL: (func $and32 +; CHECK-NEXT: (param i32) (param i32) (result i32) ; CHECK-NEXT: (setlocal @0 (argument 1)) ; CHECK-NEXT: (setlocal @1 (argument 0)) ; CHECK-NEXT: (setlocal @2 (and @1 @0)) @@ -89,7 +97,8 @@ define i32 @and32(i32 %x, i32 %y) { ret i32 %a } -; CHECK-LABEL: ior32: +; CHECK-LABEL: (func $ior32 +; CHECK-NEXT: (param i32) (param i32) (result i32) ; CHECK-NEXT: (setlocal @0 (argument 1)) ; CHECK-NEXT: (setlocal @1 (argument 0)) ; CHECK-NEXT: (setlocal @2 (ior @1 @0)) @@ -99,7 +108,8 @@ define i32 @ior32(i32 %x, i32 %y) { ret i32 %a } -; CHECK-LABEL: xor32: +; CHECK-LABEL: (func $xor32 +; CHECK-NEXT: (param i32) (param i32) (result i32) ; CHECK-NEXT: (setlocal @0 (argument 1)) ; CHECK-NEXT: (setlocal @1 (argument 0)) ; CHECK-NEXT: (setlocal @2 (xor @1 @0)) @@ -109,7 +119,8 @@ define i32 @xor32(i32 %x, i32 %y) { ret i32 %a } -; CHECK-LABEL: shl32: +; CHECK-LABEL: (func $shl32 +; CHECK-NEXT: (param i32) (param i32) (result i32) ; CHECK-NEXT: (setlocal @0 (argument 1)) ; CHECK-NEXT: (setlocal @1 (argument 0)) ; CHECK-NEXT: (setlocal @2 (shl @1 @0)) @@ -119,7 +130,8 @@ define i32 @shl32(i32 %x, i32 %y) { ret i32 %a } -; CHECK-LABEL: shr32: +; CHECK-LABEL: (func $shr32 +; CHECK-NEXT: (param i32) (param i32) (result i32) ; CHECK-NEXT: (setlocal @0 (argument 1)) ; CHECK-NEXT: (setlocal @1 (argument 0)) ; CHECK-NEXT: (setlocal @2 (shr @1 @0)) @@ -129,7 +141,8 @@ define i32 @shr32(i32 %x, i32 %y) { ret i32 %a } -; CHECK-LABEL: sar32: +; CHECK-LABEL: (func $sar32 +; CHECK-NEXT: (param i32) (param i32) (result i32) ; CHECK-NEXT: (setlocal @0 (argument 1)) ; CHECK-NEXT: (setlocal @1 (argument 0)) ; CHECK-NEXT: (setlocal @2 (sar @1 @0)) @@ -139,7 +152,8 @@ define i32 @sar32(i32 %x, i32 %y) { ret i32 %a } -; CHECK-LABEL: clz32: +; CHECK-LABEL: (func $clz32 +; CHECK-NEXT: (param i32) (result i32) ; CHECK-NEXT: (setlocal @0 (argument 0)) ; CHECK-NEXT: (setlocal @1 (clz @0)) ; CHECK-NEXT: (return @1) @@ -148,7 +162,8 @@ define i32 @clz32(i32 %x) { ret i32 %a } -; CHECK-LABEL: clz32_zero_undef: +; CHECK-LABEL: (func $clz32_zero_undef +; CHECK-NEXT: (param i32) (result i32) ; CHECK-NEXT: (setlocal @0 (argument 0)) ; CHECK-NEXT: (setlocal @1 (clz @0)) ; CHECK-NEXT: (return @1) @@ -157,7 +172,8 @@ define i32 @clz32_zero_undef(i32 %x) { ret i32 %a } -; CHECK-LABEL: ctz32: +; CHECK-LABEL: (func $ctz32 +; CHECK-NEXT: (param i32) (result i32) ; CHECK-NEXT: (setlocal @0 (argument 0)) ; CHECK-NEXT: (setlocal @1 (ctz @0)) ; CHECK-NEXT: (return @1) @@ -166,7 +182,8 @@ define i32 @ctz32(i32 %x) { ret i32 %a } -; CHECK-LABEL: ctz32_zero_undef: +; CHECK-LABEL: (func $ctz32_zero_undef +; CHECK-NEXT: (param i32) (result i32) ; CHECK-NEXT: (setlocal @0 (argument 0)) ; CHECK-NEXT: (setlocal @1 (ctz @0)) ; CHECK-NEXT: (return @1) @@ -175,7 +192,8 @@ define i32 @ctz32_zero_undef(i32 %x) { ret i32 %a } -; CHECK-LABEL: popcnt32: +; CHECK-LABEL: (func $popcnt32 +; CHECK-NEXT: (param i32) (result i32) ; CHECK-NEXT: (setlocal @0 (argument 0)) ; CHECK-NEXT: (setlocal @1 (popcnt @0)) ; CHECK-NEXT: (return @1) diff --git a/test/CodeGen/WebAssembly/integer64.ll b/test/CodeGen/WebAssembly/integer64.ll index f902bced9d9..ee971082c13 100644 --- a/test/CodeGen/WebAssembly/integer64.ll +++ b/test/CodeGen/WebAssembly/integer64.ll @@ -9,7 +9,8 @@ declare i64 @llvm.ctlz.i64(i64, i1) declare i64 @llvm.cttz.i64(i64, i1) declare i64 @llvm.ctpop.i64(i64) -; CHECK-LABEL: add64: +; CHECK-LABEL: (func $add64 +; CHECK-NEXT: (param i64) (param i64) (result i64) ; CHECK-NEXT: (setlocal @0 (argument 1)) ; CHECK-NEXT: (setlocal @1 (argument 0)) ; CHECK-NEXT: (setlocal @2 (add @1 @0)) @@ -19,7 +20,8 @@ define i64 @add64(i64 %x, i64 %y) { ret i64 %a } -; CHECK-LABEL: sub64: +; CHECK-LABEL: (func $sub64 +; CHECK-NEXT: (param i64) (param i64) (result i64) ; CHECK-NEXT: (setlocal @0 (argument 1)) ; CHECK-NEXT: (setlocal @1 (argument 0)) ; CHECK-NEXT: (setlocal @2 (sub @1 @0)) @@ -29,7 +31,8 @@ define i64 @sub64(i64 %x, i64 %y) { ret i64 %a } -; CHECK-LABEL: mul64: +; CHECK-LABEL: (func $mul64 +; CHECK-NEXT: (param i64) (param i64) (result i64) ; CHECK-NEXT: (setlocal @0 (argument 1)) ; CHECK-NEXT: (setlocal @1 (argument 0)) ; CHECK-NEXT: (setlocal @2 (mul @1 @0)) @@ -39,7 +42,8 @@ define i64 @mul64(i64 %x, i64 %y) { ret i64 %a } -; CHECK-LABEL: sdiv64: +; CHECK-LABEL: (func $sdiv64 +; CHECK-NEXT: (param i64) (param i64) (result i64) ; CHECK-NEXT: (setlocal @0 (argument 1)) ; CHECK-NEXT: (setlocal @1 (argument 0)) ; CHECK-NEXT: (setlocal @2 (sdiv @1 @0)) @@ -49,7 +53,8 @@ define i64 @sdiv64(i64 %x, i64 %y) { ret i64 %a } -; CHECK-LABEL: udiv64: +; CHECK-LABEL: (func $udiv64 +; CHECK-NEXT: (param i64) (param i64) (result i64) ; CHECK-NEXT: (setlocal @0 (argument 1)) ; CHECK-NEXT: (setlocal @1 (argument 0)) ; CHECK-NEXT: (setlocal @2 (udiv @1 @0)) @@ -59,7 +64,8 @@ define i64 @udiv64(i64 %x, i64 %y) { ret i64 %a } -; CHECK-LABEL: srem64: +; CHECK-LABEL: (func $srem64 +; CHECK-NEXT: (param i64) (param i64) (result i64) ; CHECK-NEXT: (setlocal @0 (argument 1)) ; CHECK-NEXT: (setlocal @1 (argument 0)) ; CHECK-NEXT: (setlocal @2 (srem @1 @0)) @@ -69,7 +75,8 @@ define i64 @srem64(i64 %x, i64 %y) { ret i64 %a } -; CHECK-LABEL: urem64: +; CHECK-LABEL: (func $urem64 +; CHECK-NEXT: (param i64) (param i64) (result i64) ; CHECK-NEXT: (setlocal @0 (argument 1)) ; CHECK-NEXT: (setlocal @1 (argument 0)) ; CHECK-NEXT: (setlocal @2 (urem @1 @0)) @@ -79,7 +86,8 @@ define i64 @urem64(i64 %x, i64 %y) { ret i64 %a } -; CHECK-LABEL: and64: +; CHECK-LABEL: (func $and64 +; CHECK-NEXT: (param i64) (param i64) (result i64) ; CHECK-NEXT: (setlocal @0 (argument 1)) ; CHECK-NEXT: (setlocal @1 (argument 0)) ; CHECK-NEXT: (setlocal @2 (and @1 @0)) @@ -89,7 +97,8 @@ define i64 @and64(i64 %x, i64 %y) { ret i64 %a } -; CHECK-LABEL: ior64: +; CHECK-LABEL: (func $ior64 +; CHECK-NEXT: (param i64) (param i64) (result i64) ; CHECK-NEXT: (setlocal @0 (argument 1)) ; CHECK-NEXT: (setlocal @1 (argument 0)) ; CHECK-NEXT: (setlocal @2 (ior @1 @0)) @@ -99,7 +108,8 @@ define i64 @ior64(i64 %x, i64 %y) { ret i64 %a } -; CHECK-LABEL: xor64: +; CHECK-LABEL: (func $xor64 +; CHECK-NEXT: (param i64) (param i64) (result i64) ; CHECK-NEXT: (setlocal @0 (argument 1)) ; CHECK-NEXT: (setlocal @1 (argument 0)) ; CHECK-NEXT: (setlocal @2 (xor @1 @0)) @@ -109,7 +119,8 @@ define i64 @xor64(i64 %x, i64 %y) { ret i64 %a } -; CHECK-LABEL: shl64: +; CHECK-LABEL: (func $shl64 +; CHECK-NEXT: (param i64) (param i64) (result i64) ; CHECK-NEXT: (setlocal @0 (argument 1)) ; CHECK-NEXT: (setlocal @1 (argument 0)) ; CHECK-NEXT: (setlocal @2 (shl @1 @0)) @@ -119,7 +130,8 @@ define i64 @shl64(i64 %x, i64 %y) { ret i64 %a } -; CHECK-LABEL: shr64: +; CHECK-LABEL: (func $shr64 +; CHECK-NEXT: (param i64) (param i64) (result i64) ; CHECK-NEXT: (setlocal @0 (argument 1)) ; CHECK-NEXT: (setlocal @1 (argument 0)) ; CHECK-NEXT: (setlocal @2 (shr @1 @0)) @@ -129,7 +141,8 @@ define i64 @shr64(i64 %x, i64 %y) { ret i64 %a } -; CHECK-LABEL: sar64: +; CHECK-LABEL: (func $sar64 +; CHECK-NEXT: (param i64) (param i64) (result i64) ; CHECK-NEXT: (setlocal @0 (argument 1)) ; CHECK-NEXT: (setlocal @1 (argument 0)) ; CHECK-NEXT: (setlocal @2 (sar @1 @0)) @@ -139,7 +152,8 @@ define i64 @sar64(i64 %x, i64 %y) { ret i64 %a } -; CHECK-LABEL: clz64: +; CHECK-LABEL: (func $clz64 +; CHECK-NEXT: (param i64) (result i64) ; CHECK-NEXT: (setlocal @0 (argument 0)) ; CHECK-NEXT: (setlocal @1 (clz @0)) ; CHECK-NEXT: (return @1) @@ -148,7 +162,8 @@ define i64 @clz64(i64 %x) { ret i64 %a } -; CHECK-LABEL: clz64_zero_undef: +; CHECK-LABEL: (func $clz64_zero_undef +; CHECK-NEXT: (param i64) (result i64) ; CHECK-NEXT: (setlocal @0 (argument 0)) ; CHECK-NEXT: (setlocal @1 (clz @0)) ; CHECK-NEXT: (return @1) @@ -157,7 +172,8 @@ define i64 @clz64_zero_undef(i64 %x) { ret i64 %a } -; CHECK-LABEL: ctz64: +; CHECK-LABEL: (func $ctz64 +; CHECK-NEXT: (param i64) (result i64) ; CHECK-NEXT: (setlocal @0 (argument 0)) ; CHECK-NEXT: (setlocal @1 (ctz @0)) ; CHECK-NEXT: (return @1) @@ -166,7 +182,8 @@ define i64 @ctz64(i64 %x) { ret i64 %a } -; CHECK-LABEL: ctz64_zero_undef: +; CHECK-LABEL: (func $ctz64_zero_undef +; CHECK-NEXT: (param i64) (result i64) ; CHECK-NEXT: (setlocal @0 (argument 0)) ; CHECK-NEXT: (setlocal @1 (ctz @0)) ; CHECK-NEXT: (return @1) @@ -175,7 +192,8 @@ define i64 @ctz64_zero_undef(i64 %x) { ret i64 %a } -; CHECK-LABEL: popcnt64: +; CHECK-LABEL: (func $popcnt64 +; CHECK-NEXT: (param i64) (result i64) ; CHECK-NEXT: (setlocal @0 (argument 0)) ; CHECK-NEXT: (setlocal @1 (popcnt @0)) ; CHECK-NEXT: (return @1) diff --git a/test/CodeGen/WebAssembly/memory-addr32.ll b/test/CodeGen/WebAssembly/memory-addr32.ll index b2816089ea8..63297a30135 100644 --- a/test/CodeGen/WebAssembly/memory-addr32.ll +++ b/test/CodeGen/WebAssembly/memory-addr32.ll @@ -7,7 +7,8 @@ target triple = "wasm32-unknown-unknown" declare i32 @llvm.wasm.page.size.i32() nounwind readnone -; CHECK-LABEL: page_size: +; CHECK-LABEL: (func $page_size +; CHECK-NEXT: (result i32) ; CHECK-NEXT: (setlocal @0 (page_size)) ; CHECK-NEXT: (return @0) define i32 @page_size() { diff --git a/test/CodeGen/WebAssembly/memory-addr64.ll b/test/CodeGen/WebAssembly/memory-addr64.ll index c726a2ccad8..4395d9c3740 100644 --- a/test/CodeGen/WebAssembly/memory-addr64.ll +++ b/test/CodeGen/WebAssembly/memory-addr64.ll @@ -7,7 +7,8 @@ target triple = "wasm64-unknown-unknown" declare i64 @llvm.wasm.page.size.i64() nounwind readnone -; CHECK-LABEL: page_size: +; CHECK-LABEL: (func $page_size +; CHECK-NEXT: (result i64) ; CHECK-NEXT: (setlocal @0 (page_size)) ; CHECK-NEXT: (return @0) define i64 @page_size() { diff --git a/test/CodeGen/WebAssembly/return-void.ll b/test/CodeGen/WebAssembly/return-void.ll index 2a4eab7619c..27e1935e879 100644 --- a/test/CodeGen/WebAssembly/return-void.ll +++ b/test/CodeGen/WebAssembly/return-void.ll @@ -3,8 +3,8 @@ target datalayout = "e-p:32:32-i64:64-n32:64-S128" target triple = "wasm32-unknown-unknown" -; CHECK-LABEL: return_void: -; CHECK-NEXT: (return) +; CHECK-LABEL: (func $return_void +; CHECK: (return) define void @return_void() { ret void } diff --git a/test/CodeGen/WebAssembly/unused-argument.ll b/test/CodeGen/WebAssembly/unused-argument.ll index 880411f744f..46bbb9b9ace 100644 --- a/test/CodeGen/WebAssembly/unused-argument.ll +++ b/test/CodeGen/WebAssembly/unused-argument.ll @@ -5,14 +5,16 @@ target datalayout = "e-p:32:32-i64:64-n32:64-S128" target triple = "wasm32-unknown-unknown" -; CHECK-LABEL: unused_first: +; CHECK-LABEL: (func $unused_first +; CHECK-NEXT: (param i32) (param i32) (result i32) ; CHECK-NEXT: (setlocal @0 (argument 1)) ; CHECK-NEXT: (return @0) define i32 @unused_first(i32 %x, i32 %y) { ret i32 %y } -; CHECK-LABEL: unused_second: +; CHECK-LABEL: (func $unused_second +; CHECK-NEXT: (param i32) (param i32) (result i32) ; CHECK-NEXT: (setlocal @0 (argument 0)) ; CHECK-NEXT: (return @0) define i32 @unused_second(i32 %x, i32 %y) {