diff options
author | Tim Northover <tnorthover@apple.com> | 2016-08-19 18:32:14 +0000 |
---|---|---|
committer | Tim Northover <tnorthover@apple.com> | 2016-08-19 18:32:14 +0000 |
commit | 26b76f2c599c0f5104319a5786093199b173f80d (patch) | |
tree | 05e2d7538c0d5f972261a12d1400cbca39df2eee /llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp | |
parent | fbfa3ee4f613af83ef6af70c15b3fccfd5f50444 (diff) | |
download | bcm5719-llvm-26b76f2c599c0f5104319a5786093199b173f80d.tar.gz bcm5719-llvm-26b76f2c599c0f5104319a5786093199b173f80d.zip |
GlobalISel: improve representation of G_SEQUENCE and G_EXTRACT
First, make sure all types involved are represented, rather than being implicit
from the register width.
Second, canonicalize all types to scalar. These operations just act in bits and
don't care about vectors.
Also standardize spelling of Indices in the MachineIRBuilder (NFC here).
llvm-svn: 279294
Diffstat (limited to 'llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp')
-rw-r--r-- | llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp | 37 |
1 files changed, 26 insertions, 11 deletions
diff --git a/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp b/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp index 0ee70999b08..bd66a28bdc2 100644 --- a/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp +++ b/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp @@ -141,33 +141,48 @@ MachineInstrBuilder MachineIRBuilder::buildAnyExtend(LLT Ty, unsigned Res, return buildInstr(TargetOpcode::G_ANYEXTEND, Ty).addDef(Res).addUse(Op); } -MachineInstrBuilder -MachineIRBuilder::buildExtract(LLT Ty, ArrayRef<unsigned> Results, unsigned Src, - ArrayRef<uint64_t> Indexes) { - assert(Results.size() == Indexes.size() && "inconsistent number of regs"); +MachineInstrBuilder MachineIRBuilder::buildExtract(ArrayRef<LLT> ResTys, + ArrayRef<unsigned> Results, + ArrayRef<uint64_t> Indices, + LLT SrcTy, unsigned Src) { + assert(ResTys.size() == Results.size() && Results.size() == Indices.size() && + "inconsistent number of regs"); + assert(!Results.empty() && "invalid trivial extract"); + + auto MIB = BuildMI(getMF(), DL, getTII().get(TargetOpcode::G_EXTRACT)); + for (unsigned i = 0; i < ResTys.size(); ++i) + MIB->setType(LLT::scalar(ResTys[i].getSizeInBits()), i); + MIB->setType(LLT::scalar(SrcTy.getSizeInBits()), ResTys.size()); - MachineInstrBuilder MIB = buildInstr(TargetOpcode::G_EXTRACT, Ty); for (auto Res : Results) MIB.addDef(Res); MIB.addUse(Src); - for (auto Idx : Indexes) + for (auto Idx : Indices) MIB.addImm(Idx); + + getMBB().insert(getInsertPt(), MIB); + return MIB; } MachineInstrBuilder -MachineIRBuilder::buildSequence(LLT Ty, unsigned Res, +MachineIRBuilder::buildSequence(LLT ResTy, unsigned Res, + ArrayRef<LLT> OpTys, ArrayRef<unsigned> Ops, - ArrayRef<unsigned> Indexes) { - assert(Ops.size() == Indexes.size() && "incompatible args"); + ArrayRef<unsigned> Indices) { + assert(OpTys.size() == Ops.size() && Ops.size() == Indices.size() && + "incompatible args"); + assert(!Ops.empty() && "invalid trivial sequence"); - MachineInstrBuilder MIB = buildInstr(TargetOpcode::G_SEQUENCE, Ty); + MachineInstrBuilder MIB = + buildInstr(TargetOpcode::G_SEQUENCE, LLT::scalar(ResTy.getSizeInBits())); MIB.addDef(Res); for (unsigned i = 0; i < Ops.size(); ++i) { MIB.addUse(Ops[i]); - MIB.addImm(Indexes[i]); + MIB.addImm(Indices[i]); + MIB->setType(LLT::scalar(OpTys[i].getSizeInBits()), MIB->getNumTypes()); } return MIB; } |