GlobalISel: perform multi-step legalization
llvm-svn: 279758
diff --git a/llvm/lib/CodeGen/GlobalISel/MachineLegalizeHelper.cpp b/llvm/lib/CodeGen/GlobalISel/MachineLegalizeHelper.cpp
index c7d30cf..66b7166 100644
--- a/llvm/lib/CodeGen/GlobalISel/MachineLegalizeHelper.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/MachineLegalizeHelper.cpp
@@ -31,8 +31,9 @@
MIRBuilder.setMF(MF);
}
-MachineLegalizeHelper::LegalizeResult MachineLegalizeHelper::legalizeInstr(
- MachineInstr &MI, const MachineLegalizer &Legalizer) {
+MachineLegalizeHelper::LegalizeResult
+MachineLegalizeHelper::legalizeInstrStep(MachineInstr &MI,
+ const MachineLegalizer &Legalizer) {
auto Action = Legalizer.getAction(MI);
switch (std::get<0>(Action)) {
case MachineLegalizer::Legal:
@@ -48,6 +49,30 @@
}
}
+MachineLegalizeHelper::LegalizeResult
+MachineLegalizeHelper::legalizeInstr(MachineInstr &MI,
+ const MachineLegalizer &Legalizer) {
+ std::queue<MachineInstr *> WorkList;
+ MIRBuilder.recordInsertions([&](MachineInstr *MI) { WorkList.push(MI); });
+ WorkList.push(&MI);
+
+ bool Changed = false;
+ LegalizeResult Res;
+ do {
+ Res = legalizeInstrStep(*WorkList.front(), Legalizer);
+ if (Res == UnableToLegalize) {
+ MIRBuilder.stopRecordingInsertions();
+ return UnableToLegalize;
+ }
+ Changed |= Res == Legalized;
+ WorkList.pop();
+ } while (!WorkList.empty());
+
+ MIRBuilder.stopRecordingInsertions();
+
+ return Changed ? Legalized : AlreadyLegal;
+}
+
void MachineLegalizeHelper::extractParts(unsigned Reg, LLT Ty, int NumParts,
SmallVectorImpl<unsigned> &VRegs) {
unsigned Size = Ty.getSizeInBits();