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

GlobalISel: Improve MachineIRBuilder construction

The current relationship between LegalizerHelper and MachineIRBuilder
confuses me, because the LegalizerHelper modifies the MachineIRBuilder
which it does not own. Constructing a LegalizerHelper destroys the
insert point, since the constructor calls setMF, which clears all the
fields. Try to separate these functions, so it's possible to construct
a LegalizerHelper from an existing MachineIRBuilder without losing the
insert point/debug loc.
This commit is contained in:
Matt Arsenault 2020-06-07 21:37:29 -04:00
parent 1f25ea44b1
commit 832e0c0296
3 changed files with 16 additions and 9 deletions

View File

@ -35,23 +35,23 @@ class GISelChangeObserver;
/// to transfer BuilderState between different kinds of MachineIRBuilders.
struct MachineIRBuilderState {
/// MachineFunction under construction.
MachineFunction *MF;
MachineFunction *MF = nullptr;
/// Information used to access the description of the opcodes.
const TargetInstrInfo *TII;
const TargetInstrInfo *TII = nullptr;
/// Information used to verify types are consistent and to create virtual registers.
MachineRegisterInfo *MRI;
MachineRegisterInfo *MRI = nullptr;
/// Debug location to be set to any instruction we create.
DebugLoc DL;
/// \name Fields describing the insertion point.
/// @{
MachineBasicBlock *MBB;
MachineBasicBlock *MBB = nullptr;
MachineBasicBlock::iterator II;
/// @}
GISelChangeObserver *Observer;
GISelChangeObserver *Observer = nullptr;
GISelCSEInfo *CSEInfo;
GISelCSEInfo *CSEInfo = nullptr;
};
class DstOp {
@ -238,8 +238,16 @@ public:
/// Some constructors for easy use.
MachineIRBuilder() = default;
MachineIRBuilder(MachineFunction &MF) { setMF(MF); }
MachineIRBuilder(MachineInstr &MI) : MachineIRBuilder(*MI.getMF()) {
MachineIRBuilder(MachineBasicBlock &MBB, MachineBasicBlock::iterator InsPt) {
setMF(*MBB.getParent());
setInsertPt(MBB, InsPt);
}
MachineIRBuilder(MachineInstr &MI) :
MachineIRBuilder(*MI.getParent(), MI.getIterator()) {
setInstr(MI);
setDebugLoc(MI.getDebugLoc());
}
virtual ~MachineIRBuilder() = default;

View File

@ -169,6 +169,7 @@ Legalizer::legalizeMachineFunction(MachineFunction &MF, const LegalizerInfo &LI,
ArrayRef<GISelChangeObserver *> AuxObservers,
LostDebugLocObserver &LocObserver,
MachineIRBuilder &MIRBuilder) {
MIRBuilder.setMF(MF);
MachineRegisterInfo &MRI = MF.getRegInfo();
// Populate worklists.

View File

@ -87,7 +87,6 @@ LegalizerHelper::LegalizerHelper(MachineFunction &MF,
MachineIRBuilder &Builder)
: MIRBuilder(Builder), MRI(MF.getRegInfo()),
LI(*MF.getSubtarget().getLegalizerInfo()), Observer(Observer) {
MIRBuilder.setMF(MF);
MIRBuilder.setChangeObserver(Observer);
}
@ -95,7 +94,6 @@ LegalizerHelper::LegalizerHelper(MachineFunction &MF, const LegalizerInfo &LI,
GISelChangeObserver &Observer,
MachineIRBuilder &B)
: MIRBuilder(B), MRI(MF.getRegInfo()), LI(LI), Observer(Observer) {
MIRBuilder.setMF(MF);
MIRBuilder.setChangeObserver(Observer);
}
LegalizerHelper::LegalizeResult