mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
[WebAssembly] Fix Fast ISEL not lowering 64-bit function pointers
Differential Revision: https://reviews.llvm.org/D95410
This commit is contained in:
parent
35efce7942
commit
026d2d3257
@ -881,6 +881,19 @@ bool WebAssemblyFastISel::selectCall(const Instruction *I) {
|
||||
// it as NO_STRIP so as to ensure that the indirect function table makes it
|
||||
// to linked output.
|
||||
Sym->setNoStrip();
|
||||
|
||||
// See if we must truncate the function pointer.
|
||||
// CALL_INDIRECT takes an i32, but in wasm64 we represent function pointers
|
||||
// as 64-bit for uniformity with other pointer types.
|
||||
// See also: WebAssemblyISelLowering.cpp: LowerCallResults
|
||||
if (Subtarget->hasAddr64()) {
|
||||
auto Wrap = BuildMI(*FuncInfo.MBB, std::prev(FuncInfo.InsertPt), DbgLoc,
|
||||
TII.get(WebAssembly::I32_WRAP_I64));
|
||||
unsigned Reg32 = createResultReg(&WebAssembly::I32RegClass);
|
||||
Wrap.addReg(Reg32, RegState::Define);
|
||||
Wrap.addReg(CalleeReg);
|
||||
CalleeReg = Reg32;
|
||||
}
|
||||
}
|
||||
|
||||
for (unsigned ArgReg : Args)
|
||||
|
@ -455,6 +455,7 @@ static MachineBasicBlock *LowerCallResults(MachineInstr &CallResults,
|
||||
// See if we must truncate the function pointer.
|
||||
// CALL_INDIRECT takes an i32, but in wasm64 we represent function pointers
|
||||
// as 64-bit for uniformity with other pointer types.
|
||||
// See also: WebAssemblyFastISel::selectCall
|
||||
if (IsIndirect && MF.getSubtarget<WebAssemblySubtarget>().hasAddr64()) {
|
||||
Register Reg32 =
|
||||
MF.getRegInfo().createVirtualRegister(&WebAssembly::I32RegClass);
|
||||
|
15
test/CodeGen/WebAssembly/fast-isel-call-indirect64.ll
Normal file
15
test/CodeGen/WebAssembly/fast-isel-call-indirect64.ll
Normal file
@ -0,0 +1,15 @@
|
||||
; RUN: llc < %s -fast-isel --mtriple=wasm64 -asm-verbose=false -wasm-keep-registers | FileCheck %s
|
||||
|
||||
target datalayout = "e-m:e-p:64:64-i64:64-n32:64-S128"
|
||||
target triple = "wasm64"
|
||||
|
||||
; Ensure fast isel also lowers function pointers to 32-bit.
|
||||
|
||||
; CHECK: local.get $push[[L0:[0-9]+]]=, 0
|
||||
; CHECK-NEXT: i32.wrap_i64 $push[[L1:[0-9]+]]=, $pop[[L0]]
|
||||
; CHECK-NEXT: call_indirect $pop[[L1]]
|
||||
|
||||
define hidden void @f(void ()* %g) {
|
||||
call void %g()
|
||||
ret void
|
||||
}
|
Loading…
Reference in New Issue
Block a user