[llvm] f9795f3 - [GlobalISel] Add build methods for FP environment intrinsics (#96607)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Jun 25 02:13:55 PDT 2024
Author: Serge Pavlov
Date: 2024-06-25T16:13:52+07:00
New Revision: f9795f34a6b358bdf02389ba01765924a2ad0b9f
URL: https://github.com/llvm/llvm-project/commit/f9795f34a6b358bdf02389ba01765924a2ad0b9f
DIFF: https://github.com/llvm/llvm-project/commit/f9795f34a6b358bdf02389ba01765924a2ad0b9f.diff
LOG: [GlobalISel] Add build methods for FP environment intrinsics (#96607)
This change adds methods like buildGetFPEnv and similar for opcodes that
represent manipulation on floating-point state.
Added:
Modified:
llvm/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h
llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
llvm/unittests/CodeGen/GlobalISel/MachineIRBuilderTest.cpp
Removed:
################################################################################
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..2c068ba7f88fe 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;
+}
More information about the llvm-commits
mailing list