Skip to content

Commit 058fce5

Browse files
author
Dan Gohman
committed
[WebAssembly] Introduce a new pseudo-operand for unused expression results.
llvm-svn: 252975
1 parent cbc56ba commit 058fce5

File tree

6 files changed

+40
-12
lines changed

6 files changed

+40
-12
lines changed

llvm/lib/Target/WebAssembly/InstPrinter/WebAssemblyInstPrinter.cpp

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
#include "InstPrinter/WebAssemblyInstPrinter.h"
1616
#include "WebAssembly.h"
17+
#include "WebAssemblyMachineFunctionInfo.h"
1718
#include "llvm/MC/MCExpr.h"
1819
#include "llvm/MC/MCInst.h"
1920
#include "llvm/MC/MCInstrInfo.h"
@@ -36,6 +37,7 @@ WebAssemblyInstPrinter::WebAssemblyInstPrinter(const MCAsmInfo &MAI,
3637

3738
void WebAssemblyInstPrinter::printRegName(raw_ostream &OS,
3839
unsigned RegNo) const {
40+
assert(RegNo != WebAssemblyFunctionInfo::UnusedReg);
3941
// FIXME: Revisit whether we actually print the get_local explicitly.
4042
OS << "(get_local " << RegNo << ")";
4143
}
@@ -60,9 +62,14 @@ void WebAssemblyInstPrinter::printInst(const MCInst *MI, raw_ostream &OS,
6062
"Instructions with multiple result values not implemented");
6163

6264
// FIXME: Revisit whether we actually print the set_local explicitly.
63-
if (NumDefs != 0)
64-
OS << "\n"
65-
"\t" "set_local " << MI->getOperand(0).getReg() << ", $pop";
65+
if (NumDefs != 0) {
66+
unsigned WAReg = MI->getOperand(0).getReg();
67+
// Only print the set_local if the register is used.
68+
// TODO: Revisit this once the spec explains what should happen here.
69+
if (WAReg != WebAssemblyFunctionInfo::UnusedReg)
70+
OS << "\n"
71+
"\t" "set_local " << WAReg << ", $pop";
72+
}
6673
}
6774

6875
static std::string toString(const APFloat &FP) {
@@ -86,10 +93,14 @@ void WebAssemblyInstPrinter::printOperand(const MCInst *MI, unsigned OpNo,
8693
raw_ostream &O) {
8794
const MCOperand &Op = MI->getOperand(OpNo);
8895
if (Op.isReg()) {
89-
if (OpNo < MII.get(MI->getOpcode()).getNumDefs())
90-
O << "$push";
91-
else
96+
if (OpNo >= MII.get(MI->getOpcode()).getNumDefs())
9297
printRegName(O, Op.getReg());
98+
else {
99+
if (Op.getReg() != WebAssemblyFunctionInfo::UnusedReg)
100+
O << "$push";
101+
else
102+
O << "$discard";
103+
}
93104
} else if (Op.isImm())
94105
O << Op.getImm();
95106
else if (Op.isFPImm())

llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,9 @@ std::string WebAssemblyAsmPrinter::regToString(const MachineOperand &MO) {
104104
if (TargetRegisterInfo::isPhysicalRegister(RegNo))
105105
return WebAssemblyInstPrinter::getRegisterName(RegNo);
106106

107-
return utostr(MFI->getWAReg(RegNo));
107+
unsigned WAReg = MFI->getWAReg(RegNo);
108+
assert(WAReg != WebAssemblyFunctionInfo::UnusedReg);
109+
return utostr(WAReg);
108110
}
109111

110112
const char *WebAssemblyAsmPrinter::toString(MVT VT) const {

llvm/lib/Target/WebAssembly/WebAssemblyMachineFunctionInfo.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,9 @@
1717
using namespace llvm;
1818

1919
WebAssemblyFunctionInfo::~WebAssemblyFunctionInfo() {}
20+
21+
void WebAssemblyFunctionInfo::initWARegs() {
22+
assert(WARegs.empty());
23+
unsigned Reg = UnusedReg;
24+
WARegs.resize(MF.getRegInfo().getNumVirtRegs(), Reg);
25+
}

llvm/lib/Target/WebAssembly/WebAssemblyMachineFunctionInfo.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,11 @@ class WebAssemblyFunctionInfo final : public MachineFunctionInfo {
4343
void addResult(MVT VT) { Results.push_back(VT); }
4444
const std::vector<MVT> &getResults() const { return Results; }
4545

46-
void initWARegs() {
47-
assert(WARegs.empty());
48-
WARegs.resize(MF.getRegInfo().getNumVirtRegs(), -1u);
49-
}
46+
static const unsigned UnusedReg = -1u;
47+
48+
void initWARegs();
5049
void setWAReg(unsigned VReg, unsigned WAReg) {
50+
assert(WAReg != UnusedReg);
5151
WARegs[TargetRegisterInfo::virtReg2Index(VReg)] = WAReg;
5252
}
5353
unsigned getWAReg(unsigned VReg) const {

llvm/lib/Target/WebAssembly/WebAssemblyRegNumbering.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ bool WebAssemblyRegNumbering::runOnMachineFunction(MachineFunction &MF) {
9090
// Skip unused registers.
9191
if (MRI.use_empty(VReg))
9292
continue;
93-
if (MFI.getWAReg(VReg) == -1u)
93+
if (MFI.getWAReg(VReg) == WebAssemblyFunctionInfo::UnusedReg)
9494
MFI.setWAReg(VReg, NumArgRegs + CurReg++);
9595
}
9696

llvm/test/CodeGen/WebAssembly/unused-argument.ll

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,12 @@ define i32 @unused_first(i32 %x, i32 %y) {
2424
define i32 @unused_second(i32 %x, i32 %y) {
2525
ret i32 %x
2626
}
27+
28+
; CHECK-LABEL: call_something:
29+
; CHECK-NEXT: call return_something, $discard{{$}}
30+
; CHECK-NEXT: return{{$}}
31+
declare i32 @return_something()
32+
define void @call_something() {
33+
call i32 @return_something()
34+
ret void
35+
}

0 commit comments

Comments
 (0)