@@ -75,9 +75,7 @@ static bool maybeRewriteToFallthrough(MachineInstr &MI, MachineBasicBlock &MBB,
75
75
const MachineFunction &MF,
76
76
WebAssemblyFunctionInfo &MFI,
77
77
MachineRegisterInfo &MRI,
78
- const WebAssemblyInstrInfo &TII,
79
- unsigned FallthroughOpc,
80
- unsigned CopyLocalOpc) {
78
+ const WebAssemblyInstrInfo &TII) {
81
79
if (DisableWebAssemblyFallthroughReturnOpt)
82
80
return false ;
83
81
if (&MBB != &MF.back ())
@@ -90,22 +88,44 @@ static bool maybeRewriteToFallthrough(MachineInstr &MI, MachineBasicBlock &MBB,
90
88
if (&MI != &*End)
91
89
return false ;
92
90
93
- if (FallthroughOpc != WebAssembly::FALLTHROUGH_RETURN_VOID) {
94
- // If the operand isn't stackified, insert a COPY to read the operand and
95
- // stackify it.
96
- MachineOperand &MO = MI.getOperand (0 );
91
+ for (auto &MO : MI.explicit_operands ()) {
92
+ // If the operand isn't stackified, insert a COPY to read the operands and
93
+ // stackify them.
97
94
Register Reg = MO.getReg ();
98
95
if (!MFI.isVRegStackified (Reg)) {
99
- Register NewReg = MRI.createVirtualRegister (MRI.getRegClass (Reg));
96
+ unsigned CopyLocalOpc;
97
+ const TargetRegisterClass *RegClass = MRI.getRegClass (Reg);
98
+ switch (RegClass->getID ()) {
99
+ case WebAssembly::I32RegClassID:
100
+ CopyLocalOpc = WebAssembly::COPY_I32;
101
+ break ;
102
+ case WebAssembly::I64RegClassID:
103
+ CopyLocalOpc = WebAssembly::COPY_I64;
104
+ break ;
105
+ case WebAssembly::F32RegClassID:
106
+ CopyLocalOpc = WebAssembly::COPY_F32;
107
+ break ;
108
+ case WebAssembly::F64RegClassID:
109
+ CopyLocalOpc = WebAssembly::COPY_F64;
110
+ break ;
111
+ case WebAssembly::V128RegClassID:
112
+ CopyLocalOpc = WebAssembly::COPY_V128;
113
+ break ;
114
+ case WebAssembly::EXNREFRegClassID:
115
+ CopyLocalOpc = WebAssembly::COPY_EXNREF;
116
+ break ;
117
+ default :
118
+ llvm_unreachable (" Unexpected register class for return operand" );
119
+ }
120
+ Register NewReg = MRI.createVirtualRegister (RegClass);
100
121
BuildMI (MBB, MI, MI.getDebugLoc (), TII.get (CopyLocalOpc), NewReg)
101
122
.addReg (Reg);
102
123
MO.setReg (NewReg);
103
124
MFI.stackifyVReg (NewReg);
104
125
}
105
126
}
106
127
107
- // Rewrite the return.
108
- MI.setDesc (TII.get (FallthroughOpc));
128
+ MI.setDesc (TII.get (WebAssembly::FALLTHROUGH_RETURN));
109
129
return true ;
110
130
}
111
131
@@ -157,60 +177,8 @@ bool WebAssemblyPeephole::runOnMachineFunction(MachineFunction &MF) {
157
177
break ;
158
178
}
159
179
// Optimize away an explicit void return at the end of the function.
160
- case WebAssembly::RETURN_I32:
161
- Changed |= maybeRewriteToFallthrough (
162
- MI, MBB, MF, MFI, MRI, TII, WebAssembly::FALLTHROUGH_RETURN_I32,
163
- WebAssembly::COPY_I32);
164
- break ;
165
- case WebAssembly::RETURN_I64:
166
- Changed |= maybeRewriteToFallthrough (
167
- MI, MBB, MF, MFI, MRI, TII, WebAssembly::FALLTHROUGH_RETURN_I64,
168
- WebAssembly::COPY_I64);
169
- break ;
170
- case WebAssembly::RETURN_F32:
171
- Changed |= maybeRewriteToFallthrough (
172
- MI, MBB, MF, MFI, MRI, TII, WebAssembly::FALLTHROUGH_RETURN_F32,
173
- WebAssembly::COPY_F32);
174
- break ;
175
- case WebAssembly::RETURN_F64:
176
- Changed |= maybeRewriteToFallthrough (
177
- MI, MBB, MF, MFI, MRI, TII, WebAssembly::FALLTHROUGH_RETURN_F64,
178
- WebAssembly::COPY_F64);
179
- break ;
180
- case WebAssembly::RETURN_v16i8:
181
- Changed |= maybeRewriteToFallthrough (
182
- MI, MBB, MF, MFI, MRI, TII, WebAssembly::FALLTHROUGH_RETURN_v16i8,
183
- WebAssembly::COPY_V128);
184
- break ;
185
- case WebAssembly::RETURN_v8i16:
186
- Changed |= maybeRewriteToFallthrough (
187
- MI, MBB, MF, MFI, MRI, TII, WebAssembly::FALLTHROUGH_RETURN_v8i16,
188
- WebAssembly::COPY_V128);
189
- break ;
190
- case WebAssembly::RETURN_v4i32:
191
- Changed |= maybeRewriteToFallthrough (
192
- MI, MBB, MF, MFI, MRI, TII, WebAssembly::FALLTHROUGH_RETURN_v4i32,
193
- WebAssembly::COPY_V128);
194
- break ;
195
- case WebAssembly::RETURN_v2i64:
196
- Changed |= maybeRewriteToFallthrough (
197
- MI, MBB, MF, MFI, MRI, TII, WebAssembly::FALLTHROUGH_RETURN_v2i64,
198
- WebAssembly::COPY_V128);
199
- break ;
200
- case WebAssembly::RETURN_v4f32:
201
- Changed |= maybeRewriteToFallthrough (
202
- MI, MBB, MF, MFI, MRI, TII, WebAssembly::FALLTHROUGH_RETURN_v4f32,
203
- WebAssembly::COPY_V128);
204
- break ;
205
- case WebAssembly::RETURN_v2f64:
206
- Changed |= maybeRewriteToFallthrough (
207
- MI, MBB, MF, MFI, MRI, TII, WebAssembly::FALLTHROUGH_RETURN_v2f64,
208
- WebAssembly::COPY_V128);
209
- break ;
210
- case WebAssembly::RETURN_VOID:
211
- Changed |= maybeRewriteToFallthrough (
212
- MI, MBB, MF, MFI, MRI, TII, WebAssembly::FALLTHROUGH_RETURN_VOID,
213
- WebAssembly::INSTRUCTION_LIST_END);
180
+ case WebAssembly::RETURN:
181
+ Changed |= maybeRewriteToFallthrough (MI, MBB, MF, MFI, MRI, TII);
214
182
break ;
215
183
}
216
184
0 commit comments