Skip to content

Commit 1a8f429

Browse files
Attempt to make CallLowering floating-point aware (use FPEXT and FPTRUNC instead of integer ANYEXT/TRUNC)
1 parent aadac67 commit 1a8f429

File tree

1 file changed

+22
-7
lines changed

1 file changed

+22
-7
lines changed

llvm/lib/Target/WebAssembly/GISel/WebAssemblyCallLowering.cpp

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#include "llvm/CodeGen/MachineFrameInfo.h"
3030
#include "llvm/CodeGen/MachineInstrBuilder.h"
3131
#include "llvm/CodeGen/MachineMemOperand.h"
32+
#include "llvm/CodeGen/TargetOpcodes.h"
3233
#include "llvm/CodeGenTypes/LowLevelType.h"
3334
#include "llvm/IR/Argument.h"
3435
#include "llvm/IR/DataLayout.h"
@@ -108,9 +109,12 @@ mergeVectorRegsToResultRegs(MachineIRBuilder &B, ArrayRef<Register> DstRegs,
108109
/// typed values to the original IR value. \p OrigRegs contains the destination
109110
/// value registers of type \p LLTy, and \p Regs contains the legalized pieces
110111
/// with type \p PartLLT. This is used for incoming values (physregs to vregs).
112+
113+
// Modified to account for floating-point extends/truncations
111114
static void buildCopyFromRegs(MachineIRBuilder &B, ArrayRef<Register> OrigRegs,
112115
ArrayRef<Register> Regs, LLT LLTy, LLT PartLLT,
113-
const ISD::ArgFlagsTy Flags) {
116+
const ISD::ArgFlagsTy Flags,
117+
bool IsFloatingPoint) {
114118
MachineRegisterInfo &MRI = *B.getMRI();
115119

116120
if (PartLLT == LLTy) {
@@ -153,7 +157,10 @@ static void buildCopyFromRegs(MachineIRBuilder &B, ArrayRef<Register> OrigRegs,
153157
return;
154158
}
155159

156-
B.buildTrunc(OrigRegs[0], SrcReg);
160+
if (IsFloatingPoint)
161+
B.buildFPTrunc(OrigRegs[0], SrcReg);
162+
else
163+
B.buildTrunc(OrigRegs[0], SrcReg);
157164
return;
158165
}
159166

@@ -166,7 +173,11 @@ static void buildCopyFromRegs(MachineIRBuilder &B, ArrayRef<Register> OrigRegs,
166173
B.buildMergeValues(OrigRegs[0], Regs);
167174
else {
168175
auto Widened = B.buildMergeLikeInstr(LLT::scalar(SrcSize), Regs);
169-
B.buildTrunc(OrigRegs[0], Widened);
176+
177+
if (IsFloatingPoint)
178+
B.buildFPTrunc(OrigRegs[0], Widened);
179+
else
180+
B.buildTrunc(OrigRegs[0], Widened);
170181
}
171182

172183
return;
@@ -496,7 +507,9 @@ bool WebAssemblyCallLowering::lowerReturn(MachineIRBuilder &MIRBuilder,
496507
Arg.Regs[Part] = MRI.createGenericVirtualRegister(NewLLT);
497508
}
498509
buildCopyToRegs(MIRBuilder, Arg.Regs, Arg.OrigRegs[0], OrigLLT, NewLLT,
499-
extendOpFromFlags(Arg.Flags[0]));
510+
Arg.Ty->isFloatingPointTy()
511+
? TargetOpcode::G_FPEXT
512+
: extendOpFromFlags(Arg.Flags[0]));
500513
}
501514

502515
for (unsigned Part = 0; Part < NumParts; ++Part) {
@@ -630,7 +643,7 @@ bool WebAssemblyCallLowering::lowerFormalArguments(
630643
Arg.Regs[Part] = MRI.createGenericVirtualRegister(NewLLT);
631644
}
632645
buildCopyFromRegs(MIRBuilder, Arg.OrigRegs, Arg.Regs, OrigLLT, NewLLT,
633-
Arg.Flags[0]);
646+
Arg.Flags[0], Arg.Ty->isFloatingPointTy());
634647
}
635648

636649
for (unsigned Part = 0; Part < NumParts; ++Part) {
@@ -955,7 +968,9 @@ bool WebAssemblyCallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
955968
}
956969

957970
buildCopyToRegs(MIRBuilder, Arg.Regs, Arg.OrigRegs[0], OrigLLT, NewLLT,
958-
extendOpFromFlags(Arg.Flags[0]));
971+
Arg.Ty->isFloatingPointTy()
972+
? TargetOpcode::G_FPEXT
973+
: extendOpFromFlags(Arg.Flags[0]));
959974
}
960975

961976
if (!Arg.Flags[0].isVarArg()) {
@@ -1135,7 +1150,7 @@ bool WebAssemblyCallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
11351150
Ret.Regs[Part] = MRI.createGenericVirtualRegister(NewLLT);
11361151
}
11371152
buildCopyFromRegs(MIRBuilder, Ret.OrigRegs, Ret.Regs, OrigLLT, NewLLT,
1138-
Ret.Flags[0]);
1153+
Ret.Flags[0], Ret.Ty->isFloatingPointTy());
11391154
}
11401155

11411156
for (unsigned Part = 0; Part < NumParts; ++Part) {

0 commit comments

Comments
 (0)