Skip to content

Commit d9661d7

Browse files
committed
[Webassembly][multivalue] update libcall signature when multivalue feature enabled
fixed: #59095 Update libcall signatures to use multivalue return rather than returning via a pointer when the multivalue features is enabled in the WebAssembly backend. Reviewed By: tlively Differential Revision: https://reviews.llvm.org/D146271
1 parent 4fa9dc9 commit d9661d7

File tree

2 files changed

+123
-60
lines changed

2 files changed

+123
-60
lines changed

llvm/lib/Target/WebAssembly/WebAssemblyRuntimeLibcallSignatures.cpp

Lines changed: 60 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -687,101 +687,101 @@ void llvm::getLibcallSignature(const WebAssemblySubtarget &Subtarget,
687687
Params.push_back(PtrTy);
688688
break;
689689
case i64_i64_func_f32:
690-
#if 0 // TODO: Enable this when wasm gets multiple-return-value support.
691-
Rets.push_back(wasm::ValType::I64);
692-
Rets.push_back(wasm::ValType::I64);
693-
#else
694-
Params.push_back(PtrTy);
695-
#endif
690+
if (Subtarget.hasMultivalue()) {
691+
Rets.push_back(wasm::ValType::I64);
692+
Rets.push_back(wasm::ValType::I64);
693+
} else {
694+
Params.push_back(PtrTy);
695+
}
696696
Params.push_back(wasm::ValType::F32);
697697
break;
698698
case i64_i64_func_f64:
699-
#if 0 // TODO: Enable this when wasm gets multiple-return-value support.
700-
Rets.push_back(wasm::ValType::I64);
701-
Rets.push_back(wasm::ValType::I64);
702-
#else
703-
Params.push_back(PtrTy);
704-
#endif
699+
if (Subtarget.hasMultivalue()) {
700+
Rets.push_back(wasm::ValType::I64);
701+
Rets.push_back(wasm::ValType::I64);
702+
} else {
703+
Params.push_back(PtrTy);
704+
}
705705
Params.push_back(wasm::ValType::F64);
706706
break;
707707
case i16_i16_func_i16_i16:
708-
#if 0 // TODO: Enable this when wasm gets multiple-return-value support.
709-
Rets.push_back(wasm::ValType::I32);
710-
Rets.push_back(wasm::ValType::I32);
711-
#else
712-
Params.push_back(PtrTy);
713-
#endif
708+
if (Subtarget.hasMultivalue()) {
709+
Rets.push_back(wasm::ValType::I32);
710+
Rets.push_back(wasm::ValType::I32);
711+
} else {
712+
Params.push_back(PtrTy);
713+
}
714714
Params.push_back(wasm::ValType::I32);
715715
Params.push_back(wasm::ValType::I32);
716716
break;
717717
case i32_i32_func_i32_i32:
718-
#if 0 // TODO: Enable this when wasm gets multiple-return-value support.
719-
Rets.push_back(wasm::ValType::I32);
720-
Rets.push_back(wasm::ValType::I32);
721-
#else
722-
Params.push_back(PtrTy);
723-
#endif
718+
if (Subtarget.hasMultivalue()) {
719+
Rets.push_back(wasm::ValType::I32);
720+
Rets.push_back(wasm::ValType::I32);
721+
} else {
722+
Params.push_back(PtrTy);
723+
}
724724
Params.push_back(wasm::ValType::I32);
725725
Params.push_back(wasm::ValType::I32);
726726
break;
727727
case i64_i64_func_i64_i64:
728-
#if 0 // TODO: Enable this when wasm gets multiple-return-value support.
729-
Rets.push_back(wasm::ValType::I64);
730-
Rets.push_back(wasm::ValType::I64);
731-
#else
732-
Params.push_back(PtrTy);
733-
#endif
728+
if (Subtarget.hasMultivalue()) {
729+
Rets.push_back(wasm::ValType::I64);
730+
Rets.push_back(wasm::ValType::I64);
731+
} else {
732+
Params.push_back(PtrTy);
733+
}
734734
Params.push_back(wasm::ValType::I64);
735735
Params.push_back(wasm::ValType::I64);
736736
break;
737737
case i64_i64_func_i64_i64_i64_i64:
738-
#if 0 // TODO: Enable this when wasm gets multiple-return-value support.
739-
Rets.push_back(wasm::ValType::I64);
740-
Rets.push_back(wasm::ValType::I64);
741-
#else
742-
Params.push_back(PtrTy);
743-
#endif
738+
if (Subtarget.hasMultivalue()) {
739+
Rets.push_back(wasm::ValType::I64);
740+
Rets.push_back(wasm::ValType::I64);
741+
} else {
742+
Params.push_back(PtrTy);
743+
}
744744
Params.push_back(wasm::ValType::I64);
745745
Params.push_back(wasm::ValType::I64);
746746
Params.push_back(wasm::ValType::I64);
747747
Params.push_back(wasm::ValType::I64);
748748
break;
749749
case i64_i64_func_i64_i64_i64_i64_iPTR:
750-
#if 0 // TODO: Enable this when wasm gets multiple-return-value support.
751-
Rets.push_back(wasm::ValType::I64);
752-
Rets.push_back(wasm::ValType::I64);
753-
#else
754-
Params.push_back(PtrTy);
755-
#endif
750+
if (Subtarget.hasMultivalue()) {
751+
Rets.push_back(wasm::ValType::I64);
752+
Rets.push_back(wasm::ValType::I64);
753+
} else {
754+
Params.push_back(PtrTy);
755+
}
756756
Params.push_back(wasm::ValType::I64);
757757
Params.push_back(wasm::ValType::I64);
758758
Params.push_back(wasm::ValType::I64);
759759
Params.push_back(wasm::ValType::I64);
760760
Params.push_back(PtrTy);
761761
break;
762762
case i64_i64_i64_i64_func_i64_i64_i64_i64:
763-
#if 0 // TODO: Enable this when wasm gets multiple-return-value support.
764-
Rets.push_back(wasm::ValType::I64);
765-
Rets.push_back(wasm::ValType::I64);
766-
Rets.push_back(wasm::ValType::I64);
767-
Rets.push_back(wasm::ValType::I64);
768-
#else
769-
Params.push_back(PtrTy);
770-
#endif
763+
if (Subtarget.hasMultivalue()) {
764+
Rets.push_back(wasm::ValType::I64);
765+
Rets.push_back(wasm::ValType::I64);
766+
Rets.push_back(wasm::ValType::I64);
767+
Rets.push_back(wasm::ValType::I64);
768+
} else {
769+
Params.push_back(PtrTy);
770+
}
771771
Params.push_back(wasm::ValType::I64);
772772
Params.push_back(wasm::ValType::I64);
773773
Params.push_back(wasm::ValType::I64);
774774
Params.push_back(wasm::ValType::I64);
775775
break;
776776
case i64_i64_func_i64_i64_i32:
777-
#if 0 // TODO: Enable this when wasm gets multiple-return-value support.
778-
Rets.push_back(wasm::ValType::I64);
779-
Rets.push_back(wasm::ValType::I64);
780-
Rets.push_back(wasm::ValType::I64);
781-
Rets.push_back(wasm::ValType::I64);
782-
#else
783-
Params.push_back(PtrTy);
784-
#endif
777+
if (Subtarget.hasMultivalue()) {
778+
Rets.push_back(wasm::ValType::I64);
779+
Rets.push_back(wasm::ValType::I64);
780+
Rets.push_back(wasm::ValType::I64);
781+
Rets.push_back(wasm::ValType::I64);
782+
} else {
783+
Params.push_back(PtrTy);
784+
}
785785
Params.push_back(wasm::ValType::I64);
786786
Params.push_back(wasm::ValType::I64);
787787
Params.push_back(wasm::ValType::I32);
@@ -904,8 +904,8 @@ void llvm::getLibcallSignature(const WebAssemblySubtarget &Subtarget,
904904
auto Val = Map.find(Name);
905905
#ifndef NDEBUG
906906
if (Val == Map.end()) {
907-
auto message = std::string("unexpected runtime library name: ") +
908-
std::string(Name);
907+
auto message =
908+
std::string("unexpected runtime library name: ") + std::string(Name);
909909
llvm_unreachable(message.c_str());
910910
}
911911
#endif
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
2+
; RUN: llc < %s -verify-machineinstrs -mcpu=mvp -mattr=+multivalue | FileCheck %s --check-prefix=MULTIVALUE
3+
; RUN: llc < %s -verify-machineinstrs -mcpu=mvp | FileCheck %s --check-prefix=NO_MULTIVALUE
4+
5+
; Test libcall signatures when multivalue is enabled and disabled
6+
7+
target triple = "wasm32-unknown-unknown"
8+
9+
@c = global i128 0, align 16
10+
11+
define void @multivalue_sdiv(i128 noundef %a, i128 noundef %b) #0 {
12+
; MULTIVALUE-LABEL: multivalue_sdiv:
13+
; MULTIVALUE: .functype multivalue_sdiv (i64, i64, i64, i64) -> ()
14+
; MULTIVALUE-NEXT: # %bb.0:
15+
; MULTIVALUE-NEXT: local.get 0
16+
; MULTIVALUE-NEXT: local.get 1
17+
; MULTIVALUE-NEXT: local.get 2
18+
; MULTIVALUE-NEXT: local.get 3
19+
; MULTIVALUE-NEXT: call __divti3
20+
; MULTIVALUE-NEXT: local.set 2
21+
; MULTIVALUE-NEXT: local.set 3
22+
; MULTIVALUE-NEXT: i32.const c
23+
; MULTIVALUE-NEXT: local.get 2
24+
; MULTIVALUE-NEXT: i64.store 8
25+
; MULTIVALUE-NEXT: i32.const 0
26+
; MULTIVALUE-NEXT: local.get 3
27+
; MULTIVALUE-NEXT: i64.store c
28+
; MULTIVALUE-NEXT: # fallthrough-return
29+
;
30+
; NO_MULTIVALUE-LABEL: multivalue_sdiv:
31+
; NO_MULTIVALUE: .functype multivalue_sdiv (i64, i64, i64, i64) -> ()
32+
; NO_MULTIVALUE-NEXT: .local i32
33+
; NO_MULTIVALUE-NEXT: # %bb.0:
34+
; NO_MULTIVALUE-NEXT: global.get __stack_pointer
35+
; NO_MULTIVALUE-NEXT: i32.const 16
36+
; NO_MULTIVALUE-NEXT: i32.sub
37+
; NO_MULTIVALUE-NEXT: local.tee 4
38+
; NO_MULTIVALUE-NEXT: global.set __stack_pointer
39+
; NO_MULTIVALUE-NEXT: local.get 4
40+
; NO_MULTIVALUE-NEXT: local.get 0
41+
; NO_MULTIVALUE-NEXT: local.get 1
42+
; NO_MULTIVALUE-NEXT: local.get 2
43+
; NO_MULTIVALUE-NEXT: local.get 3
44+
; NO_MULTIVALUE-NEXT: call __divti3
45+
; NO_MULTIVALUE-NEXT: i32.const c
46+
; NO_MULTIVALUE-NEXT: local.get 4
47+
; NO_MULTIVALUE-NEXT: i32.const 8
48+
; NO_MULTIVALUE-NEXT: i32.add
49+
; NO_MULTIVALUE-NEXT: i64.load 0
50+
; NO_MULTIVALUE-NEXT: i64.store 8
51+
; NO_MULTIVALUE-NEXT: i32.const 0
52+
; NO_MULTIVALUE-NEXT: local.get 4
53+
; NO_MULTIVALUE-NEXT: i64.load 0
54+
; NO_MULTIVALUE-NEXT: i64.store c
55+
; NO_MULTIVALUE-NEXT: local.get 4
56+
; NO_MULTIVALUE-NEXT: i32.const 16
57+
; NO_MULTIVALUE-NEXT: i32.add
58+
; NO_MULTIVALUE-NEXT: global.set __stack_pointer
59+
; NO_MULTIVALUE-NEXT: # fallthrough-return
60+
%div = sdiv i128 %a, %b
61+
store i128 %div, ptr @c, align 16
62+
ret void
63+
}

0 commit comments

Comments
 (0)