summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen
diff options
context:
space:
mode:
authorMatt Arsenault <Matthew.Arsenault@amd.com>2019-01-22 21:31:02 +0000
committerMatt Arsenault <Matthew.Arsenault@amd.com>2019-01-22 21:31:02 +0000
commit52133812f60916fb9632310735d522217824ac6f (patch)
tree225608b773e082006449bdefee639061a54ce2cf /llvm/lib/CodeGen
parentfea3731f37e9a34beaf0385d0b76023395ceb577 (diff)
downloadbcm5719-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.cpp42
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);
OpenPOWER on IntegriCloud