Skip to content

Commit 15b443f

Browse files
davidjwooigcbot
authored andcommitted
Move denormal state to metadata
Move denormal mode state to llvm metadata.
1 parent a33938c commit 15b443f

12 files changed

+67
-46
lines changed

IGC/AdaptorOCL/dllInterfaceCompute.cpp

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1420,15 +1420,16 @@ bool TranslateBuildSPMD(
14201420

14211421
// Set default denorm.
14221422
// Note that those values have been set to FLOAT_DENORM_FLUSH_TO_ZERO
1423+
CompOptions* compOpt = &oclContext.getModuleMetaData()->compOpt;
14231424
if (IGFX_GEN8_CORE <= oclContext.platform.GetPlatformFamily())
14241425
{
1425-
oclContext.m_floatDenormMode16 = FLOAT_DENORM_RETAIN;
1426-
oclContext.m_floatDenormMode32 = FLOAT_DENORM_RETAIN;
1427-
oclContext.m_floatDenormMode64 = FLOAT_DENORM_RETAIN;
1426+
compOpt->FloatDenormMode16 = FLOAT_DENORM_RETAIN;
1427+
compOpt->FloatDenormMode32 = FLOAT_DENORM_RETAIN;
1428+
compOpt->FloatDenormMode64 = FLOAT_DENORM_RETAIN;
14281429
}
14291430
if (oclContext.platform.hasBFTFDenormMode())
14301431
{
1431-
oclContext.m_floatDenormModeBFTF = FLOAT_DENORM_RETAIN;
1432+
compOpt->FloatDenormModeBFTF = FLOAT_DENORM_RETAIN;
14321433
}
14331434

14341435
unsigned PtrSzInBits = pKernelModule->getDataLayout().getPointerSizeInBits();
@@ -1504,12 +1505,12 @@ bool TranslateBuildSPMD(
15041505
ModuleMetaData* modMD = oclContext.getModuleMetaData();
15051506
if (modMD->compOpt.DenormsAreZero)
15061507
{
1507-
oclContext.m_floatDenormMode16 = FLOAT_DENORM_FLUSH_TO_ZERO;
1508-
oclContext.m_floatDenormMode32 = FLOAT_DENORM_FLUSH_TO_ZERO;
1508+
modMD->compOpt.FloatDenormMode16 = FLOAT_DENORM_FLUSH_TO_ZERO;
1509+
modMD->compOpt.FloatDenormMode32 = FLOAT_DENORM_FLUSH_TO_ZERO;
15091510
}
15101511
if (modMD->compOpt.BFTFDenormsAreZero)
15111512
{
1512-
oclContext.m_floatDenormModeBFTF = FLOAT_DENORM_FLUSH_TO_ZERO;
1513+
modMD->compOpt.FloatDenormModeBFTF = FLOAT_DENORM_FLUSH_TO_ZERO;
15131514
}
15141515
if (IGC_GET_FLAG_VALUE(ForceFastestSIMD))
15151516
{
@@ -1565,6 +1566,20 @@ bool TranslateBuildSPMD(
15651566
// Remove annotations for kernels that do not require recompilation
15661567
RebuildGlobalAnnotations(oclContext, pKernelModule);
15671568

1569+
// Set default denorm since metadata was cleared.
1570+
// Note that those values have been set to FLOAT_DENORM_FLUSH_TO_ZERO
1571+
compOpt = &oclContext.getModuleMetaData()->compOpt;
1572+
if (IGFX_GEN8_CORE <= oclContext.platform.GetPlatformFamily())
1573+
{
1574+
compOpt->FloatDenormMode16 = FLOAT_DENORM_RETAIN;
1575+
compOpt->FloatDenormMode32 = FLOAT_DENORM_RETAIN;
1576+
compOpt->FloatDenormMode64 = FLOAT_DENORM_RETAIN;
1577+
}
1578+
if (oclContext.platform.hasBFTFDenormMode())
1579+
{
1580+
compOpt->FloatDenormModeBFTF = FLOAT_DENORM_RETAIN;
1581+
}
1582+
15681583
for (auto it = pKernelModule->getFunctionList().begin(), ie = pKernelModule->getFunctionList().end(); it != ie;)
15691584
{
15701585
Function* pFunc = &*(it++);

IGC/Compiler/Builtins/BIFFlagCtrl/BIFFlagCtrlResolution.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ void BIFFlagCtrlResolution::FillFlagCtrl() {
4242
BIF_FLAG_CTRL_SET(RenderFamily, PtrCGC->platform.getPlatformInfo().eRenderCoreFamily);
4343
BIF_FLAG_CTRL_SET(
4444
FlushDenormals,
45-
((PtrCGC->m_floatDenormMode32 == FLOAT_DENORM_FLUSH_TO_ZERO) ||
45+
((PtrCGC->getModuleMetaData()->compOpt.FloatDenormMode32 == FLOAT_DENORM_FLUSH_TO_ZERO) ||
4646
PtrCGC->getModuleMetaData()->compOpt.DenormsAreZero));
4747
BIF_FLAG_CTRL_SET(FastRelaxedMath,
4848
PtrCGC->getModuleMetaData()->compOpt.RelaxedBuiltins);

IGC/Compiler/CISACodeGen/CISABuilder.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2909,13 +2909,13 @@ namespace IGC
29092909
uint imm_data = 0;
29102910

29112911
CodeGenContext* pCtx = m_program->GetContext();
2912-
if (pCtx->m_floatDenormMode16 == FLOAT_DENORM_RETAIN)
2912+
if (pCtx->getModuleMetaData()->compOpt.FloatDenormMode16 == FLOAT_DENORM_RETAIN)
29132913
imm_data |= 0x400;
2914-
if (pCtx->m_floatDenormMode32 == FLOAT_DENORM_RETAIN)
2914+
if (pCtx->getModuleMetaData()->compOpt.FloatDenormMode32 == FLOAT_DENORM_RETAIN)
29152915
imm_data |= 0x80;
2916-
if (pCtx->m_floatDenormMode64 == FLOAT_DENORM_RETAIN)
2916+
if (pCtx->getModuleMetaData()->compOpt.FloatDenormMode64 == FLOAT_DENORM_RETAIN)
29172917
imm_data |= 0x40;
2918-
if (pCtx->m_floatDenormModeBFTF == FLOAT_DENORM_RETAIN)
2918+
if (pCtx->getModuleMetaData()->compOpt.FloatDenormModeBFTF == FLOAT_DENORM_RETAIN)
29192919
imm_data |= (0x1 << 30);
29202920

29212921
uint RM_bits = 0;
@@ -4352,10 +4352,10 @@ namespace IGC
43524352

43534353
CodeGenContext* pCtx = m_program->GetContext();
43544354
bool needsDenormRetainForMathInstructions =
4355-
(pCtx->m_floatDenormMode16 == FLOAT_DENORM_FLUSH_TO_ZERO) ||
4356-
(pCtx->m_floatDenormMode32 == FLOAT_DENORM_FLUSH_TO_ZERO) ||
4357-
(pCtx->m_floatDenormMode64 == FLOAT_DENORM_FLUSH_TO_ZERO) ||
4358-
(m_program->m_Platform->hasBFTFDenormMode() && pCtx->m_floatDenormModeBFTF == FLOAT_DENORM_FLUSH_TO_ZERO);
4355+
(context->getModuleMetaData()->compOpt.FloatDenormMode16 == FLOAT_DENORM_FLUSH_TO_ZERO) ||
4356+
(context->getModuleMetaData()->compOpt.FloatDenormMode32 == FLOAT_DENORM_FLUSH_TO_ZERO) ||
4357+
(context->getModuleMetaData()->compOpt.FloatDenormMode64 == FLOAT_DENORM_FLUSH_TO_ZERO) ||
4358+
(m_program->m_Platform->hasBFTFDenormMode() && context->getModuleMetaData()->compOpt.FloatDenormModeBFTF == FLOAT_DENORM_FLUSH_TO_ZERO);
43594359

43604360
if (m_program->m_Platform->hasCorrectlyRoundedMacros() && needsDenormRetainForMathInstructions)
43614361
{

IGC/Compiler/CISACodeGen/EmitVISAPass.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21690,10 +21690,10 @@ void IGC::EmitPass::emitCanonicalize(llvm::Instruction* inst, const DstModifier&
2169021690
// A normalized fp value isn't changed.
2169121691
// The operation is done only if particular flags are set.
2169221692
// If the instruction should be emitted anyway, flushing a subnormal to zero has to implemented in other way.
21693-
CodeGenContext* pCodeGenContext = getAnalysis<CodeGenContextWrapper>().getCodeGenContext();
21694-
bool flushVal = pCodeGenContext->m_floatDenormMode16 == ::IGC::FLOAT_DENORM_FLUSH_TO_ZERO && inst->getType()->isHalfTy();
21695-
flushVal = flushVal || (pCodeGenContext->m_floatDenormMode32 == ::IGC::FLOAT_DENORM_FLUSH_TO_ZERO && inst->getType()->isFloatTy());
21696-
flushVal = flushVal || (pCodeGenContext->m_floatDenormMode64 == ::IGC::FLOAT_DENORM_FLUSH_TO_ZERO && inst->getType()->isDoubleTy());
21693+
CompOptions& compOpt = getAnalysis<CodeGenContextWrapper>().getCodeGenContext()->getModuleMetaData()->compOpt;
21694+
bool flushVal = compOpt.FloatDenormMode16 == ::IGC::FLOAT_DENORM_FLUSH_TO_ZERO && inst->getType()->isHalfTy();
21695+
flushVal = flushVal || (compOpt.FloatDenormMode32 == ::IGC::FLOAT_DENORM_FLUSH_TO_ZERO && inst->getType()->isFloatTy());
21696+
flushVal = flushVal || (compOpt.FloatDenormMode64 == ::IGC::FLOAT_DENORM_FLUSH_TO_ZERO && inst->getType()->isDoubleTy());
2169721697
if (flushVal || modifier.sat)
2169821698
{
2169921699
CVariable* inputVal = GetSymbol(inst->getOperand(0));

IGC/Compiler/CISACodeGen/PatternMatchPass.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -221,9 +221,9 @@ namespace IGC
221221
bool CodeGenPatternMatch::FlushesDenormsOnOutput(Instruction& I)
222222
{
223223
bool flushesDenorms = false;
224-
if ((m_ctx->m_floatDenormMode16 == IGC::FLOAT_DENORM_FLUSH_TO_ZERO && I.getType()->isHalfTy()) ||
225-
(m_ctx->m_floatDenormMode32 == IGC::FLOAT_DENORM_FLUSH_TO_ZERO && I.getType()->isFloatTy()) ||
226-
(m_ctx->m_floatDenormMode64 == IGC::FLOAT_DENORM_FLUSH_TO_ZERO && I.getType()->isDoubleTy()))
224+
if ((m_ctx->getModuleMetaData()->compOpt.FloatDenormMode16 == IGC::FLOAT_DENORM_FLUSH_TO_ZERO && I.getType()->isHalfTy()) ||
225+
(m_ctx->getModuleMetaData()->compOpt.FloatDenormMode32 == IGC::FLOAT_DENORM_FLUSH_TO_ZERO && I.getType()->isFloatTy()) ||
226+
(m_ctx->getModuleMetaData()->compOpt.FloatDenormMode64 == IGC::FLOAT_DENORM_FLUSH_TO_ZERO && I.getType()->isDoubleTy()))
227227
{
228228
switch (GetOpCode(&I))
229229
{
@@ -294,9 +294,9 @@ namespace IGC
294294
bool CodeGenPatternMatch::FlushesDenormsOnInput(Instruction& I)
295295
{
296296
bool flushesDenorms = false;
297-
if ((m_ctx->m_floatDenormMode16 == IGC::FLOAT_DENORM_FLUSH_TO_ZERO && I.getType()->isHalfTy()) ||
298-
(m_ctx->m_floatDenormMode32 == IGC::FLOAT_DENORM_FLUSH_TO_ZERO && I.getType()->isFloatTy()) ||
299-
(m_ctx->m_floatDenormMode64 == IGC::FLOAT_DENORM_FLUSH_TO_ZERO && I.getType()->isDoubleTy()))
297+
if ((m_ctx->getModuleMetaData()->compOpt.FloatDenormMode16 == IGC::FLOAT_DENORM_FLUSH_TO_ZERO && I.getType()->isHalfTy()) ||
298+
(m_ctx->getModuleMetaData()->compOpt.FloatDenormMode32 == IGC::FLOAT_DENORM_FLUSH_TO_ZERO && I.getType()->isFloatTy()) ||
299+
(m_ctx->getModuleMetaData()->compOpt.FloatDenormMode64 == IGC::FLOAT_DENORM_FLUSH_TO_ZERO && I.getType()->isDoubleTy()))
300300
{
301301
switch (GetOpCode(&I))
302302
{
@@ -3593,8 +3593,8 @@ namespace IGC
35933593
IGC_ASSERT(isa<Instruction>(I.getOperand(0)) || isa<Argument>(I.getOperand(0)));
35943594
// Current implementation assumes that mix mode is disabled if
35953595
// half float or 32-bit float denorms must be flushed.
3596-
if (m_ctx->m_floatDenormMode16 == IGC::FLOAT_DENORM_FLUSH_TO_ZERO ||
3597-
m_ctx->m_floatDenormMode32 == IGC::FLOAT_DENORM_FLUSH_TO_ZERO)
3596+
if (m_ctx->getModuleMetaData()->compOpt.FloatDenormMode16 == IGC::FLOAT_DENORM_FLUSH_TO_ZERO ||
3597+
m_ctx->getModuleMetaData()->compOpt.FloatDenormMode32 == IGC::FLOAT_DENORM_FLUSH_TO_ZERO)
35983598
{
35993599
IGC_ASSERT(!m_Platform.supportMixMode() || m_ctx->getModuleMetaData()->disableMixMode);
36003600
}

IGC/Compiler/CodeGenContext.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -440,10 +440,6 @@ namespace IGC
440440
PRINT_CTX_MEMBER(m_enableSampleMultiversioning);
441441
PRINT_CTX_MEMBER(m_enableSimdVariantCompilation);
442442
PRINT_CTX_MEMBER(m_enableSubroutine);
443-
PRINT_CTX_MEMBER(m_floatDenormMode16);
444-
PRINT_CTX_MEMBER(m_floatDenormMode32);
445-
PRINT_CTX_MEMBER(m_floatDenormMode64);
446-
PRINT_CTX_MEMBER(m_floatDenormModeBFTF);
447443
PRINT_CTX_MEMBER(m_ForceEarlyZMathCheck);
448444
PRINT_CTX_MEMBER(m_hasDPDivSqrtEmu);
449445
PRINT_CTX_MEMBER(m_hasDPEmu);

IGC/Compiler/CodeGenPublic.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -916,11 +916,6 @@ namespace IGC
916916
/// output: list of buffer IDs which are promoted to direct AS
917917
// Map of promoted buffer ids with their respective buffer offsets if needed. Buffer offset will be -1 if no need of buffer offset
918918
std::map<unsigned, int> m_buffersPromotedToDirectAS;
919-
// float 16, float32 and float64 denorm mode
920-
Float_DenormMode m_floatDenormMode16 = FLOAT_DENORM_FLUSH_TO_ZERO;
921-
Float_DenormMode m_floatDenormMode32 = FLOAT_DENORM_FLUSH_TO_ZERO;
922-
Float_DenormMode m_floatDenormMode64 = FLOAT_DENORM_FLUSH_TO_ZERO;
923-
Float_DenormMode m_floatDenormModeBFTF = FLOAT_DENORM_FLUSH_TO_ZERO;
924919

925920
PushConstantMode m_pushConstantMode = PushConstantMode::DEFAULT;
926921

IGC/Compiler/CustomSafeOptPass.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4259,10 +4259,10 @@ Constant* IGCConstProp::ConstantFoldCallInstruction(CallInst* inst)
42594259
// Please, be aware of the fact that clients can understand the term canonical FP value in other way.
42604260
if (C0)
42614261
{
4262-
CodeGenContext* pCodeGenContext = getAnalysis<CodeGenContextWrapper>().getCodeGenContext();
4263-
bool flushVal = pCodeGenContext->m_floatDenormMode16 == ::IGC::FLOAT_DENORM_FLUSH_TO_ZERO && inst->getType()->isHalfTy();
4264-
flushVal = flushVal || (pCodeGenContext->m_floatDenormMode32 == ::IGC::FLOAT_DENORM_FLUSH_TO_ZERO && inst->getType()->isFloatTy());
4265-
flushVal = flushVal || (pCodeGenContext->m_floatDenormMode64 == ::IGC::FLOAT_DENORM_FLUSH_TO_ZERO && inst->getType()->isDoubleTy());
4262+
CompOptions& compOpt = getAnalysis<CodeGenContextWrapper>().getCodeGenContext()->getModuleMetaData()->compOpt;
4263+
bool flushVal = compOpt.FloatDenormMode16 == ::IGC::FLOAT_DENORM_FLUSH_TO_ZERO && inst->getType()->isHalfTy();
4264+
flushVal = flushVal || (compOpt.FloatDenormMode32 == ::IGC::FLOAT_DENORM_FLUSH_TO_ZERO && inst->getType()->isFloatTy());
4265+
flushVal = flushVal || (compOpt.FloatDenormMode64 == ::IGC::FLOAT_DENORM_FLUSH_TO_ZERO && inst->getType()->isDoubleTy());
42664266
C = constantFolder.CreateCanonicalize(C0, flushVal);
42674267
}
42684268
}

IGC/Compiler/CustomUnsafeOptPass.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ bool CustomUnsafeOptPass::runOnFunction(Function& F)
136136
{
137137
m_disableReorderingOpt = true;
138138
}
139-
if (m_ctx->type == ShaderType::COMPUTE_SHADER && m_ctx->m_floatDenormMode64 == FLOAT_DENORM_RETAIN)
139+
if (m_ctx->type == ShaderType::COMPUTE_SHADER && m_ctx->getModuleMetaData()->compOpt.FloatDenormMode64 == FLOAT_DENORM_RETAIN)
140140
{
141141
m_disableReorderingOpt = true;
142142
}

IGC/Compiler/Optimizer/PreCompiledFuncImport.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2225,7 +2225,7 @@ void PreCompiledFuncImport::visitCallInst(llvm::CallInst& I)
22252225
args[1] = I.getOperand(1);
22262226

22272227
auto pMD = getAnalysis<MetaDataUtilsWrapper>().getModuleMetaData();
2228-
int ftz = (m_pCtx->m_floatDenormMode32 == FLOAT_DENORM_FLUSH_TO_ZERO) ? 1 : 0;
2228+
int ftz = (pMD->compOpt.FloatDenormMode32 == FLOAT_DENORM_FLUSH_TO_ZERO) ? 1 : 0;
22292229
int daz = (pMD->compOpt.DenormsAreZero) ? 1 : 0;
22302230
args[2] = ConstantInt::get(Type::getInt32Ty(I.getContext()), ftz);
22312231
args[3] = ConstantInt::get(Type::getInt32Ty(I.getContext()), daz);

IGC/Compiler/WorkaroundAnalysisPass.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -588,9 +588,9 @@ void WAFMinFMax::visitCallInst(CallInst& I)
588588
EnableFMaxFMinPlusZero);
589589
bool hasNaNs = !modMD->compOpt.FiniteMathOnly;
590590
if (hasNaNs && minmaxModeSetByDenormBit &&
591-
((Ty->isFloatTy() && (m_ctx->m_floatDenormMode32 == FLOAT_DENORM_RETAIN)) ||
592-
(Ty->isDoubleTy() && (m_ctx->m_floatDenormMode64 == FLOAT_DENORM_RETAIN)) ||
593-
(Ty->isHalfTy() && (m_ctx->m_floatDenormMode16 == FLOAT_DENORM_RETAIN))))
591+
((Ty->isFloatTy() && (modMD->compOpt.FloatDenormMode32 == FLOAT_DENORM_RETAIN)) ||
592+
(Ty->isDoubleTy() && (modMD->compOpt.FloatDenormMode64 == FLOAT_DENORM_RETAIN)) ||
593+
(Ty->isHalfTy() && (modMD->compOpt.FloatDenormMode16 == FLOAT_DENORM_RETAIN))))
594594
{
595595
m_builder->SetInsertPoint(&I);
596596

IGC/common/MDFrameWork.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,16 @@ enum class ShaderTypeMD
114114
unsigned int MipCount = 0;
115115
};
116116

117+
// The real declaration is in CodeGenPublicEnums.h.
118+
// This declaration exists to fool the autogeneration script into generating the relevant parsing code.
119+
#if 0
120+
enum Float_DenormMode
121+
{
122+
FLOAT_DENORM_FLUSH_TO_ZERO = 0,
123+
FLOAT_DENORM_RETAIN,
124+
};
125+
#endif
126+
117127
struct ArgDependencyInfoMD
118128
{
119129
int argDependency = 0;
@@ -381,6 +391,11 @@ enum class ShaderTypeMD
381391
bool MadEnable = false;
382392
bool NoSignedZeros = false;
383393
bool NoNaNs = false;
394+
// float 16, float32 and float64 denorm mode
395+
Float_DenormMode FloatDenormMode16 = FLOAT_DENORM_FLUSH_TO_ZERO;
396+
Float_DenormMode FloatDenormMode32 = FLOAT_DENORM_FLUSH_TO_ZERO;
397+
Float_DenormMode FloatDenormMode64 = FLOAT_DENORM_FLUSH_TO_ZERO;
398+
Float_DenormMode FloatDenormModeBFTF = FLOAT_DENORM_FLUSH_TO_ZERO;
384399

385400
// default rounding modes
386401
unsigned FloatRoundingMode = IGC::ROUND_TO_NEAREST_EVEN;

0 commit comments

Comments
 (0)