Index: include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h =================================================================== --- include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h +++ include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h @@ -357,7 +357,7 @@ /// \pre \p Res must be a generic virtual register with pointer type. /// /// \return a MachineInstrBuilder for the newly created instruction. - MachineInstrBuilder buildFrameIndex(Register Res, int Idx); + MachineInstrBuilder buildFrameIndex(const DstOp &Res, int Idx); /// Build and insert \p Res = G_GLOBAL_VALUE \p GV /// @@ -369,8 +369,7 @@ /// in the same address space as \p GV. /// /// \return a MachineInstrBuilder for the newly created instruction. - MachineInstrBuilder buildGlobalValue(Register Res, const GlobalValue *GV); - + MachineInstrBuilder buildGlobalValue(const DstOp &Res, const GlobalValue *GV); /// Build and insert \p Res = G_GEP \p Op0, \p Op1 /// @@ -383,8 +382,8 @@ /// \pre \p Op1 must be a generic virtual register with scalar type. /// /// \return a MachineInstrBuilder for the newly created instruction. - MachineInstrBuilder buildGEP(Register Res, Register Op0, - Register Op1); + MachineInstrBuilder buildGEP(const DstOp &Res, const SrcOp &Op0, + const SrcOp &Op1); /// Materialize and insert \p Res = G_GEP \p Op0, (G_CONSTANT \p Value) /// @@ -419,7 +418,7 @@ /// be cleared in \p Op0. /// /// \return a MachineInstrBuilder for the newly created instruction. - MachineInstrBuilder buildPtrMask(Register Res, Register Op0, + MachineInstrBuilder buildPtrMask(const DstOp &Res, const SrcOp &Op0, uint32_t NumBits); /// Build and insert \p Res, \p CarryOut = G_UADDO \p Op0, \p Op1 @@ -667,7 +666,7 @@ /// \pre \p Addr must be a generic virtual register with pointer type. /// /// \return a MachineInstrBuilder for the newly created instruction. - MachineInstrBuilder buildLoad(Register Res, Register Addr, + MachineInstrBuilder buildLoad(const DstOp &Res, const SrcOp &Addr, MachineMemOperand &MMO); /// Build and insert `Res = Addr, MMO`. @@ -679,8 +678,8 @@ /// \pre \p Addr must be a generic virtual register with pointer type. /// /// \return a MachineInstrBuilder for the newly created instruction. - MachineInstrBuilder buildLoadInstr(unsigned Opcode, Register Res, - Register Addr, MachineMemOperand &MMO); + MachineInstrBuilder buildLoadInstr(unsigned Opcode, const DstOp &Res, + const SrcOp &Addr, MachineMemOperand &MMO); /// Build and insert `G_STORE Val, Addr, MMO`. /// @@ -691,7 +690,7 @@ /// \pre \p Addr must be a generic virtual register with pointer type. /// /// \return a MachineInstrBuilder for the newly created instruction. - MachineInstrBuilder buildStore(Register Val, Register Addr, + MachineInstrBuilder buildStore(const SrcOp &Val, const SrcOp &Addr, MachineMemOperand &MMO); /// Build and insert `Res0, ... = G_EXTRACT Src, Idx0`. Index: lib/CodeGen/GlobalISel/MachineIRBuilder.cpp =================================================================== --- lib/CodeGen/GlobalISel/MachineIRBuilder.cpp +++ lib/CodeGen/GlobalISel/MachineIRBuilder.cpp @@ -160,23 +160,26 @@ return MIB.addMetadata(Label); } -MachineInstrBuilder MachineIRBuilder::buildFrameIndex(Register Res, int Idx) { - assert(getMRI()->getType(Res).isPointer() && "invalid operand type"); - return buildInstr(TargetOpcode::G_FRAME_INDEX) - .addDef(Res) - .addFrameIndex(Idx); +MachineInstrBuilder MachineIRBuilder::buildFrameIndex(const DstOp &Res, + int Idx) { + assert(Res.getLLTTy(*getMRI()).isPointer() && "invalid operand type"); + auto MIB = buildInstr(TargetOpcode::G_FRAME_INDEX); + Res.addDefToMIB(*getMRI(), MIB); + MIB.addFrameIndex(Idx); + return MIB; } -MachineInstrBuilder MachineIRBuilder::buildGlobalValue(Register Res, +MachineInstrBuilder MachineIRBuilder::buildGlobalValue(const DstOp &Res, const GlobalValue *GV) { - assert(getMRI()->getType(Res).isPointer() && "invalid operand type"); - assert(getMRI()->getType(Res).getAddressSpace() == + assert(Res.getLLTTy(*getMRI()).isPointer() && "invalid operand type"); + assert(Res.getLLTTy(*getMRI()).getAddressSpace() == GV->getType()->getAddressSpace() && "address space mismatch"); - return buildInstr(TargetOpcode::G_GLOBAL_VALUE) - .addDef(Res) - .addGlobalAddress(GV); + auto MIB = buildInstr(TargetOpcode::G_GLOBAL_VALUE); + Res.addDefToMIB(*getMRI(), MIB); + MIB.addGlobalAddress(GV); + return MIB; } MachineInstrBuilder MachineIRBuilder::buildJumpTable(const LLT PtrTy, @@ -197,16 +200,18 @@ assert((Res == Op0) && "type mismatch"); } -MachineInstrBuilder MachineIRBuilder::buildGEP(Register Res, Register Op0, - Register Op1) { - assert(getMRI()->getType(Res).isPointer() && - getMRI()->getType(Res) == getMRI()->getType(Op0) && "type mismatch"); - assert(getMRI()->getType(Op1).isScalar() && "invalid offset type"); +MachineInstrBuilder MachineIRBuilder::buildGEP(const DstOp &Res, + const SrcOp &Op0, + const SrcOp &Op1) { + assert(Res.getLLTTy(*getMRI()).isPointer() && + Res.getLLTTy(*getMRI()) == Op0.getLLTTy(*getMRI()) && "type mismatch"); + assert(Op1.getLLTTy(*getMRI()).isScalar() && "invalid offset type"); - return buildInstr(TargetOpcode::G_GEP) - .addDef(Res) - .addUse(Op0) - .addUse(Op1); + auto MIB = buildInstr(TargetOpcode::G_GEP); + Res.addDefToMIB(*getMRI(), MIB); + Op0.addSrcToMIB(MIB); + Op1.addSrcToMIB(MIB); + return MIB; } Optional @@ -225,15 +230,17 @@ return buildGEP(Res, Op0, Cst.getReg(0)); } -MachineInstrBuilder MachineIRBuilder::buildPtrMask(Register Res, Register Op0, +MachineInstrBuilder MachineIRBuilder::buildPtrMask(const DstOp &Res, + const SrcOp &Op0, uint32_t NumBits) { - assert(getMRI()->getType(Res).isPointer() && - getMRI()->getType(Res) == getMRI()->getType(Op0) && "type mismatch"); + assert(Res.getLLTTy(*getMRI()).isPointer() && + Res.getLLTTy(*getMRI()) == Op0.getLLTTy(*getMRI()) && "type mismatch"); - return buildInstr(TargetOpcode::G_PTR_MASK) - .addDef(Res) - .addUse(Op0) - .addImm(NumBits); + auto MIB = buildInstr(TargetOpcode::G_PTR_MASK); + Res.addDefToMIB(*getMRI(), MIB); + Op0.addSrcToMIB(MIB); + MIB.addImm(NumBits); + return MIB; } MachineInstrBuilder MachineIRBuilder::buildBr(MachineBasicBlock &Dest) { @@ -343,33 +350,37 @@ return buildInstr(TargetOpcode::G_BRCOND).addUse(Tst).addMBB(&Dest); } -MachineInstrBuilder MachineIRBuilder::buildLoad(Register Res, Register Addr, +MachineInstrBuilder MachineIRBuilder::buildLoad(const DstOp &Res, + const SrcOp &Addr, MachineMemOperand &MMO) { return buildLoadInstr(TargetOpcode::G_LOAD, Res, Addr, MMO); } MachineInstrBuilder MachineIRBuilder::buildLoadInstr(unsigned Opcode, - Register Res, - Register Addr, + const DstOp &Res, + const SrcOp &Addr, MachineMemOperand &MMO) { - assert(getMRI()->getType(Res).isValid() && "invalid operand type"); - assert(getMRI()->getType(Addr).isPointer() && "invalid operand type"); + assert(Res.getLLTTy(*getMRI()).isValid() && "invalid operand type"); + assert(Addr.getLLTTy(*getMRI()).isPointer() && "invalid operand type"); - return buildInstr(Opcode) - .addDef(Res) - .addUse(Addr) - .addMemOperand(&MMO); + auto MIB = buildInstr(Opcode); + Res.addDefToMIB(*getMRI(), MIB); + Addr.addSrcToMIB(MIB); + MIB.addMemOperand(&MMO); + return MIB; } -MachineInstrBuilder MachineIRBuilder::buildStore(Register Val, Register Addr, +MachineInstrBuilder MachineIRBuilder::buildStore(const SrcOp &Val, + const SrcOp &Addr, MachineMemOperand &MMO) { - assert(getMRI()->getType(Val).isValid() && "invalid operand type"); - assert(getMRI()->getType(Addr).isPointer() && "invalid operand type"); + assert(Val.getLLTTy(*getMRI()).isValid() && "invalid operand type"); + assert(Addr.getLLTTy(*getMRI()).isPointer() && "invalid operand type"); - return buildInstr(TargetOpcode::G_STORE) - .addUse(Val) - .addUse(Addr) - .addMemOperand(&MMO); + auto MIB = buildInstr(TargetOpcode::G_STORE); + Val.addSrcToMIB(MIB); + Addr.addSrcToMIB(MIB); + MIB.addMemOperand(&MMO); + return MIB; } MachineInstrBuilder MachineIRBuilder::buildUAddo(const DstOp &Res, Index: lib/Target/AArch64/AArch64LegalizerInfo.cpp =================================================================== --- lib/Target/AArch64/AArch64LegalizerInfo.cpp +++ lib/Target/AArch64/AArch64LegalizerInfo.cpp @@ -686,26 +686,25 @@ MIRBuilder.setInstr(MI); MachineFunction &MF = MIRBuilder.getMF(); unsigned Align = MI.getOperand(2).getImm(); - unsigned Dst = MI.getOperand(0).getReg(); - unsigned ListPtr = MI.getOperand(1).getReg(); + Register Dst = MI.getOperand(0).getReg(); + Register ListPtr = MI.getOperand(1).getReg(); LLT PtrTy = MRI.getType(ListPtr); LLT IntPtrTy = LLT::scalar(PtrTy.getSizeInBits()); const unsigned PtrSize = PtrTy.getSizeInBits() / 8; - unsigned List = MRI.createGenericVirtualRegister(PtrTy); + Register List = MRI.createGenericVirtualRegister(PtrTy); MIRBuilder.buildLoad( List, ListPtr, *MF.getMachineMemOperand(MachinePointerInfo(), MachineMemOperand::MOLoad, PtrSize, /* Align = */ PtrSize)); - unsigned DstPtr; + Register DstPtr; if (Align > PtrSize) { // Realign the list to the actual required alignment. auto AlignMinus1 = MIRBuilder.buildConstant(IntPtrTy, Align - 1); - unsigned ListTmp = MRI.createGenericVirtualRegister(PtrTy); - MIRBuilder.buildGEP(ListTmp, List, AlignMinus1.getReg(0)); + auto ListTmp = MIRBuilder.buildGEP(PtrTy, List, AlignMinus1.getReg(0)); DstPtr = MRI.createGenericVirtualRegister(PtrTy); MIRBuilder.buildPtrMask(DstPtr, ListTmp, Log2_64(Align)); @@ -720,8 +719,7 @@ auto Size = MIRBuilder.buildConstant(IntPtrTy, alignTo(ValSize, PtrSize)); - unsigned NewList = MRI.createGenericVirtualRegister(PtrTy); - MIRBuilder.buildGEP(NewList, DstPtr, Size.getReg(0)); + auto NewList = MIRBuilder.buildGEP(PtrTy, DstPtr, Size.getReg(0)); MIRBuilder.buildStore( NewList, ListPtr, Index: lib/Target/Mips/MipsCallLowering.cpp =================================================================== --- lib/Target/Mips/MipsCallLowering.cpp +++ lib/Target/Mips/MipsCallLowering.cpp @@ -109,9 +109,9 @@ MIRBuilder.getMBB().addLiveIn(PhysReg); } - void buildLoad(unsigned Val, const CCValAssign &VA) { + void buildLoad(Register Val, const CCValAssign &VA) { MachineMemOperand *MMO; - unsigned Addr = getStackAddress(VA, MMO); + Register Addr = getStackAddress(VA, MMO); MIRBuilder.buildLoad(Val, Addr, *MMO); } };