@@ -1720,13 +1720,15 @@ bool AMDGPULegalizerInfo::legalizeFMad(
1720
1720
LLT Ty = MRI.getType (MI.getOperand (0 ).getReg ());
1721
1721
assert (Ty.isScalar ());
1722
1722
1723
+ MachineFunction &MF = B.getMF ();
1724
+ const SIMachineFunctionInfo *MFI = MF.getInfo <SIMachineFunctionInfo>();
1725
+
1723
1726
// TODO: Always legal with future ftz flag.
1724
- if (Ty == LLT::scalar (32 ) && !ST. hasFP32Denormals () )
1727
+ if (Ty == LLT::scalar (32 ) && !MFI-> getMode (). FP32Denormals )
1725
1728
return true ;
1726
- if (Ty == LLT::scalar (16 ) && !ST. hasFP16Denormals () )
1729
+ if (Ty == LLT::scalar (16 ) && !MFI-> getMode (). FP64FP16Denormals )
1727
1730
return true ;
1728
1731
1729
- MachineFunction &MF = B.getMF ();
1730
1732
1731
1733
MachineIRBuilder HelperBuilder (MI);
1732
1734
GISelObserverWrapper DummyObserver;
@@ -1897,7 +1899,8 @@ bool AMDGPULegalizerInfo::legalizeFastUnsafeFDIV(MachineInstr &MI,
1897
1899
if (!MF.getTarget ().Options .UnsafeFPMath && ResTy == S64)
1898
1900
return false ;
1899
1901
1900
- if (!Unsafe && ResTy == S32 && ST.hasFP32Denormals ())
1902
+ if (!Unsafe && ResTy == S32 &&
1903
+ MF.getInfo <SIMachineFunctionInfo>()->getMode ().FP32Denormals )
1901
1904
return false ;
1902
1905
1903
1906
if (auto CLHS = getConstantFPVRegVal (LHS, MRI)) {
@@ -1973,15 +1976,16 @@ bool AMDGPULegalizerInfo::legalizeFDIV16(MachineInstr &MI,
1973
1976
// Enable or disable FP32 denorm mode. When 'Enable' is true, emit instructions
1974
1977
// to enable denorm mode. When 'Enable' is false, disable denorm mode.
1975
1978
static void toggleSPDenormMode (bool Enable,
1979
+ MachineIRBuilder &B,
1976
1980
const GCNSubtarget &ST,
1977
- MachineIRBuilder &B ) {
1981
+ AMDGPU::SIModeRegisterDefaults Mode ) {
1978
1982
// Set SP denorm mode to this value.
1979
1983
unsigned SPDenormMode =
1980
1984
Enable ? FP_DENORM_FLUSH_NONE : FP_DENORM_FLUSH_IN_FLUSH_OUT;
1981
1985
1982
1986
if (ST.hasDenormModeInst ()) {
1983
1987
// Preserve default FP64FP16 denorm mode while updating FP32 mode.
1984
- unsigned DPDenormModeDefault = ST. hasFP64Denormals ()
1988
+ unsigned DPDenormModeDefault = Mode. FP64FP16Denormals
1985
1989
? FP_DENORM_FLUSH_NONE
1986
1990
: FP_DENORM_FLUSH_IN_FLUSH_OUT;
1987
1991
@@ -2008,6 +2012,8 @@ bool AMDGPULegalizerInfo::legalizeFDIV32(MachineInstr &MI,
2008
2012
Register Res = MI.getOperand (0 ).getReg ();
2009
2013
Register LHS = MI.getOperand (1 ).getReg ();
2010
2014
Register RHS = MI.getOperand (2 ).getReg ();
2015
+ const SIMachineFunctionInfo *MFI = B.getMF ().getInfo <SIMachineFunctionInfo>();
2016
+ AMDGPU::SIModeRegisterDefaults Mode = MFI->getMode ();
2011
2017
2012
2018
uint16_t Flags = MI.getFlags ();
2013
2019
@@ -2036,8 +2042,8 @@ bool AMDGPULegalizerInfo::legalizeFDIV32(MachineInstr &MI,
2036
2042
2037
2043
// FIXME: Doesn't correctly model the FP mode switch, and the FP operations
2038
2044
// aren't modeled as reading it.
2039
- if (!ST. hasFP32Denormals () )
2040
- toggleSPDenormMode (true , ST, B );
2045
+ if (!Mode. FP32Denormals )
2046
+ toggleSPDenormMode (true , B, ST, Mode );
2041
2047
2042
2048
auto Fma0 = B.buildFMA (S32, NegDivScale0, ApproxRcp, One, Flags);
2043
2049
auto Fma1 = B.buildFMA (S32, Fma0, ApproxRcp, ApproxRcp, Flags);
@@ -2046,8 +2052,8 @@ bool AMDGPULegalizerInfo::legalizeFDIV32(MachineInstr &MI,
2046
2052
auto Fma3 = B.buildFMA (S32, Fma2, Fma1, Mul, Flags);
2047
2053
auto Fma4 = B.buildFMA (S32, NegDivScale0, Fma3, NumeratorScaled, Flags);
2048
2054
2049
- if (!ST. hasFP32Denormals () )
2050
- toggleSPDenormMode (false , ST, B );
2055
+ if (!Mode. FP32Denormals )
2056
+ toggleSPDenormMode (false , B, ST, Mode );
2051
2057
2052
2058
auto Fmas = B.buildIntrinsic (Intrinsic::amdgcn_div_fmas, {S32}, false )
2053
2059
.addUse (Fma4.getReg (0 ))
0 commit comments