]> granicus.if.org Git - llvm/commitdiff
GlobalISel: Make buildConstant handle vectors
authorMatt Arsenault <Matthew.Arsenault@amd.com>
Tue, 22 Jan 2019 21:31:02 +0000 (21:31 +0000)
committerMatt Arsenault <Matthew.Arsenault@amd.com>
Tue, 22 Jan 2019 21:31:02 +0000 (21:31 +0000)
Produce a splat build_vector similar to how
SelectionDAG::getConstant does.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@351880 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Support/LowLevelTypeImpl.h
lib/CodeGen/GlobalISel/MachineIRBuilder.cpp
unittests/CodeGen/GlobalISel/CMakeLists.txt
unittests/CodeGen/GlobalISel/GISelMITest.h
unittests/CodeGen/GlobalISel/MachineIRBuilderTest.cpp [new file with mode: 0644]

index da411714da0535fd104a36425492223033461125..cfa830cd6a3bcabd0e7a4578df8f295a82c08d36 100644 (file)
@@ -103,6 +103,10 @@ public:
     return getScalarSizeInBits() * getNumElements();
   }
 
+  LLT getScalarType() const {
+    return isVector() ? getElementType() : *this;
+  }
+
   unsigned getScalarSizeInBits() const {
     assert(RawData != 0 && "Invalid Type");
     if (!IsVector) {
index 6248a49317c352b58205ce6f18fc4e4c1d994c1d..99e768e8ed2c2609cc8416840990ba2a88a98a38 100644 (file)
@@ -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);
index 32bbd561ff8345a5e3bc7b54178e098f74559240..3778ff47d0de38ade3e5fae9f575ba82000882c4 100644 (file)
@@ -10,8 +10,9 @@ set(LLVM_LINK_COMPONENTS
   )
 
 add_llvm_unittest(GlobalISelTests
-        LegalizerInfoTest.cpp
-        PatternMatchTest.cpp
-        LegalizerHelperTest.cpp
-        CSETest.cpp
-        )
+  CSETest.cpp
+  LegalizerHelperTest.cpp
+  LegalizerInfoTest.cpp
+  MachineIRBuilderTest.cpp
+  PatternMatchTest.cpp
+  )
index 709e373e9ff3d5315b2b95c556f0c3590f9e4e64..33621cf293550b6c42af9bb761e62c605c58a54b 100644 (file)
@@ -1,5 +1,4 @@
-//===- GISelMITest.h
-//-----------------------------------------------===//
+//===- GISelMITest.h --------------------------------------------*- C++ -*-===//
 //
 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 // See https://llvm.org/LICENSE.txt for license information.
diff --git a/unittests/CodeGen/GlobalISel/MachineIRBuilderTest.cpp b/unittests/CodeGen/GlobalISel/MachineIRBuilderTest.cpp
new file mode 100644 (file)
index 0000000..dae67f7
--- /dev/null
@@ -0,0 +1,36 @@
+//===- MachineIRBuilderTest.cpp -------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "GISelMITest.h"
+#include "llvm/CodeGen/GlobalISel/MachineIRBuilder.h"
+
+TEST_F(GISelMITest, TestBuildConstantFConstant) {
+  if (!TM)
+    return;
+
+  MachineIRBuilder B(*MF);
+  B.setInsertPt(*EntryMBB, EntryMBB->begin());
+
+  B.buildConstant(LLT::scalar(32), 42);
+  B.buildFConstant(LLT::scalar(32), 1.0);
+
+  B.buildConstant(LLT::vector(2, 32), 99);
+  B.buildFConstant(LLT::vector(2, 32), 2.0);
+
+  auto CheckStr = R"(
+  CHECK: [[CONST0:%[0-9]+]]:_(s32) = G_CONSTANT i32 42
+  CHECK: [[FCONST0:%[0-9]+]]:_(s32) = G_FCONSTANT float 1.000000e+00
+  CHECK: [[CONST1:%[0-9]+]]:_(s32) = G_CONSTANT i32 99
+  CHECK: [[VEC0:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[CONST1]]:_(s32), [[CONST1]]:_(s32)
+  CHECK: [[FCONST1:%[0-9]+]]:_(s32) = G_FCONSTANT double 2.000000e+00
+  CHECK: [[VEC1:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[FCONST1]]:_(s32), [[FCONST1]]:_(s32)
+
+  )";
+
+  ASSERT_TRUE(CheckMachineFunction(*MF, CheckStr));
+}