summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp
diff options
context:
space:
mode:
authorTim Northover <tnorthover@apple.com>2016-07-29 17:43:52 +0000
committerTim Northover <tnorthover@apple.com>2016-07-29 17:43:52 +0000
commita51575ffa215c0a3558740694b3831b773498d15 (patch)
tree048bb4ac6b2c5627602ae3ee21700acd6627aefa /llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp
parent48c7cc9bc04f595b7b335aeae83df4c0221b6d13 (diff)
downloadbcm5719-llvm-a51575ffa215c0a3558740694b3831b773498d15.tar.gz
bcm5719-llvm-a51575ffa215c0a3558740694b3831b773498d15.zip
CodeGen: improve MachineInstrBuilder & MachineIRBuilder interface
For MachineInstrBuilder, having to manually use RegState::Define is ugly and makes register definitions clunkier than they need to be, so this adds two convenience functions: addDef and addUse. For MachineIRBuilder, we want to avoid BuildMI's first-reg-is-def rule because it's hidden away and causes bugs. So this patch switches buildInstr to returning a MachineInstrBuilder and adding *all* operands via addDef/addUse. NFC. llvm-svn: 277176
Diffstat (limited to 'llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp')
-rw-r--r--llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp94
1 files changed, 47 insertions, 47 deletions
diff --git a/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp b/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp
index be4cafc575b..5d611240098 100644
--- a/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp
@@ -57,83 +57,83 @@ MachineBasicBlock::iterator MachineIRBuilder::getInsertPt() {
// Build instruction variants.
//------------------------------------------------------------------------------
-MachineInstr *MachineIRBuilder::buildInstr(unsigned Opcode, ArrayRef<LLT> Tys) {
- MachineInstr *NewMI = BuildMI(getMF(), DL, getTII().get(Opcode));
+MachineInstrBuilder MachineIRBuilder::buildInstr(unsigned Opcode,
+ ArrayRef<LLT> Tys) {
+ MachineInstrBuilder MIB = BuildMI(getMF(), DL, getTII().get(Opcode));
if (Tys.size() > 0) {
assert(isPreISelGenericOpcode(Opcode) &&
"Only generic instruction can have a type");
for (unsigned i = 0; i < Tys.size(); ++i)
- NewMI->setType(Tys[i], i);
+ MIB->setType(Tys[i], i);
} else
assert(!isPreISelGenericOpcode(Opcode) &&
"Generic instruction must have a type");
- getMBB().insert(getInsertPt(), NewMI);
- return NewMI;
+ getMBB().insert(getInsertPt(), MIB);
+ return MIB;
}
-MachineInstr *MachineIRBuilder::buildFrameIndex(LLT Ty, unsigned Res, int Idx) {
- MachineInstr *NewMI = buildInstr(TargetOpcode::G_FRAME_INDEX, Ty);
- auto MIB = MachineInstrBuilder(getMF(), NewMI);
- MIB.addReg(Res, RegState::Define);
- MIB.addFrameIndex(Idx);
- return NewMI;
+MachineInstrBuilder MachineIRBuilder::buildFrameIndex(LLT Ty, unsigned Res,
+ int Idx) {
+ return buildInstr(TargetOpcode::G_FRAME_INDEX, Ty)
+ .addDef(Res)
+ .addFrameIndex(Idx);
}
-MachineInstr *MachineIRBuilder::buildAdd(LLT Ty, unsigned Res, unsigned Op0,
- unsigned Op1) {
- return buildInstr(TargetOpcode::G_ADD, Ty, Res, Op0, Op1);
+MachineInstrBuilder MachineIRBuilder::buildAdd(LLT Ty, unsigned Res,
+ unsigned Op0, unsigned Op1) {
+ return buildInstr(TargetOpcode::G_ADD, Ty)
+ .addDef(Res)
+ .addUse(Op0)
+ .addUse(Op1);
}
-MachineInstr *MachineIRBuilder::buildBr(MachineBasicBlock &Dest) {
- MachineInstr *NewMI = buildInstr(TargetOpcode::G_BR, LLT::unsized());
- MachineInstrBuilder(getMF(), NewMI).addMBB(&Dest);
- return NewMI;
+MachineInstrBuilder MachineIRBuilder::buildBr(MachineBasicBlock &Dest) {
+ return buildInstr(TargetOpcode::G_BR, LLT::unsized()).addMBB(&Dest);
}
-MachineInstr *MachineIRBuilder::buildCopy(unsigned Res, unsigned Op) {
- return buildInstr(TargetOpcode::COPY, Res, Op);
+MachineInstrBuilder MachineIRBuilder::buildCopy(unsigned Res, unsigned Op) {
+ return buildInstr(TargetOpcode::COPY).addDef(Res).addUse(Op);
}
-MachineInstr *MachineIRBuilder::buildLoad(LLT VTy, LLT PTy, unsigned Res,
- unsigned Addr,
- MachineMemOperand &MMO) {
- MachineInstr *NewMI = buildInstr(TargetOpcode::G_LOAD, {VTy, PTy}, Res, Addr);
- NewMI->addMemOperand(getMF(), &MMO);
- return NewMI;
+MachineInstrBuilder MachineIRBuilder::buildLoad(LLT VTy, LLT PTy, unsigned Res,
+ unsigned Addr,
+ MachineMemOperand &MMO) {
+ return buildInstr(TargetOpcode::G_LOAD, {VTy, PTy})
+ .addDef(Res)
+ .addUse(Addr)
+ .addMemOperand(&MMO);
}
-MachineInstr *MachineIRBuilder::buildStore(LLT VTy, LLT PTy, unsigned Val,
- unsigned Addr,
- MachineMemOperand &MMO) {
- MachineInstr *NewMI = buildInstr(TargetOpcode::G_STORE, {VTy, PTy});
- NewMI->addMemOperand(getMF(), &MMO);
- MachineInstrBuilder(getMF(), NewMI).addReg(Val).addReg(Addr);
- return NewMI;
+MachineInstrBuilder MachineIRBuilder::buildStore(LLT VTy, LLT PTy,
+ unsigned Val, unsigned Addr,
+ MachineMemOperand &MMO) {
+ return buildInstr(TargetOpcode::G_STORE, {VTy, PTy})
+ .addUse(Val)
+ .addUse(Addr)
+ .addMemOperand(&MMO);
}
-MachineInstr *MachineIRBuilder::buildExtract(LLT Ty, ArrayRef<unsigned> Results,
- unsigned Src,
- ArrayRef<unsigned> Indexes) {
+MachineInstrBuilder
+MachineIRBuilder::buildExtract(LLT Ty, ArrayRef<unsigned> Results, unsigned Src,
+ ArrayRef<unsigned> Indexes) {
assert(Results.size() == Indexes.size() && "inconsistent number of regs");
- MachineInstr *NewMI = buildInstr(TargetOpcode::G_EXTRACT, Ty);
- auto MIB = MachineInstrBuilder(getMF(), NewMI);
+ MachineInstrBuilder MIB = buildInstr(TargetOpcode::G_EXTRACT, Ty);
for (auto Res : Results)
- MIB.addReg(Res, RegState::Define);
+ MIB.addDef(Res);
- MIB.addReg(Src);
+ MIB.addUse(Src);
for (auto Idx : Indexes)
MIB.addImm(Idx);
- return NewMI;
+ return MIB;
}
-MachineInstr *MachineIRBuilder::buildSequence(LLT Ty, unsigned Res,
+MachineInstrBuilder MachineIRBuilder::buildSequence(LLT Ty, unsigned Res,
ArrayRef<unsigned> Ops) {
- MachineInstr *NewMI = buildInstr(TargetOpcode::G_SEQUENCE, Ty);
- auto MIB = MachineInstrBuilder(getMF(), NewMI);
- MIB.addReg(Res, RegState::Define);
+ MachineInstrBuilder MIB = buildInstr(TargetOpcode::G_SEQUENCE, Ty);
+ MIB.addDef(Res);
for (auto Op : Ops)
- MIB.addReg(Op);
- return NewMI;
+ MIB.addUse(Op);
+ return MIB;
}
OpenPOWER on IntegriCloud