diff options
| author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2019-01-22 21:31:02 +0000 |
|---|---|---|
| committer | Matt Arsenault <Matthew.Arsenault@amd.com> | 2019-01-22 21:31:02 +0000 |
| commit | 52133812f60916fb9632310735d522217824ac6f (patch) | |
| tree | 225608b773e082006449bdefee639061a54ce2cf /llvm/lib/CodeGen | |
| parent | fea3731f37e9a34beaf0385d0b76023395ceb577 (diff) | |
| download | bcm5719-llvm-52133812f60916fb9632310735d522217824ac6f.tar.gz bcm5719-llvm-52133812f60916fb9632310735d522217824ac6f.zip | |
GlobalISel: Make buildConstant handle vectors
Produce a splat build_vector similar to how
SelectionDAG::getConstant does.
llvm-svn: 351880
Diffstat (limited to 'llvm/lib/CodeGen')
| -rw-r--r-- | llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp | 42 |
1 files changed, 38 insertions, 4 deletions
diff --git a/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp b/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp index 6248a49317c..99e768e8ed2 100644 --- a/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp +++ b/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp @@ -242,11 +242,28 @@ MachineInstrBuilder MachineIRBuilder::buildCopy(const DstOp &Res, MachineInstrBuilder MachineIRBuilder::buildConstant(const DstOp &Res, const ConstantInt &Val) { LLT Ty = Res.getLLTTy(*getMRI()); + LLT EltTy = Ty.getScalarType(); const ConstantInt *NewVal = &Val; - if (Ty.getScalarSizeInBits() != Val.getBitWidth()) - NewVal = ConstantInt::get(getMF().getFunction().getContext(), - Val.getValue().sextOrTrunc(Ty.getSizeInBits())); + if (EltTy.getSizeInBits() != Val.getBitWidth()) { + NewVal = ConstantInt::get( + getMF().getFunction().getContext(), + Val.getValue().sextOrTrunc(EltTy.getSizeInBits())); + } + + if (Ty.isVector()) { + unsigned EltReg = getMRI()->createGenericVirtualRegister(EltTy); + buildInstr(TargetOpcode::G_CONSTANT) + .addDef(EltReg) + .addCImm(NewVal); + + auto MIB = buildInstr(TargetOpcode::G_BUILD_VECTOR); + Res.addDefToMIB(*getMRI(), MIB); + + for (unsigned I = 0, E = Ty.getNumElements(); I != E; ++I) + MIB.addUse(EltReg); + return MIB; + } auto MIB = buildInstr(TargetOpcode::G_CONSTANT); Res.addDefToMIB(*getMRI(), MIB); @@ -264,7 +281,24 @@ MachineInstrBuilder MachineIRBuilder::buildConstant(const DstOp &Res, MachineInstrBuilder MachineIRBuilder::buildFConstant(const DstOp &Res, const ConstantFP &Val) { - assert(!Res.getLLTTy(*getMRI()).isPointer() && "invalid operand type"); + LLT Ty = Res.getLLTTy(*getMRI()); + + assert(!Ty.isPointer() && "invalid operand type"); + + if (Ty.isVector()) { + unsigned EltReg + = getMRI()->createGenericVirtualRegister(Ty.getElementType()); + buildInstr(TargetOpcode::G_FCONSTANT) + .addDef(EltReg) + .addFPImm(&Val); + + auto MIB = buildInstr(TargetOpcode::G_BUILD_VECTOR); + Res.addDefToMIB(*getMRI(), MIB); + + for (unsigned I = 0, E = Ty.getNumElements(); I != E; ++I) + MIB.addUse(EltReg); + return MIB; + } auto MIB = buildInstr(TargetOpcode::G_FCONSTANT); Res.addDefToMIB(*getMRI(), MIB); |

