@@ -140,22 +140,13 @@ class LegalizerWorkListManager : public GISelChangeObserver {
140
140
};
141
141
} // namespace
142
142
143
- bool Legalizer::runOnMachineFunction (MachineFunction &MF) {
144
- // If the ISel pipeline failed, do not bother running that pass.
145
- if (MF.getProperties ().hasProperty (
146
- MachineFunctionProperties::Property::FailedISel))
147
- return false ;
148
- LLVM_DEBUG (dbgs () << " Legalize Machine IR for: " << MF.getName () << ' \n ' );
149
- init (MF);
150
- const TargetPassConfig &TPC = getAnalysis<TargetPassConfig>();
151
- GISelCSEAnalysisWrapper &Wrapper =
152
- getAnalysis<GISelCSEAnalysisWrapperPass>().getCSEWrapper ();
153
- MachineOptimizationRemarkEmitter MORE (MF, /* MBFI=*/ nullptr );
154
-
155
- const size_t NumBlocks = MF.size ();
143
+ Legalizer::MFResult
144
+ Legalizer::legalizeMachineFunction (MachineFunction &MF, const LegalizerInfo &LI,
145
+ ArrayRef<GISelChangeObserver *> AuxObservers,
146
+ MachineIRBuilder &MIRBuilder) {
156
147
MachineRegisterInfo &MRI = MF.getRegInfo ();
157
148
158
- // Populate Insts
149
+ // Populate worklists.
159
150
InstListTy InstList;
160
151
ArtifactListTy ArtifactList;
161
152
ReversePostOrderTraversal<MachineFunction *> RPOT (&MF);
@@ -178,40 +169,23 @@ bool Legalizer::runOnMachineFunction(MachineFunction &MF) {
178
169
}
179
170
ArtifactList.finalize ();
180
171
InstList.finalize ();
181
- std::unique_ptr<MachineIRBuilder> MIRBuilder;
182
- GISelCSEInfo *CSEInfo = nullptr ;
183
- bool EnableCSE = EnableCSEInLegalizer.getNumOccurrences ()
184
- ? EnableCSEInLegalizer
185
- : TPC.isGISelCSEEnabled ();
186
172
187
- if (EnableCSE) {
188
- MIRBuilder = std::make_unique<CSEMIRBuilder>();
189
- CSEInfo = &Wrapper.get (TPC.getCSEConfig ());
190
- MIRBuilder->setCSEInfo (CSEInfo);
191
- } else
192
- MIRBuilder = std::make_unique<MachineIRBuilder>();
193
- // This observer keeps the worklist updated.
173
+ // This observer keeps the worklists updated.
194
174
LegalizerWorkListManager WorkListObserver (InstList, ArtifactList);
195
- // We want both WorkListObserver as well as CSEInfo to observe all changes .
196
- // Use the wrapper observer.
175
+ // We want both WorkListObserver as well as all the auxiliary observers (e.g .
176
+ // CSEInfo) to observe all changes. Use the wrapper observer.
197
177
GISelObserverWrapper WrapperObserver (&WorkListObserver);
198
- if (EnableCSE && CSEInfo)
199
- WrapperObserver.addObserver (CSEInfo);
178
+ for (GISelChangeObserver *Observer : AuxObservers)
179
+ WrapperObserver.addObserver (Observer);
180
+
200
181
// Now install the observer as the delegate to MF.
201
182
// This will keep all the observers notified about new insertions/deletions.
202
183
RAIIDelegateInstaller DelInstall (MF, &WrapperObserver);
203
- LegalizerHelper Helper (MF, WrapperObserver, *MIRBuilder.get ());
204
- const LegalizerInfo &LInfo (Helper.getLegalizerInfo ());
205
- LegalizationArtifactCombiner ArtCombiner (*MIRBuilder.get (), MF.getRegInfo (),
206
- LInfo);
184
+ LegalizerHelper Helper (MF, LI, WrapperObserver, MIRBuilder);
185
+ LegalizationArtifactCombiner ArtCombiner (MIRBuilder, MRI, LI);
207
186
auto RemoveDeadInstFromLists = [&WrapperObserver](MachineInstr *DeadMI) {
208
187
WrapperObserver.erasingInstr (*DeadMI);
209
188
};
210
- auto stopLegalizing = [&](MachineInstr &MI) {
211
- Helper.MIRBuilder .stopObservingChanges ();
212
- reportGISelFailure (MF, TPC, MORE, " gisel-legalize" ,
213
- " unable to legalize instruction" , MI);
214
- };
215
189
bool Changed = false ;
216
190
SmallVector<MachineInstr *, 128 > RetryList;
217
191
do {
@@ -220,7 +194,8 @@ bool Legalizer::runOnMachineFunction(MachineFunction &MF) {
220
194
unsigned NumArtifacts = ArtifactList.size ();
221
195
while (!InstList.empty ()) {
222
196
MachineInstr &MI = *InstList.pop_back_val ();
223
- assert (isPreISelGenericOpcode (MI.getOpcode ()) && " Expecting generic opcode" );
197
+ assert (isPreISelGenericOpcode (MI.getOpcode ()) &&
198
+ " Expecting generic opcode" );
224
199
if (isTriviallyDead (MI, MRI)) {
225
200
LLVM_DEBUG (dbgs () << MI << " Is dead; erasing.\n " );
226
201
MI.eraseFromParentAndMarkDBGValuesForRemoval ();
@@ -240,8 +215,8 @@ bool Legalizer::runOnMachineFunction(MachineFunction &MF) {
240
215
RetryList.push_back (&MI);
241
216
continue ;
242
217
}
243
- stopLegalizing (MI );
244
- return false ;
218
+ Helper. MIRBuilder . stopObservingChanges ( );
219
+ return {Changed, &MI} ;
245
220
}
246
221
WorkListObserver.printNewInstrs ();
247
222
Changed |= Res == LegalizerHelper::Legalized;
@@ -254,14 +229,14 @@ bool Legalizer::runOnMachineFunction(MachineFunction &MF) {
254
229
ArtifactList.insert (RetryList.pop_back_val ());
255
230
} else {
256
231
LLVM_DEBUG (dbgs () << " No new artifacts created, not retrying!\n " );
257
- MachineInstr *MI = *RetryList.begin ();
258
- stopLegalizing (*MI);
259
- return false ;
232
+ Helper.MIRBuilder .stopObservingChanges ();
233
+ return {Changed, RetryList.front ()};
260
234
}
261
235
}
262
236
while (!ArtifactList.empty ()) {
263
237
MachineInstr &MI = *ArtifactList.pop_back_val ();
264
- assert (isPreISelGenericOpcode (MI.getOpcode ()) && " Expecting generic opcode" );
238
+ assert (isPreISelGenericOpcode (MI.getOpcode ()) &&
239
+ " Expecting generic opcode" );
265
240
if (isTriviallyDead (MI, MRI)) {
266
241
LLVM_DEBUG (dbgs () << MI << " Is dead\n " );
267
242
RemoveDeadInstFromLists (&MI);
@@ -291,8 +266,51 @@ bool Legalizer::runOnMachineFunction(MachineFunction &MF) {
291
266
}
292
267
} while (!InstList.empty ());
293
268
269
+ return {Changed, /* FailedOn*/ nullptr };
270
+ }
271
+
272
+ bool Legalizer::runOnMachineFunction (MachineFunction &MF) {
273
+ // If the ISel pipeline failed, do not bother running that pass.
274
+ if (MF.getProperties ().hasProperty (
275
+ MachineFunctionProperties::Property::FailedISel))
276
+ return false ;
277
+ LLVM_DEBUG (dbgs () << " Legalize Machine IR for: " << MF.getName () << ' \n ' );
278
+ init (MF);
279
+ const TargetPassConfig &TPC = getAnalysis<TargetPassConfig>();
280
+ GISelCSEAnalysisWrapper &Wrapper =
281
+ getAnalysis<GISelCSEAnalysisWrapperPass>().getCSEWrapper ();
282
+ MachineOptimizationRemarkEmitter MORE (MF, /* MBFI=*/ nullptr );
283
+
284
+ const size_t NumBlocks = MF.size ();
285
+
286
+ std::unique_ptr<MachineIRBuilder> MIRBuilder;
287
+ GISelCSEInfo *CSEInfo = nullptr ;
288
+ bool EnableCSE = EnableCSEInLegalizer.getNumOccurrences ()
289
+ ? EnableCSEInLegalizer
290
+ : TPC.isGISelCSEEnabled ();
291
+ if (EnableCSE) {
292
+ MIRBuilder = std::make_unique<CSEMIRBuilder>();
293
+ CSEInfo = &Wrapper.get (TPC.getCSEConfig ());
294
+ MIRBuilder->setCSEInfo (CSEInfo);
295
+ } else
296
+ MIRBuilder = std::make_unique<MachineIRBuilder>();
297
+
298
+ SmallVector<GISelChangeObserver *, 1 > AuxObservers;
299
+ if (EnableCSE && CSEInfo) {
300
+ // We want CSEInfo in addition to WorkListObserver to observe all changes.
301
+ AuxObservers.push_back (CSEInfo);
302
+ }
303
+
304
+ const LegalizerInfo &LI = *MF.getSubtarget ().getLegalizerInfo ();
305
+ MFResult Result = legalizeMachineFunction (MF, LI, AuxObservers, *MIRBuilder);
306
+
307
+ if (Result.FailedOn ) {
308
+ reportGISelFailure (MF, TPC, MORE, " gisel-legalize" ,
309
+ " unable to legalize instruction" , *Result.FailedOn );
310
+ return false ;
311
+ }
294
312
// For now don't support if new blocks are inserted - we would need to fix the
295
- // outerloop for that.
313
+ // outer loop for that.
296
314
if (MF.size () != NumBlocks) {
297
315
MachineOptimizationRemarkMissed R (" gisel-legalize" , " GISelFailure" ,
298
316
MF.getFunction ().getSubprogram (),
@@ -301,6 +319,5 @@ bool Legalizer::runOnMachineFunction(MachineFunction &MF) {
301
319
reportGISelFailure (MF, TPC, MORE, R);
302
320
return false ;
303
321
}
304
-
305
- return Changed;
322
+ return Result.Changed ;
306
323
}
0 commit comments