1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 11:02:59 +02:00

[globalisel][combine] Split existing rules into a match and apply step

Summary:
The declarative tablegen definitions split rules into match and apply steps.
Prepare for that by doing the same in the C++ implementations. This aids
some of the migration effort while the tablegen version is incomplete.

Reviewers: bogner, volkan, aditya_nandakumar, paquette, aemerson

Reviewed By: aditya_nandakumar

Subscribers: rovka, kristof.beyls, Petar.Avramovic, jdoerfert, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D58150

llvm-svn: 353996
This commit is contained in:
Daniel Sanders 2019-02-14 00:15:28 +00:00
parent 088fd9a6ad
commit 1d717fab8b
2 changed files with 51 additions and 21 deletions

View File

@ -17,6 +17,8 @@
#ifndef LLVM_CODEGEN_GLOBALISEL_COMBINER_HELPER_H
#define LLVM_CODEGEN_GLOBALISEL_COMBINER_HELPER_H
#include "llvm/CodeGen/LowLevelType.h"
namespace llvm {
class GISelChangeObserver;
@ -25,6 +27,12 @@ class MachineRegisterInfo;
class MachineInstr;
class MachineOperand;
struct PreferredTuple {
LLT Ty; // The result type of the extend.
unsigned ExtendOpcode; // G_ANYEXT/G_SEXT/G_ZEXT
MachineInstr *MI;
};
class CombinerHelper {
MachineIRBuilder &Builder;
MachineRegisterInfo &MRI;
@ -44,10 +52,14 @@ public:
/// If \p MI is COPY, try to combine it.
/// Returns true if MI changed.
bool tryCombineCopy(MachineInstr &MI);
bool matchCombineCopy(MachineInstr &MI);
void applyCombineCopy(MachineInstr &MI);
/// If \p MI is extend that consumes the result of a load, try to combine it.
/// Returns true if MI changed.
bool tryCombineExtendingLoads(MachineInstr &MI);
bool matchCombineExtendingLoads(MachineInstr &MI, PreferredTuple &MatchInfo);
void applyCombineExtendingLoads(MachineInstr &MI, PreferredTuple &MatchInfo);
/// Try to transform \p MI by using all of the above
/// combine functions. Returns true if changed.

View File

@ -46,6 +46,13 @@ void CombinerHelper::replaceRegOpWith(MachineRegisterInfo &MRI,
}
bool CombinerHelper::tryCombineCopy(MachineInstr &MI) {
if (matchCombineCopy(MI)) {
applyCombineCopy(MI);
return true;
}
return false;
}
bool CombinerHelper::matchCombineCopy(MachineInstr &MI) {
if (MI.getOpcode() != TargetOpcode::COPY)
return false;
unsigned DstReg = MI.getOperand(0).getReg();
@ -54,20 +61,18 @@ bool CombinerHelper::tryCombineCopy(MachineInstr &MI) {
LLT SrcTy = MRI.getType(SrcReg);
// Simple Copy Propagation.
// a(sx) = COPY b(sx) -> Replace all uses of a with b.
if (DstTy.isValid() && SrcTy.isValid() && DstTy == SrcTy) {
MI.eraseFromParent();
replaceRegWith(MRI, DstReg, SrcReg);
if (DstTy.isValid() && SrcTy.isValid() && DstTy == SrcTy)
return true;
}
return false;
}
void CombinerHelper::applyCombineCopy(MachineInstr &MI) {
unsigned DstReg = MI.getOperand(0).getReg();
unsigned SrcReg = MI.getOperand(1).getReg();
MI.eraseFromParent();
replaceRegWith(MRI, DstReg, SrcReg);
}
namespace {
struct PreferredTuple {
LLT Ty; // The result type of the extend.
unsigned ExtendOpcode; // G_ANYEXT/G_SEXT/G_ZEXT
MachineInstr *MI;
};
/// Select a preference between two uses. CurrentUse is the current preference
/// while *ForCandidate is attributes of the candidate under consideration.
@ -152,16 +157,16 @@ static void InsertInsnsWithoutSideEffectsBeforeUse(
} // end anonymous namespace
bool CombinerHelper::tryCombineExtendingLoads(MachineInstr &MI) {
struct InsertionPoint {
MachineOperand *UseMO;
MachineBasicBlock *InsertIntoBB;
MachineBasicBlock::iterator InsertBefore;
InsertionPoint(MachineOperand *UseMO, MachineBasicBlock *InsertIntoBB,
MachineBasicBlock::iterator InsertBefore)
: UseMO(UseMO), InsertIntoBB(InsertIntoBB), InsertBefore(InsertBefore) {
}
};
PreferredTuple Preferred;
if (matchCombineExtendingLoads(MI, Preferred)) {
applyCombineExtendingLoads(MI, Preferred);
return true;
}
return false;
}
bool CombinerHelper::matchCombineExtendingLoads(MachineInstr &MI,
PreferredTuple &Preferred) {
// We match the loads and follow the uses to the extend instead of matching
// the extends and following the def to the load. This is because the load
// must remain in the same position for correctness (unless we also add code
@ -199,7 +204,7 @@ bool CombinerHelper::tryCombineExtendingLoads(MachineInstr &MI) {
: MI.getOpcode() == TargetOpcode::G_SEXTLOAD
? TargetOpcode::G_SEXT
: TargetOpcode::G_ZEXT;
PreferredTuple Preferred = {LLT(), PreferredOpcode, nullptr};
Preferred = {LLT(), PreferredOpcode, nullptr};
for (auto &UseMI : MRI.use_instructions(LoadValue.getReg())) {
if (UseMI.getOpcode() == TargetOpcode::G_SEXT ||
UseMI.getOpcode() == TargetOpcode::G_ZEXT ||
@ -218,6 +223,20 @@ bool CombinerHelper::tryCombineExtendingLoads(MachineInstr &MI) {
assert(Preferred.Ty != LoadValueTy && "Extending to same type?");
LLVM_DEBUG(dbgs() << "Preferred use is: " << *Preferred.MI);
return true;
}
void CombinerHelper::applyCombineExtendingLoads(MachineInstr &MI,
PreferredTuple &Preferred) {
struct InsertionPoint {
MachineOperand *UseMO;
MachineBasicBlock *InsertIntoBB;
MachineBasicBlock::iterator InsertBefore;
InsertionPoint(MachineOperand *UseMO, MachineBasicBlock *InsertIntoBB,
MachineBasicBlock::iterator InsertBefore)
: UseMO(UseMO), InsertIntoBB(InsertIntoBB), InsertBefore(InsertBefore) {
}
};
// Rewrite the load to the chosen extending load.
unsigned ChosenDstReg = Preferred.MI->getOperand(0).getReg();
@ -232,6 +251,7 @@ bool CombinerHelper::tryCombineExtendingLoads(MachineInstr &MI) {
// Rewrite all the uses to fix up the types.
SmallVector<MachineInstr *, 1> ScheduleForErase;
SmallVector<InsertionPoint, 4> ScheduleForInsert;
auto &LoadValue = MI.getOperand(0);
for (auto &UseMO : MRI.use_operands(LoadValue.getReg())) {
MachineInstr *UseMI = UseMO.getParent();
@ -331,8 +351,6 @@ bool CombinerHelper::tryCombineExtendingLoads(MachineInstr &MI) {
}
MI.getOperand(0).setReg(ChosenDstReg);
Observer.changedInstr(MI);
return true;
}
bool CombinerHelper::tryCombine(MachineInstr &MI) {