[llvm] [GlobalISel] Add build methods for FP environment intrinsics (PR #96607)
Serge Pavlov via llvm-commits
llvm-commits at lists.llvm.org
Tue Jun 25 02:12:47 PDT 2024
https://github.com/spavloff updated https://github.com/llvm/llvm-project/pull/96607
>From 64bce7ea6c7f075070f4f036537cef73d991e734 Mon Sep 17 00:00:00 2001
From: Serge Pavlov <sepavloff at gmail.com>
Date: Tue, 25 Jun 2024 15:30:26 +0700
Subject: [PATCH 1/2] [GlobalISel] Add build methods for FP environment
intrinsics
This change adds methods like buildGetFPEnv and similar for opcodes that
represent manipulation on floating-point state.
---
.../CodeGen/GlobalISel/MachineIRBuilder.h | 30 ++++++++++++++++++
llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp | 16 ++++------
.../GlobalISel/MachineIRBuilderTest.cpp | 31 +++++++++++++++++++
3 files changed, 67 insertions(+), 10 deletions(-)
diff --git a/llvm/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h b/llvm/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h
index 92e05ee858a75..a95ed3109feb8 100644
--- a/llvm/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h
+++ b/llvm/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h
@@ -2173,6 +2173,36 @@ class MachineIRBuilder {
return buildInstr(TargetOpcode::G_BITREVERSE, {Dst}, {Src});
}
+ /// Build and insert \p Dst = G_GET_FPENV
+ MachineInstrBuilder buildGetFPEnv(const DstOp &Dst) {
+ return buildInstr(TargetOpcode::G_GET_FPENV, {Dst}, {});
+ }
+
+ /// Build and insert G_SET_FPENV \p Src
+ MachineInstrBuilder buildSetFPEnv(const SrcOp &Src) {
+ return buildInstr(TargetOpcode::G_SET_FPENV, {}, {Src});
+ }
+
+ /// Build and insert G_RESET_FPENV
+ MachineInstrBuilder buildResetFPEnv() {
+ return buildInstr(TargetOpcode::G_RESET_FPENV, {}, {});
+ }
+
+ /// Build and insert \p Dst = G_GET_FPMODE
+ MachineInstrBuilder buildGetFPMode(const DstOp &Dst) {
+ return buildInstr(TargetOpcode::G_GET_FPMODE, {Dst}, {});
+ }
+
+ /// Build and insert G_SET_FPMODE \p Src
+ MachineInstrBuilder buildSetFPMode(const SrcOp &Src) {
+ return buildInstr(TargetOpcode::G_SET_FPMODE, {}, {Src});
+ }
+
+ /// Build and insert G_RESET_FPMODE
+ MachineInstrBuilder buildResetFPMode() {
+ return buildInstr(TargetOpcode::G_RESET_FPMODE, {}, {});
+ }
+
virtual MachineInstrBuilder
buildInstr(unsigned Opc, ArrayRef<DstOp> DstOps, ArrayRef<SrcOp> SrcOps,
std::optional<unsigned> Flags = std::nullopt);
diff --git a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
index c06b35a98e434..ddf6d3c20f022 100644
--- a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
@@ -2541,24 +2541,20 @@ bool IRTranslator::translateKnownIntrinsic(const CallInst &CI, Intrinsic::ID ID,
}
case Intrinsic::set_fpenv: {
Value *FPEnv = CI.getOperand(0);
- MIRBuilder.buildInstr(TargetOpcode::G_SET_FPENV, {},
- {getOrCreateVReg(*FPEnv)});
+ MIRBuilder.buildSetFPEnv(getOrCreateVReg(*FPEnv));
return true;
}
- case Intrinsic::reset_fpenv: {
- MIRBuilder.buildInstr(TargetOpcode::G_RESET_FPENV, {}, {});
+ case Intrinsic::reset_fpenv:
+ MIRBuilder.buildResetFPEnv();
return true;
- }
case Intrinsic::set_fpmode: {
Value *FPState = CI.getOperand(0);
- MIRBuilder.buildInstr(TargetOpcode::G_SET_FPMODE, {},
- { getOrCreateVReg(*FPState) });
+ MIRBuilder.buildSetFPMode(getOrCreateVReg(*FPState));
return true;
}
- case Intrinsic::reset_fpmode: {
- MIRBuilder.buildInstr(TargetOpcode::G_RESET_FPMODE, {}, {});
+ case Intrinsic::reset_fpmode:
+ MIRBuilder.buildResetFPMode();
return true;
- }
case Intrinsic::vscale: {
MIRBuilder.buildVScale(getOrCreateVReg(CI), 1);
return true;
diff --git a/llvm/unittests/CodeGen/GlobalISel/MachineIRBuilderTest.cpp b/llvm/unittests/CodeGen/GlobalISel/MachineIRBuilderTest.cpp
index 7b4a06fc8a98a..bd3c3e8dda229 100644
--- a/llvm/unittests/CodeGen/GlobalISel/MachineIRBuilderTest.cpp
+++ b/llvm/unittests/CodeGen/GlobalISel/MachineIRBuilderTest.cpp
@@ -449,3 +449,34 @@ TEST_F(AArch64GISelMITest, BuildBitfieldExtract) {
EXPECT_TRUE(CheckMachineFunction(*MF, CheckStr)) << *MF;
}
+
+TEST_F(AArch64GISelMITest, BuildFPEnv) {
+ setUp();
+ if (!TM)
+ GTEST_SKIP();
+
+ LLT S32 = LLT::scalar(32);
+ SmallVector<Register, 4> Copies;
+ collectCopies(Copies, MF);
+
+ B.buildGetFPEnv(Copies[0]);
+ B.buildSetFPEnv(Copies[1]);
+ B.buildResetFPEnv();
+ auto GetFPMode = B.buildGetFPMode(S32);
+ B.buildSetFPMode(GetFPMode);
+ B.buildResetFPMode();
+
+ auto CheckStr = R"(
+ ; CHECK: [[COPY0:%[0-9]+]]:_(s64) = COPY $x0
+ ; CHECK: [[COPY1:%[0-9]+]]:_(s64) = COPY $x1
+ ; CHECK: [[COPY2:%[0-9]+]]:_(s64) = COPY $x2
+ ; CHECK: [[COPY0]]:_(s64) = G_GET_FPENV
+ ; CHECK: G_SET_FPENV [[COPY1]]:_(s64)
+ ; CHECK: G_RESET_FPENV
+ ; CHECK: [[FPMODE:%[0-9]+]]:_(s32) = G_GET_FPMODE
+ ; CHECK: G_SET_FPMODE [[FPMODE]]:_(s32)
+ ; CHECK: G_RESET_FPMODE
+ )";
+
+ EXPECT_TRUE(CheckMachineFunction(*MF, CheckStr)) << *MF;
+}
\ No newline at end of file
>From fd895cc3c11314aacc89552e6e39e3753de567e4 Mon Sep 17 00:00:00 2001
From: Serge Pavlov <sepavloff at gmail.com>
Date: Tue, 25 Jun 2024 16:12:38 +0700
Subject: [PATCH 2/2] Add newline EOF in MachineIRBuilderTest.cpp
---
llvm/unittests/CodeGen/GlobalISel/MachineIRBuilderTest.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/llvm/unittests/CodeGen/GlobalISel/MachineIRBuilderTest.cpp b/llvm/unittests/CodeGen/GlobalISel/MachineIRBuilderTest.cpp
index bd3c3e8dda229..2c068ba7f88fe 100644
--- a/llvm/unittests/CodeGen/GlobalISel/MachineIRBuilderTest.cpp
+++ b/llvm/unittests/CodeGen/GlobalISel/MachineIRBuilderTest.cpp
@@ -479,4 +479,4 @@ TEST_F(AArch64GISelMITest, BuildFPEnv) {
)";
EXPECT_TRUE(CheckMachineFunction(*MF, CheckStr)) << *MF;
-}
\ No newline at end of file
+}
More information about the llvm-commits
mailing list