[WebAssembly][NFC] Add test case for functype emission
authorAlex Bradbury <asb@igalia.com>
Mon, 21 Mar 2022 14:03:01 +0000 (14:03 +0000)
committerAlex Bradbury <asb@igalia.com>
Mon, 21 Mar 2022 14:04:32 +0000 (14:04 +0000)
This test aims to demonstrate the WebAssembly backend's behaviour around
emission of the .functype directive. It covers defined and declared
functions as well as libcalls.

It currently fails to emit functypes for all defined functions at the
head of the file, causing issues with the type checker
<https://github.com/llvm/llvm-project/issues/54022>. The patch in
<https://reviews.llvm.org/D122134> is a proposal to fix this issue.

llvm/test/CodeGen/WebAssembly/functype-emission.ll [new file with mode: 0644]

diff --git a/llvm/test/CodeGen/WebAssembly/functype-emission.ll b/llvm/test/CodeGen/WebAssembly/functype-emission.ll
new file mode 100644 (file)
index 0000000..93677dd
--- /dev/null
@@ -0,0 +1,38 @@
+; RUN: llc -mtriple=wasm32 -verify-machineinstrs < %s | FileCheck %s
+
+; Demonstrates that appropriate .functype directives are emitted for defined
+; functions, declared functions, and any libcalls.
+
+; FIXME - functype directives should be emitted for defined functions as well,
+; to ensure they pass the type checker (which requires any .functype to be
+; encountered ahead of a call to that target).
+
+; CHECK: .functype __unordtf2 (i64, i64, i64, i64) -> (i32)
+; CHECK: .functype __multi3 (i32, i64, i64, i64, i64) -> ()
+; CHECK: .functype declared_fun (i32, f32, i64) -> (i32)
+
+define i64 @defined_fun_1(double %a) {
+; CHECK-LABEL: defined_fun_1:
+; CHECK:         .functype defined_fun_1 (f64) -> (i64)
+  %1 = call i64 @defined_fun_2(double %a, i32 1)
+  ret i64 %1
+}
+
+define i64 @defined_fun_2(double %a, i32 %b) {
+; CHECK-LABEL: defined_fun_2:
+; CHECK:         .functype defined_fun_2 (f64, i32) -> (i64)
+  %1 = call i64 @defined_fun_1(double %a)
+  ret i64 %1
+}
+
+declare i8 @declared_fun(i32, float, i64)
+
+define i128 @libcalls(fp128 %a, fp128 %b, i128 %c, i128 %d) {
+; CHECK-LABEL: libcalls:
+; CHECK:         .functype libcalls (i32, i64, i64, i64, i64, i64, i64, i64, i64) -> ()
+ %1 = fcmp uno fp128 %a, %b
+ %2 = zext i1 %1 to i128
+ %3 = mul i128 %c, %d
+ %4 = add i128 %2, %3
+ ret i128 %4
+}