mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-27 15:57:30 +00: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:
parent
088fd9a6ad
commit
1d717fab8b
@ -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.
|
||||
|
@ -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) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user