Skip to content

Commit 4463bad

Browse files
committed
AMDGPU: Use DenormalMode type in FP mode tracking
This simplies a future patch. The MIR handling should be fixed. We're still printing these in custom MachineFunctionInfo as bools (plus the inverted meaning is hard to follow).
1 parent 35762d0 commit 4463bad

File tree

5 files changed

+66
-53
lines changed

5 files changed

+66
-53
lines changed

llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1591,10 +1591,21 @@ bool GCNTargetMachine::parseMachineFunctionInfo(
15911591

15921592
MFI->Mode.IEEE = YamlMFI.Mode.IEEE;
15931593
MFI->Mode.DX10Clamp = YamlMFI.Mode.DX10Clamp;
1594-
MFI->Mode.FP32InputDenormals = YamlMFI.Mode.FP32InputDenormals;
1595-
MFI->Mode.FP32OutputDenormals = YamlMFI.Mode.FP32OutputDenormals;
1596-
MFI->Mode.FP64FP16InputDenormals = YamlMFI.Mode.FP64FP16InputDenormals;
1597-
MFI->Mode.FP64FP16OutputDenormals = YamlMFI.Mode.FP64FP16OutputDenormals;
1594+
1595+
// FIXME: Move proper support for denormal-fp-math into base MachineFunction
1596+
MFI->Mode.FP32Denormals.Input = YamlMFI.Mode.FP32InputDenormals
1597+
? DenormalMode::IEEE
1598+
: DenormalMode::PreserveSign;
1599+
MFI->Mode.FP32Denormals.Output = YamlMFI.Mode.FP32OutputDenormals
1600+
? DenormalMode::IEEE
1601+
: DenormalMode::PreserveSign;
1602+
1603+
MFI->Mode.FP64FP16Denormals.Input = YamlMFI.Mode.FP64FP16InputDenormals
1604+
? DenormalMode::IEEE
1605+
: DenormalMode::PreserveSign;
1606+
MFI->Mode.FP64FP16Denormals.Output = YamlMFI.Mode.FP64FP16OutputDenormals
1607+
? DenormalMode::IEEE
1608+
: DenormalMode::PreserveSign;
15981609

15991610
return false;
16001611
}

