Add hidden flag to disable optimization passes (#2962)

It can be helpful to disable an optimization pass or set of passes in
select circumstances. This adds the ability to disable the gvn pass
only, but introduces a way to disable various passes just by accepting
the chosen string to represent them in HLSLOptions and using the
DisablePasses values to determine when a pass needs to be left out in
PassManagerBuilder.
This commit is contained in:
Greg Roth 2020-06-10 19:01:04 -06:00 коммит произвёл GitHub
Родитель b59671accf
Коммит 5f3ee4b904
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
10 изменённых файлов: 62 добавлений и 4 удалений

Просмотреть файл

@ -0,0 +1,21 @@
///////////////////////////////////////////////////////////////////////////////
// //
// HLSLOptimizationOptions.h //
// Copyright (C) Microsoft Corporation. All rights reserved. //
// This file is distributed under the University of Illinois Open Source //
// License. See LICENSE.TXT for details. //
// //
// Option defined related to optimization customization. //
// //
///////////////////////////////////////////////////////////////////////////////
#pragma once
namespace hlsl {
// Optimizations that can be disabled
struct OptimizationOptions {
unsigned DisableGVN : 1;
unsigned Reserved : 31;
};
}

Просмотреть файл

@ -18,6 +18,7 @@
#include "llvm/ADT/StringRef.h"
#include "llvm/Option/ArgList.h"
#include "dxc/dxcapi.h"
#include "dxc/Support/HLSLOptimizationOptions.h"
#include "dxc/Support/SPIRVOptions.h"
namespace llvm {
@ -187,6 +188,7 @@ public:
bool ResMayAlias = false; // OPT_res_may_alias
unsigned long ValVerMajor = UINT_MAX, ValVerMinor = UINT_MAX; // OPT_validator_version
unsigned ScanLimit = 0; // OPT_memdep_block_scan_limit
hlsl::OptimizationOptions DxcOptimizationOptions; // OPT_opt_disable
// Rewriter Options
RewriterOpts RWOpt;

Просмотреть файл

@ -156,6 +156,8 @@ def fno_honor_infinities : Flag<["-"], "fno-honor-infinities">, Group<hlsloptz_G
def flimited_precision_EQ : Joined<["-"], "flimited-precision=">, Group<hlsloptz_Group>;
def memdep_block_scan_limit : Separate<["-", "/"], "memdep-block-scan-limit">, Group<hlsloptz_Group>, Flags<[CoreOption, DriverOption, HelpHidden]>,
HelpText<"The number of instructions to scan in a block in memory dependency analysis.">;
def opt_disable : Separate<["-", "/"], "opt-disable">, Group<hlsloptz_Group>, Flags<[CoreOption, DriverOption, HelpHidden]>,
HelpText<"Disable this optimization.">;
/*
def fno_caret_diagnostics : Flag<["-"], "fno-caret-diagnostics">, Group<hlslcomp_Group>,

Просмотреть файл

@ -16,6 +16,7 @@
#define LLVM_TRANSFORMS_IPO_PASSMANAGERBUILDER_H
#include <vector>
#include "dxc/Support/HLSLOptimizationOptions.h" // HLSL Change
namespace hlsl {
class HLSLExtensionsCodegenHelper;
@ -131,6 +132,7 @@ public:
hlsl::HLSLExtensionsCodegenHelper *HLSLExtensionsCodeGen = nullptr; // HLSL Change
bool HLSLResMayAlias = false; // HLSL Change
unsigned ScanLimit = 0; // HLSL Change
hlsl::OptimizationOptions HLSLOptimizationOptions = {0}; // HLSL Change
private:
/// ExtensionList - This is list of all of the extensions that are registered.

Просмотреть файл

@ -492,6 +492,14 @@ int ReadDxcOpts(const OptTable *optionTable, unsigned flagsToInclude,
if (!limit.empty())
opts.ScanLimit = std::stoul(std::string(limit));
opts.DxcOptimizationOptions = {0};
std::vector<std::string> DisabledOptimizations = Args.getAllArgValues(OPT_opt_disable);
for (std::string opt : DisabledOptimizations) {
llvm::StringRef gvn("gvn");
if (gvn.equals_lower(opt))
opts.DxcOptimizationOptions.DisableGVN = true;
}
if (!opts.ForceRootSigVer.empty() && opts.ForceRootSigVer != "rootsig_1_0" &&
opts.ForceRootSigVer != "rootsig_1_1") {
errors << "Unsupported value '" << opts.ForceRootSigVer

Просмотреть файл

@ -466,9 +466,13 @@ void PassManagerBuilder::populateModulePassManager(
if (OptLevel > 1) {
if (EnableMLSM)
MPM.add(createMergedLoadStoreMotionPass()); // Merge ld/st in diamonds
MPM.add(createGVNPass(DisableGVNLoadPRE)); // Remove redundancies
if (!HLSLResMayAlias)
MPM.add(createDxilSimpleGVNHoistPass()); // HLSL Change - GVN hoist for code size.
// HLSL Change Begins
if (!(HLSLOptimizationOptions.DisableGVN)) {
MPM.add(createGVNPass(DisableGVNLoadPRE)); // Remove redundancies
if (!HLSLResMayAlias)
MPM.add(createDxilSimpleGVNHoistPass());
}
// HLSL Change Ends
}
// HLSL Change Begins.
// HLSL don't allow memcpy and memset.
@ -737,7 +741,8 @@ void PassManagerBuilder::addLTOOptimizationPasses(legacy::PassManagerBase &PM) {
// PM.add(createLICMPass()); // Hoist loop invariants.
if (EnableMLSM)
PM.add(createMergedLoadStoreMotionPass()); // Merge ld/st in diamonds.
PM.add(createGVNPass(DisableGVNLoadPRE)); // Remove redundancies.
if (!(HLSLOptimizationOptions.DisableGVN)) // HLSL Change
PM.add(createGVNPass(DisableGVNLoadPRE)); // Remove redundancies.
PM.add(createMemCpyOptPass()); // Remove dead memcpys.
// Nuke dead stores.

Просмотреть файл

@ -20,6 +20,7 @@
#include <string>
#include <vector>
#include "dxc/HLSL/HLSLExtensionsCodegenHelper.h" // HLSL change
#include "dxc/Support/HLSLOptimizationOptions.h" // HLSL Change
#include "dxc/Support/SPIRVOptions.h" // SPIR-V Change
namespace clang {
@ -220,6 +221,8 @@ public:
bool HLSLResMayAlias = false;
/// Lookback scan limit for memory dependencies
unsigned ScanLimit = 0;
/// Disabled optimization passes
hlsl::OptimizationOptions HLSLOptimizationOptions = {0};
// HLSL Change Ends
// SPIRV Change Starts

Просмотреть файл

@ -327,6 +327,7 @@ void EmitAssemblyHelper::CreatePasses() {
PMBuilder.HLSLExtensionsCodeGen = CodeGenOpts.HLSLExtensionsCodegen.get(); // HLSL Change
PMBuilder.HLSLResMayAlias = CodeGenOpts.HLSLResMayAlias; // HLSL Change
PMBuilder.ScanLimit = CodeGenOpts.ScanLimit; // HLSL Change
PMBuilder.HLSLOptimizationOptions = CodeGenOpts.HLSLOptimizationOptions; // HLSL Change
PMBuilder.DisableUnitAtATime = !CodeGenOpts.UnitAtATime;
PMBuilder.DisableUnrollLoops = !CodeGenOpts.UnrollLoops;

Просмотреть файл

@ -0,0 +1,13 @@
// RUN: %dxc -opt-disable gvn -T ps_6_0 %s | FileCheck %s
// Simple test to verify disabling of gvn pass
// Verify that GVN is disabled by the presence
// of the second sin(), which GVN would have removed
// CHECK: call float @dx.op.unary.f32
// CHECK: call float @dx.op.unary.f32
float main(float a : A) : SV_Target {
float res = sin(a);
return res + sin(a);
}

Просмотреть файл

@ -1107,6 +1107,7 @@ public:
compiler.getCodeGenOpts().HLSLAllowPreserveValues = Opts.AllowPreserveValues;
compiler.getCodeGenOpts().HLSLResMayAlias = Opts.ResMayAlias;
compiler.getCodeGenOpts().ScanLimit = Opts.ScanLimit;
compiler.getCodeGenOpts().HLSLOptimizationOptions = Opts.DxcOptimizationOptions;
compiler.getCodeGenOpts().HLSLAllResourcesBound = Opts.AllResourcesBound;
compiler.getCodeGenOpts().HLSLDefaultRowMajor = Opts.DefaultRowMajor;
compiler.getCodeGenOpts().HLSLPreferControlFlow = Opts.PreferFlowControl;