From 11be78bc7abf469c2db2d631f11b02ec8cb9f3c5 Mon Sep 17 00:00:00 2001 From: Matt Arsenault Date: Thu, 16 May 2019 04:09:06 +0000 Subject: [PATCH] GlobalISel: Add buildFConstant for APFloat llvm-svn: 360853 --- llvm/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h | 1 + llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp | 7 +++++++ llvm/unittests/CodeGen/GlobalISel/MachineIRBuilderTest.cpp | 5 +++++ 3 files changed, 13 insertions(+) diff --git a/llvm/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h b/llvm/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h index ee1e2da..751ecb6 100644 --- a/llvm/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h +++ b/llvm/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h @@ -632,6 +632,7 @@ public: const ConstantFP &Val); MachineInstrBuilder buildFConstant(const DstOp &Res, double Val); + MachineInstrBuilder buildFConstant(const DstOp &Res, const APFloat &Val); /// Build and insert \p Res = COPY Op /// diff --git a/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp b/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp index 735d441..1ee982f 100644 --- a/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp +++ b/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp @@ -312,6 +312,13 @@ MachineInstrBuilder MachineIRBuilder::buildFConstant(const DstOp &Res, return buildFConstant(Res, *CFP); } +MachineInstrBuilder MachineIRBuilder::buildFConstant(const DstOp &Res, + const APFloat &Val) { + auto &Ctx = getMF().getFunction().getContext(); + auto *CFP = ConstantFP::get(Ctx, Val); + return buildFConstant(Res, *CFP); +} + MachineInstrBuilder MachineIRBuilder::buildBrCond(unsigned Tst, MachineBasicBlock &Dest) { assert(getMRI()->getType(Tst).isScalar() && "invalid operand type"); diff --git a/llvm/unittests/CodeGen/GlobalISel/MachineIRBuilderTest.cpp b/llvm/unittests/CodeGen/GlobalISel/MachineIRBuilderTest.cpp index e53dc80..f9ce424 100644 --- a/llvm/unittests/CodeGen/GlobalISel/MachineIRBuilderTest.cpp +++ b/llvm/unittests/CodeGen/GlobalISel/MachineIRBuilderTest.cpp @@ -19,6 +19,10 @@ TEST_F(GISelMITest, TestBuildConstantFConstant) { B.buildConstant(LLT::vector(2, 32), 99); B.buildFConstant(LLT::vector(2, 32), 2.0); + // Test APFloat overload. + APFloat KVal(APFloat::IEEEdouble(), "4.0"); + B.buildFConstant(LLT::scalar(64), KVal); + auto CheckStr = R"( CHECK: [[CONST0:%[0-9]+]]:_(s32) = G_CONSTANT i32 42 CHECK: [[FCONST0:%[0-9]+]]:_(s32) = G_FCONSTANT float 1.000000e+00 @@ -26,6 +30,7 @@ TEST_F(GISelMITest, TestBuildConstantFConstant) { CHECK: [[VEC0:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[CONST1]]:_(s32), [[CONST1]]:_(s32) CHECK: [[FCONST1:%[0-9]+]]:_(s32) = G_FCONSTANT float 2.000000e+00 CHECK: [[VEC1:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[FCONST1]]:_(s32), [[FCONST1]]:_(s32) + CHECK: [[FCONST2:%[0-9]+]]:_(s64) = G_FCONSTANT double 4.000000e+00 )"; EXPECT_TRUE(CheckMachineFunction(*MF, CheckStr)) << *MF; -- 2.7.4