From 175c683f63a4f1c3c06205996a4ce395349cd313 Mon Sep 17 00:00:00 2001 From: JF Bastien Date: Tue, 20 Oct 2015 01:26:54 +0000 Subject: [PATCH] WebAssembly: fix call/return syntax. They are now typeless, unlike other operations. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@250793 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp | 7 ++++++- test/CodeGen/WebAssembly/func.ll | 6 +++--- test/CodeGen/WebAssembly/return-int32.ll | 10 ++++++++++ 3 files changed, 19 insertions(+), 4 deletions(-) create mode 100644 test/CodeGen/WebAssembly/return-int32.ll diff --git a/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp b/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp index fda95a5e6a5..e20ee695e6f 100644 --- a/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp +++ b/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp @@ -105,7 +105,12 @@ static std::string OpcodeName(const WebAssemblyInstrInfo *TII, bool HasType = std::string::npos != Under; std::string::size_type NameEnd = HasType ? Under : Len; std::string Name(&N[0], &N[NameEnd]); - return HasType ? (std::string(&N[NameEnd + 1], &N[Len]) + '.' + Name) : Name; + if (!HasType) + return Name; + for (const char *typelessOpcode : { "return", "call" }) + if (Name == typelessOpcode) + return Name; + return std::string(&N[NameEnd + 1], &N[Len]) + '.' + Name; } static std::string toSymbol(StringRef S) { return ("$" + S).str(); } diff --git a/test/CodeGen/WebAssembly/func.ll b/test/CodeGen/WebAssembly/func.ll index 7d16fd38c8a..cd58496b358 100644 --- a/test/CodeGen/WebAssembly/func.ll +++ b/test/CodeGen/WebAssembly/func.ll @@ -17,7 +17,7 @@ define void @f0() { ; CHECK-NEXT: .local i32{{$}} ; CHECK-NEXT: i32.const 0{{$}} ; CHECK-NEXT: set_local 0, pop{{$}} -; CHECK-NEXT: i32.return (get_local 0){{$}} +; CHECK-NEXT: return (get_local 0){{$}} ; CHECK: .size f1, define i32 @f1() { ret i32 0 @@ -30,7 +30,7 @@ define i32 @f1() { ; CHECK-NEXT: .local i32{{$}} ; CHECK-NEXT: i32.const 0{{$}} ; CHECK-NEXT: set_local 2, pop{{$}} -; CHECK-NEXT: i32.return (get_local 2){{$}} +; CHECK-NEXT: return (get_local 2){{$}} ; CHECK: .size f2, define i32 @f2(i32 %p1, float %p2) { ret i32 0 @@ -40,7 +40,7 @@ define i32 @f2(i32 %p1, float %p2) { ; CHECK-NEXT: .param i32{{$}} ; CHECK-NEXT: .param f32{{$}} ; CHECK-NOT: .local -; CHECK-NEXT: void.return{{$}} +; CHECK-NEXT: return{{$}} ; CHECK: .size f3, define void @f3(i32 %p1, float %p2) { ret void diff --git a/test/CodeGen/WebAssembly/return-int32.ll b/test/CodeGen/WebAssembly/return-int32.ll new file mode 100644 index 00000000000..e0f7957b77e --- /dev/null +++ b/test/CodeGen/WebAssembly/return-int32.ll @@ -0,0 +1,10 @@ +; RUN: llc < %s -asm-verbose=false | FileCheck %s + +target datalayout = "e-p:32:32-i64:64-n32:64-S128" +target triple = "wasm32-unknown-unknown" + +; CHECK-LABEL: return_i32: +; CHECK: return (get_local 1){{$}} +define i32 @return_i32(i32 %p) { + ret i32 %p +} -- 2.34.1