llvm/lib/Target/AMDGPU/SIFoldOperands.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1453,10 +1453,11 @@ SIFoldOperands::isOMod(const MachineInstr &MI) const {
14531453
case AMDGPU::V_MUL_F16_t16_e64:
14541454
case AMDGPU::V_MUL_F16_e64: {
14551455
// If output denormals are enabled, omod is ignored.
1456-
if ((Op == AMDGPU::V_MUL_F32_e64 && MFI->getMode().FP32OutputDenormals) ||
1456+
if ((Op == AMDGPU::V_MUL_F32_e64 &&
1457+
MFI->getMode().FP32Denormals.Output != DenormalMode::PreserveSign) ||
14571458
((Op == AMDGPU::V_MUL_F64_e64 || Op == AMDGPU::V_MUL_F16_e64 ||
14581459
Op == AMDGPU::V_MUL_F16_t16_e64) &&
1459-
MFI->getMode().FP64FP16OutputDenormals))
1460+
MFI->getMode().FP64FP16Denormals.Output != DenormalMode::PreserveSign))
14601461
return std::pair(nullptr, SIOutMods::NONE);
14611462

14621463
const MachineOperand *RegOp = nullptr;
@@ -1487,10 +1488,11 @@ SIFoldOperands::isOMod(const MachineInstr &MI) const {
14871488
case AMDGPU::V_ADD_F16_e64:
14881489
case AMDGPU::V_ADD_F16_t16_e64: {
14891490
// If output denormals are enabled, omod is ignored.
1490-
if ((Op == AMDGPU::V_ADD_F32_e64 && MFI->getMode().FP32OutputDenormals) ||
1491+
if ((Op == AMDGPU::V_ADD_F32_e64 &&
1492+
MFI->getMode().FP32Denormals.Output != DenormalMode::PreserveSign) ||
14911493
((Op == AMDGPU::V_ADD_F64_e64 || Op == AMDGPU::V_ADD_F16_e64 ||
14921494
Op == AMDGPU::V_ADD_F16_t16_e64) &&
1493-
MFI->getMode().FP64FP16OutputDenormals))
1495+
MFI->getMode().FP64FP16Denormals.Output != DenormalMode::PreserveSign))
14941496
return std::pair(nullptr, SIOutMods::NONE);
14951497

14961498
// Look through the DAGCombiner canonicalization fmul x, 2 -> fadd x, x

llvm/lib/Target/AMDGPU/SIMachineFunctionInfo.h

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -218,10 +218,13 @@ struct SIMode {
218218
SIMode(const AMDGPU::SIModeRegisterDefaults &Mode) {
219219
IEEE = Mode.IEEE;
220220
DX10Clamp = Mode.DX10Clamp;
221-
FP32InputDenormals = Mode.FP32InputDenormals;
222-
FP32OutputDenormals = Mode.FP32OutputDenormals;
223-
FP64FP16InputDenormals = Mode.FP64FP16InputDenormals;
224-
FP64FP16OutputDenormals = Mode.FP64FP16OutputDenormals;
221+
FP32InputDenormals = Mode.FP32Denormals.Input != DenormalMode::PreserveSign;
222+
FP32OutputDenormals =
223+
Mode.FP32Denormals.Output != DenormalMode::PreserveSign;
224+
FP64FP16InputDenormals =
225+
Mode.FP64FP16Denormals.Input != DenormalMode::PreserveSign;
226+
FP64FP16OutputDenormals =
227+
Mode.FP64FP16Denormals.Output != DenormalMode::PreserveSign;
225228
}
226229

227230
bool operator ==(const SIMode Other) const {

llvm/lib/Target/AMDGPU/Utils/AMDGPUBaseInfo.cpp

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2569,23 +2569,15 @@ SIModeRegisterDefaults::SIModeRegisterDefaults(const Function &F) {
25692569
DX10Clamp = DX10ClampAttr == "true";
25702570

25712571
StringRef DenormF32Attr = F.getFnAttribute("denormal-fp-math-f32").getValueAsString();
2572-
if (!DenormF32Attr.empty()) {
2573-
DenormalMode DenormMode = parseDenormalFPAttribute(DenormF32Attr);
2574-
FP32InputDenormals = DenormMode.Input == DenormalMode::IEEE;
2575-
FP32OutputDenormals = DenormMode.Output == DenormalMode::IEEE;
2576-
}
2572+
if (!DenormF32Attr.empty())
2573+
FP32Denormals = parseDenormalFPAttribute(DenormF32Attr);
25772574

25782575
StringRef DenormAttr = F.getFnAttribute("denormal-fp-math").getValueAsString();
25792576
if (!DenormAttr.empty()) {
25802577
DenormalMode DenormMode = parseDenormalFPAttribute(DenormAttr);
2581-
2582-
if (DenormF32Attr.empty()) {
2583-
FP32InputDenormals = DenormMode.Input == DenormalMode::IEEE;
2584-
FP32OutputDenormals = DenormMode.Output == DenormalMode::IEEE;
2585-
}
2586-
2587-
FP64FP16InputDenormals = DenormMode.Input == DenormalMode::IEEE;
2588-
FP64FP16OutputDenormals = DenormMode.Output == DenormalMode::IEEE;
2578+
if (DenormF32Attr.empty())
2579+
FP32Denormals = DenormMode;
2580+
FP64FP16Denormals = DenormMode;
25892581
}
25902582
}
25912583

llvm/lib/Target/AMDGPU/Utils/AMDGPUBaseInfo.h

Lines changed: 33 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#define LLVM_LIB_TARGET_AMDGPU_UTILS_AMDGPUBASEINFO_H
1111

1212
#include "SIDefines.h"
13+
#include "llvm/ADT/FloatingPointMode.h"
1314
#include "llvm/IR/CallingConv.h"
1415
#include "llvm/Support/Alignment.h"
1516
#include <array>
@@ -1299,21 +1300,17 @@ struct SIModeRegisterDefaults {
12991300

13001301
/// If this is set, neither input or output denormals are flushed for most f32
13011302
/// instructions.
1302-
bool FP32InputDenormals : 1;
1303-
bool FP32OutputDenormals : 1;
1303+
DenormalMode FP32Denormals;
13041304

13051305
/// If this is set, neither input or output denormals are flushed for both f64
13061306
/// and f16/v2f16 instructions.
1307-
bool FP64FP16InputDenormals : 1;
1308-
bool FP64FP16OutputDenormals : 1;
1307+
DenormalMode FP64FP16Denormals;
13091308

13101309
SIModeRegisterDefaults() :
13111310
IEEE(true),
13121311
DX10Clamp(true),
1313-
FP32InputDenormals(true),
1314-
FP32OutputDenormals(true),
1315-
FP64FP16InputDenormals(true),
1316-
FP64FP16OutputDenormals(true) {}
1312+
FP32Denormals(DenormalMode::getIEEE()),
1313+
FP64FP16Denormals(DenormalMode::getIEEE()) {}
13171314

13181315
SIModeRegisterDefaults(const Function &F);
13191316

@@ -1325,42 +1322,40 @@ struct SIModeRegisterDefaults {
13251322

13261323
bool operator ==(const SIModeRegisterDefaults Other) const {
13271324
return IEEE == Other.IEEE && DX10Clamp == Other.DX10Clamp &&
1328-
FP32InputDenormals == Other.FP32InputDenormals &&
1329-
FP32OutputDenormals == Other.FP32OutputDenormals &&
1330-
FP64FP16InputDenormals == Other.FP64FP16InputDenormals &&
1331-
FP64FP16OutputDenormals == Other.FP64FP16OutputDenormals;
1325+
FP32Denormals == Other.FP32Denormals &&
1326+
FP64FP16Denormals == Other.FP64FP16Denormals;
13321327
}
13331328

13341329
bool allFP32Denormals() const {
1335-
return FP32InputDenormals && FP32OutputDenormals;
1330+
return FP32Denormals == DenormalMode::getIEEE();
13361331
}
13371332

13381333
bool allFP64FP16Denormals() const {
1339-
return FP64FP16InputDenormals && FP64FP16OutputDenormals;
1334+
return FP64FP16Denormals == DenormalMode::getIEEE();
13401335
}
13411336

13421337
/// Get the encoding value for the FP_DENORM bits of the mode register for the
13431338
/// FP32 denormal mode.
13441339
uint32_t fpDenormModeSPValue() const {
1345-
if (FP32InputDenormals && FP32OutputDenormals)
1346-
return FP_DENORM_FLUSH_NONE;
1347-
if (FP32InputDenormals)
1340+
if (FP32Denormals == DenormalMode::getPreserveSign())
1341+
return FP_DENORM_FLUSH_IN_FLUSH_OUT;
1342+
if (FP32Denormals.Output == DenormalMode::PreserveSign)
13481343
return FP_DENORM_FLUSH_OUT;
1349-
if (FP32OutputDenormals)
1344+
if (FP32Denormals.Input == DenormalMode::PreserveSign)
13501345
return FP_DENORM_FLUSH_IN;
1351-
return FP_DENORM_FLUSH_IN_FLUSH_OUT;
1346+
return FP_DENORM_FLUSH_NONE;
13521347
}
13531348

13541349
/// Get the encoding value for the FP_DENORM bits of the mode register for the
13551350
/// FP64/FP16 denormal mode.
13561351
uint32_t fpDenormModeDPValue() const {
1357-
if (FP64FP16InputDenormals && FP64FP16OutputDenormals)
1358-
return FP_DENORM_FLUSH_NONE;
1359-
if (FP64FP16InputDenormals)
1352+
if (FP64FP16Denormals == DenormalMode::getPreserveSign())
1353+
return FP_DENORM_FLUSH_IN_FLUSH_OUT;
1354+
if (FP64FP16Denormals.Output == DenormalMode::PreserveSign)
13601355
return FP_DENORM_FLUSH_OUT;
1361-
if (FP64FP16OutputDenormals)
1356+
if (FP64FP16Denormals.Input == DenormalMode::PreserveSign)
13621357
return FP_DENORM_FLUSH_IN;
1363-
return FP_DENORM_FLUSH_IN_FLUSH_OUT;
1358+
return FP_DENORM_FLUSH_NONE;
13641359
}
13651360

13661361
/// Returns true if a flag is compatible if it's enabled in the callee, but
@@ -1378,10 +1373,20 @@ struct SIModeRegisterDefaults {
13781373
return false;
13791374

13801375
// Allow inlining denormals enabled into denormals flushed functions.
1381-
return oneWayCompatible(FP64FP16InputDenormals, CalleeMode.FP64FP16InputDenormals) &&
1382-
oneWayCompatible(FP64FP16OutputDenormals, CalleeMode.FP64FP16OutputDenormals) &&
1383-
oneWayCompatible(FP32InputDenormals, CalleeMode.FP32InputDenormals) &&
1384-
oneWayCompatible(FP32OutputDenormals, CalleeMode.FP32OutputDenormals);
1376+
return oneWayCompatible(FP64FP16Denormals.Input !=
1377+
DenormalMode::PreserveSign,
1378+
CalleeMode.FP64FP16Denormals.Input !=
1379+
DenormalMode::PreserveSign) &&
1380+
oneWayCompatible(FP64FP16Denormals.Output !=
1381+
DenormalMode::PreserveSign,
1382+
CalleeMode.FP64FP16Denormals.Output !=
1383+
DenormalMode::PreserveSign) &&
1384+
oneWayCompatible(FP32Denormals.Input != DenormalMode::PreserveSign,
1385+
CalleeMode.FP32Denormals.Input !=
1386+
DenormalMode::PreserveSign) &&
1387+
oneWayCompatible(FP32Denormals.Output != DenormalMode::PreserveSign,
1388+
CalleeMode.FP32Denormals.Output !=
1389+
DenormalMode::PreserveSign);
13851390
}
13861391
};
13871392

0 commit comments

Comments
 (0)