Index: llvm/lib/Target/WebAssembly/WebAssemblyExplicitLocals.cpp =================================================================== --- llvm/lib/Target/WebAssembly/WebAssemblyExplicitLocals.cpp +++ llvm/lib/Target/WebAssembly/WebAssemblyExplicitLocals.cpp @@ -266,7 +266,7 @@ BuildMI(MBB, &MI, MI.getDebugLoc(), TII->get(Opc), NewReg) .addImm(LocalId); MI.getOperand(2).setReg(NewReg); - MFI.stackifyVReg(NewReg); + MFI.stackifyVReg(MRI, NewReg); } // Replace the TEE with a LOCAL_TEE. @@ -316,7 +316,7 @@ // yet. Def.setReg(NewReg); Def.setIsDead(false); - MFI.stackifyVReg(NewReg); + MFI.stackifyVReg(MRI, NewReg); Changed = true; } } @@ -368,7 +368,7 @@ BuildMI(MBB, InsertPt, MI.getDebugLoc(), TII->get(Opc), NewReg) .addImm(LocalId); MO.setReg(NewReg); - MFI.stackifyVReg(NewReg); + MFI.stackifyVReg(MRI, NewReg); Changed = true; } Index: llvm/lib/Target/WebAssembly/WebAssemblyLowerBrUnless.cpp =================================================================== --- llvm/lib/Target/WebAssembly/WebAssemblyLowerBrUnless.cpp +++ llvm/lib/Target/WebAssembly/WebAssemblyLowerBrUnless.cpp @@ -191,7 +191,7 @@ Register Tmp = MRI.createVirtualRegister(&WebAssembly::I32RegClass); BuildMI(MBB, MI, MI->getDebugLoc(), TII.get(WebAssembly::EQZ_I32), Tmp) .addReg(Cond); - MFI.stackifyVReg(Tmp); + MFI.stackifyVReg(MRI, Tmp); Cond = Tmp; Inverted = true; } Index: llvm/lib/Target/WebAssembly/WebAssemblyMachineFunctionInfo.h =================================================================== --- llvm/lib/Target/WebAssembly/WebAssemblyMachineFunctionInfo.h +++ llvm/lib/Target/WebAssembly/WebAssemblyMachineFunctionInfo.h @@ -30,8 +30,6 @@ /// This class is derived from MachineFunctionInfo and contains private /// WebAssembly-specific information for each MachineFunction. class WebAssemblyFunctionInfo final : public MachineFunctionInfo { - MachineFunction &MF; - std::vector Params; std::vector Results; std::vector Locals; @@ -66,7 +64,7 @@ bool CFGStackified = false; public: - explicit WebAssemblyFunctionInfo(MachineFunction &MF) : MF(MF) {} + explicit WebAssemblyFunctionInfo(MachineFunction &MF) {} ~WebAssemblyFunctionInfo() override; void initializeBaseYamlFields(const yaml::WebAssemblyFunctionInfo &YamlMFI); @@ -113,8 +111,8 @@ static const unsigned UnusedReg = -1u; - void stackifyVReg(unsigned VReg) { - assert(MF.getRegInfo().getUniqueVRegDef(VReg)); + void stackifyVReg(MachineRegisterInfo &MRI, unsigned VReg) { + assert(MRI.getUniqueVRegDef(VReg)); auto I = Register::virtReg2Index(VReg); if (I >= VRegStackified.size()) VRegStackified.resize(I + 1); @@ -132,7 +130,7 @@ return VRegStackified.test(I); } - void initWARegs(); + void initWARegs(MachineRegisterInfo &MRI); void setWAReg(unsigned VReg, unsigned WAReg) { assert(WAReg != UnusedReg); auto I = Register::virtReg2Index(VReg); Index: llvm/lib/Target/WebAssembly/WebAssemblyMachineFunctionInfo.cpp =================================================================== --- llvm/lib/Target/WebAssembly/WebAssemblyMachineFunctionInfo.cpp +++ llvm/lib/Target/WebAssembly/WebAssemblyMachineFunctionInfo.cpp @@ -21,10 +21,10 @@ WebAssemblyFunctionInfo::~WebAssemblyFunctionInfo() = default; // anchor. -void WebAssemblyFunctionInfo::initWARegs() { +void WebAssemblyFunctionInfo::initWARegs(MachineRegisterInfo &MRI) { assert(WARegs.empty()); unsigned Reg = UnusedReg; - WARegs.resize(MF.getRegInfo().getNumVirtRegs(), Reg); + WARegs.resize(MRI.getNumVirtRegs(), Reg); } void llvm::computeLegalValueVTs(const Function &F, const TargetMachine &TM, Index: llvm/lib/Target/WebAssembly/WebAssemblyPeephole.cpp =================================================================== --- llvm/lib/Target/WebAssembly/WebAssemblyPeephole.cpp +++ llvm/lib/Target/WebAssembly/WebAssemblyPeephole.cpp @@ -66,7 +66,7 @@ Register NewReg = MRI.createVirtualRegister(MRI.getRegClass(OldReg)); MO.setReg(NewReg); MO.setIsDead(); - MFI.stackifyVReg(NewReg); + MFI.stackifyVReg(MRI, NewReg); } return Changed; } @@ -121,7 +121,7 @@ BuildMI(MBB, MI, MI.getDebugLoc(), TII.get(CopyLocalOpc), NewReg) .addReg(Reg); MO.setReg(NewReg); - MFI.stackifyVReg(NewReg); + MFI.stackifyVReg(MRI, NewReg); } } Index: llvm/lib/Target/WebAssembly/WebAssemblyRegNumbering.cpp =================================================================== --- llvm/lib/Target/WebAssembly/WebAssemblyRegNumbering.cpp +++ llvm/lib/Target/WebAssembly/WebAssemblyRegNumbering.cpp @@ -66,7 +66,7 @@ WebAssemblyFunctionInfo &MFI = *MF.getInfo(); MachineRegisterInfo &MRI = MF.getRegInfo(); - MFI.initWARegs(); + MFI.initWARegs(MRI); // WebAssembly argument registers are in the same index space as local // variables. Assign the numbers for them first. Index: llvm/lib/Target/WebAssembly/WebAssemblyRegStackify.cpp =================================================================== --- llvm/lib/Target/WebAssembly/WebAssemblyRegStackify.cpp +++ llvm/lib/Target/WebAssembly/WebAssemblyRegStackify.cpp @@ -530,7 +530,7 @@ if (MRI.hasOneDef(Reg) && MRI.hasOneUse(Reg)) { // No one else is using this register for anything so we can just stackify // it in place. - MFI.stackifyVReg(Reg); + MFI.stackifyVReg(MRI, Reg); } else { // The register may have unrelated uses or defs; create a new register for // just our one def and use so that we can stackify it. @@ -547,7 +547,7 @@ LIS.getInstructionIndex(*Op.getParent()).getRegSlot(), /*RemoveDeadValNo=*/true); - MFI.stackifyVReg(NewReg); + MFI.stackifyVReg(MRI, NewReg); DefDIs.updateReg(NewReg); @@ -576,7 +576,7 @@ MachineInstr *Clone = &*std::prev(Insert); LIS.InsertMachineInstrInMaps(*Clone); LIS.createAndComputeVirtRegInterval(NewReg); - MFI.stackifyVReg(NewReg); + MFI.stackifyVReg(MRI, NewReg); imposeStackOrdering(Clone); LLVM_DEBUG(dbgs() << " - Cloned to "; Clone->dump()); @@ -667,8 +667,8 @@ // Finish stackifying the new regs. LIS.createAndComputeVirtRegInterval(TeeReg); LIS.createAndComputeVirtRegInterval(DefReg); - MFI.stackifyVReg(DefReg); - MFI.stackifyVReg(TeeReg); + MFI.stackifyVReg(MRI, DefReg); + MFI.stackifyVReg(MRI, TeeReg); imposeStackOrdering(Def); imposeStackOrdering(Tee); @@ -934,7 +934,7 @@ // TODO: This single-use restriction could be relaxed by using tees if (DefReg != UseReg || !MRI.hasOneUse(DefReg)) break; - MFI.stackifyVReg(DefReg); + MFI.stackifyVReg(MRI, DefReg); ++SubsequentDef; ++SubsequentUse; }