forked from OSchip/llvm-project
[Remarks][1/2] Expand remarks hotness threshold option support in more tools
This is the #1 of 2 changes that make remarks hotness threshold option available in more tools. The changes also allow the threshold to sync with hotness threshold from profile summary with special value 'auto'. This change modifies the interface of lto::setupLLVMOptimizationRemarks() to accept remarks hotness threshold. Update all the tools that use it with remarks hotness threshold options: * lld: '--opt-remarks-hotness-threshold=' * llvm-lto2: '--pass-remarks-hotness-threshold=' * llvm-lto: '--lto-pass-remarks-hotness-threshold=' * gold plugin: '-plugin-opt=opt-remarks-hotness-threshold=' Differential Revision: https://reviews.llvm.org/D85809
This commit is contained in:
parent
bcc802fa36
commit
3acda91742
|
@ -111,6 +111,7 @@ struct Configuration {
|
||||||
llvm::StringRef mapFile;
|
llvm::StringRef mapFile;
|
||||||
llvm::StringRef outputFile;
|
llvm::StringRef outputFile;
|
||||||
llvm::StringRef optRemarksFilename;
|
llvm::StringRef optRemarksFilename;
|
||||||
|
llvm::Optional<uint64_t> optRemarksHotnessThreshold = 0;
|
||||||
llvm::StringRef optRemarksPasses;
|
llvm::StringRef optRemarksPasses;
|
||||||
llvm::StringRef optRemarksFormat;
|
llvm::StringRef optRemarksFormat;
|
||||||
llvm::StringRef progName;
|
llvm::StringRef progName;
|
||||||
|
|
|
@ -48,6 +48,7 @@
|
||||||
#include "llvm/ADT/StringExtras.h"
|
#include "llvm/ADT/StringExtras.h"
|
||||||
#include "llvm/ADT/StringSwitch.h"
|
#include "llvm/ADT/StringSwitch.h"
|
||||||
#include "llvm/LTO/LTO.h"
|
#include "llvm/LTO/LTO.h"
|
||||||
|
#include "llvm/Remarks/HotnessThresholdParser.h"
|
||||||
#include "llvm/Support/CommandLine.h"
|
#include "llvm/Support/CommandLine.h"
|
||||||
#include "llvm/Support/Compression.h"
|
#include "llvm/Support/Compression.h"
|
||||||
#include "llvm/Support/GlobPattern.h"
|
#include "llvm/Support/GlobPattern.h"
|
||||||
|
@ -1013,6 +1014,17 @@ static void readConfigs(opt::InputArgList &args) {
|
||||||
config->oFormatBinary = isOutputFormatBinary(args);
|
config->oFormatBinary = isOutputFormatBinary(args);
|
||||||
config->omagic = args.hasFlag(OPT_omagic, OPT_no_omagic, false);
|
config->omagic = args.hasFlag(OPT_omagic, OPT_no_omagic, false);
|
||||||
config->optRemarksFilename = args.getLastArgValue(OPT_opt_remarks_filename);
|
config->optRemarksFilename = args.getLastArgValue(OPT_opt_remarks_filename);
|
||||||
|
|
||||||
|
// Parse remarks hotness threshold. Valid value is either integer or 'auto'.
|
||||||
|
if (auto *arg = args.getLastArg(OPT_opt_remarks_hotness_threshold)) {
|
||||||
|
auto resultOrErr = remarks::parseHotnessThresholdOption(arg->getValue());
|
||||||
|
if (!resultOrErr)
|
||||||
|
error(arg->getSpelling() + ": invalid argument '" + arg->getValue() +
|
||||||
|
"', only integer or 'auto' is supported");
|
||||||
|
else
|
||||||
|
config->optRemarksHotnessThreshold = *resultOrErr;
|
||||||
|
}
|
||||||
|
|
||||||
config->optRemarksPasses = args.getLastArgValue(OPT_opt_remarks_passes);
|
config->optRemarksPasses = args.getLastArgValue(OPT_opt_remarks_passes);
|
||||||
config->optRemarksWithHotness = args.hasArg(OPT_opt_remarks_with_hotness);
|
config->optRemarksWithHotness = args.hasArg(OPT_opt_remarks_with_hotness);
|
||||||
config->optRemarksFormat = args.getLastArgValue(OPT_opt_remarks_format);
|
config->optRemarksFormat = args.getLastArgValue(OPT_opt_remarks_format);
|
||||||
|
|
|
@ -143,6 +143,7 @@ static lto::Config createConfig() {
|
||||||
c.RemarksFilename = std::string(config->optRemarksFilename);
|
c.RemarksFilename = std::string(config->optRemarksFilename);
|
||||||
c.RemarksPasses = std::string(config->optRemarksPasses);
|
c.RemarksPasses = std::string(config->optRemarksPasses);
|
||||||
c.RemarksWithHotness = config->optRemarksWithHotness;
|
c.RemarksWithHotness = config->optRemarksWithHotness;
|
||||||
|
c.RemarksHotnessThreshold = config->optRemarksHotnessThreshold;
|
||||||
c.RemarksFormat = std::string(config->optRemarksFormat);
|
c.RemarksFormat = std::string(config->optRemarksFormat);
|
||||||
|
|
||||||
c.SampleProfile = std::string(config->ltoSampleProfile);
|
c.SampleProfile = std::string(config->ltoSampleProfile);
|
||||||
|
|
|
@ -548,6 +548,10 @@ def disable_verify: F<"disable-verify">;
|
||||||
defm mllvm: Eq<"mllvm", "Additional arguments to forward to LLVM's option processing">;
|
defm mllvm: Eq<"mllvm", "Additional arguments to forward to LLVM's option processing">;
|
||||||
def opt_remarks_filename: Separate<["--"], "opt-remarks-filename">,
|
def opt_remarks_filename: Separate<["--"], "opt-remarks-filename">,
|
||||||
HelpText<"YAML output file for optimization remarks">;
|
HelpText<"YAML output file for optimization remarks">;
|
||||||
|
defm opt_remarks_hotness_threshold: EEq<"opt-remarks-hotness-threshold",
|
||||||
|
"Minimum profile count required for an optimization remark to be output."
|
||||||
|
" Use 'auto' to apply the threshold from profile summary.">,
|
||||||
|
MetaVarName<"<value>">;
|
||||||
def opt_remarks_passes: Separate<["--"], "opt-remarks-passes">,
|
def opt_remarks_passes: Separate<["--"], "opt-remarks-passes">,
|
||||||
HelpText<"Regex for the passes that need to be serialized to the output file">;
|
HelpText<"Regex for the passes that need to be serialized to the output file">;
|
||||||
def opt_remarks_with_hotness: FF<"opt-remarks-with-hotness">,
|
def opt_remarks_with_hotness: FF<"opt-remarks-with-hotness">,
|
||||||
|
@ -596,6 +600,21 @@ def: J<"plugin-opt=cs-profile-path=">,
|
||||||
def: J<"plugin-opt=obj-path=">,
|
def: J<"plugin-opt=obj-path=">,
|
||||||
Alias<lto_obj_path_eq>,
|
Alias<lto_obj_path_eq>,
|
||||||
HelpText<"Alias for --lto-obj-path=">;
|
HelpText<"Alias for --lto-obj-path=">;
|
||||||
|
def: J<"plugin-opt=opt-remarks-filename=">,
|
||||||
|
Alias<opt_remarks_filename>,
|
||||||
|
HelpText<"Alias for --opt-remarks-filename">;
|
||||||
|
def: J<"plugin-opt=opt-remarks-passes=">,
|
||||||
|
Alias<opt_remarks_passes>,
|
||||||
|
HelpText<"Alias for --opt-remarks-passes">;
|
||||||
|
def: J<"plugin-opt=opt-remarks-format=">,
|
||||||
|
Alias<opt_remarks_format>,
|
||||||
|
HelpText<"Alias for --opt-remarks-format">;
|
||||||
|
def: F<"plugin-opt=opt-remarks-with-hotness">,
|
||||||
|
Alias<opt_remarks_with_hotness>,
|
||||||
|
HelpText<"Alias for --opt-remarks-with_hotness">;
|
||||||
|
def: J<"plugin-opt=opt-remarks-hotness-threshold=">,
|
||||||
|
Alias<opt_remarks_hotness_threshold>,
|
||||||
|
HelpText<"Alias for --opt-remarks-hotness-threshold">;
|
||||||
def: J<"plugin-opt=sample-profile=">,
|
def: J<"plugin-opt=sample-profile=">,
|
||||||
Alias<lto_sample_profile>, HelpText<"Alias for --lto-sample-profile">;
|
Alias<lto_sample_profile>, HelpText<"Alias for --lto-sample-profile">;
|
||||||
def: F<"plugin-opt=save-temps">, Alias<save_temps>, HelpText<"Alias for --save-temps">;
|
def: F<"plugin-opt=save-temps">, Alias<save_temps>, HelpText<"Alias for --save-temps">;
|
||||||
|
|
|
@ -1,19 +1,25 @@
|
||||||
; REQUIRES: x86
|
; REQUIRES: x86
|
||||||
; RUN: llvm-as %s -o %t.o
|
; RUN: llvm-as %s -o %t.o
|
||||||
|
|
||||||
; RUN: rm -f %t.yaml
|
; RUN: rm -f %t.yaml %t1.yaml %t.hot.yaml %t.t300.yaml %t.t301.yaml
|
||||||
; RUN: ld.lld --opt-remarks-filename %t.yaml %t.o -o %t -shared -save-temps
|
; RUN: ld.lld --opt-remarks-filename %t.yaml %t.o -o %t -shared -save-temps
|
||||||
; RUN: llvm-dis %t.0.4.opt.bc -o - | FileCheck %s
|
; RUN: llvm-dis %t.0.4.opt.bc -o - | FileCheck %s
|
||||||
; RUN: ld.lld --opt-remarks-with-hotness --opt-remarks-filename %t.hot.yaml \
|
; RUN: ld.lld --opt-remarks-with-hotness --opt-remarks-filename %t.hot.yaml \
|
||||||
; RUN: %t.o -o %t -shared
|
; RUN: %t.o -o %t -shared
|
||||||
|
; RUN: ld.lld --opt-remarks-with-hotness --opt-remarks-hotness-threshold=300 \
|
||||||
|
; RUN: --opt-remarks-filename %t.t300.yaml %t.o -o %t -shared
|
||||||
|
; RUN: ld.lld --opt-remarks-with-hotness --opt-remarks-hotness-threshold=301 \
|
||||||
|
; RUN: --opt-remarks-filename %t.t301.yaml %t.o -o %t -shared
|
||||||
; RUN: cat %t.yaml | FileCheck %s -check-prefix=YAML
|
; RUN: cat %t.yaml | FileCheck %s -check-prefix=YAML
|
||||||
; RUN: cat %t.hot.yaml | FileCheck %s -check-prefix=YAML-HOT
|
; RUN: cat %t.hot.yaml | FileCheck %s -check-prefix=YAML-HOT
|
||||||
|
; RUN: FileCheck %s -check-prefix=YAML-HOT < %t.t300.yaml
|
||||||
|
; RUN: count 0 < %t.t301.yaml
|
||||||
; RUN: ld.lld --opt-remarks-filename %t1.yaml --opt-remarks-passes inline %t.o \
|
; RUN: ld.lld --opt-remarks-filename %t1.yaml --opt-remarks-passes inline %t.o \
|
||||||
; RUN: -o /dev/null -shared
|
; RUN: -o /dev/null -shared
|
||||||
; RUN: cat %t1.yaml | FileCheck %s -check-prefix=YAML-PASSES
|
; RUN: cat %t1.yaml | FileCheck %s -check-prefix=YAML-PASSES
|
||||||
; RUN: ld.lld --opt-remarks-filename %t1.yaml --opt-remarks-format yaml %t.o \
|
; RUN: ld.lld --opt-remarks-filename %t1.yaml --opt-remarks-format yaml %t.o \
|
||||||
; RUN: -o /dev/null -shared
|
; RUN: -o /dev/null -shared
|
||||||
; RUN: cat %t.yaml | FileCheck %s -check-prefix=YAML
|
; RUN: FileCheck %s -check-prefix=YAML < %t1.yaml
|
||||||
|
|
||||||
; Check that @tinkywinky is inlined after optimizations.
|
; Check that @tinkywinky is inlined after optimizations.
|
||||||
; CHECK-LABEL: define i32 @main
|
; CHECK-LABEL: define i32 @main
|
||||||
|
|
|
@ -222,13 +222,20 @@ public:
|
||||||
void setDiagnosticsHotnessRequested(bool Requested);
|
void setDiagnosticsHotnessRequested(bool Requested);
|
||||||
|
|
||||||
/// Return the minimum hotness value a diagnostic would need in order
|
/// Return the minimum hotness value a diagnostic would need in order
|
||||||
/// to be included in optimization diagnostics. If there is no minimum, this
|
/// to be included in optimization diagnostics.
|
||||||
/// returns None.
|
///
|
||||||
|
/// Three possible return values:
|
||||||
|
/// 0 - threshold is disabled. Everything will be printed out.
|
||||||
|
/// positive int - threshold is set.
|
||||||
|
/// UINT64_MAX - threshold is not yet set, and needs to be synced from
|
||||||
|
/// profile summary. Note that in case of missing profile
|
||||||
|
/// summary, threshold will be kept at "MAX", effectively
|
||||||
|
/// suppresses all remarks output.
|
||||||
uint64_t getDiagnosticsHotnessThreshold() const;
|
uint64_t getDiagnosticsHotnessThreshold() const;
|
||||||
|
|
||||||
/// Set the minimum hotness value a diagnostic needs in order to be
|
/// Set the minimum hotness value a diagnostic needs in order to be
|
||||||
/// included in optimization diagnostics.
|
/// included in optimization diagnostics.
|
||||||
void setDiagnosticsHotnessThreshold(uint64_t Threshold);
|
void setDiagnosticsHotnessThreshold(Optional<uint64_t> Threshold);
|
||||||
|
|
||||||
/// The "main remark streamer" used by all the specialized remark streamers.
|
/// The "main remark streamer" used by all the specialized remark streamers.
|
||||||
/// This streamer keeps generic remark metadata in memory throughout the life
|
/// This streamer keeps generic remark metadata in memory throughout the life
|
||||||
|
|
|
@ -79,16 +79,15 @@ Expected<std::unique_ptr<ToolOutputFile>>
|
||||||
setupLLVMOptimizationRemarks(LLVMContext &Context, StringRef RemarksFilename,
|
setupLLVMOptimizationRemarks(LLVMContext &Context, StringRef RemarksFilename,
|
||||||
StringRef RemarksPasses, StringRef RemarksFormat,
|
StringRef RemarksPasses, StringRef RemarksFormat,
|
||||||
bool RemarksWithHotness,
|
bool RemarksWithHotness,
|
||||||
unsigned RemarksHotnessThreshold = 0);
|
Optional<uint64_t> RemarksHotnessThreshold = 0);
|
||||||
|
|
||||||
/// Setup optimization remarks that output directly to a raw_ostream.
|
/// Setup optimization remarks that output directly to a raw_ostream.
|
||||||
/// \p OS is managed by the caller and should be open for writing as long as \p
|
/// \p OS is managed by the caller and should be open for writing as long as \p
|
||||||
/// Context is streaming remarks to it.
|
/// Context is streaming remarks to it.
|
||||||
Error setupLLVMOptimizationRemarks(LLVMContext &Context, raw_ostream &OS,
|
Error setupLLVMOptimizationRemarks(
|
||||||
StringRef RemarksPasses,
|
LLVMContext &Context, raw_ostream &OS, StringRef RemarksPasses,
|
||||||
StringRef RemarksFormat,
|
StringRef RemarksFormat, bool RemarksWithHotness,
|
||||||
bool RemarksWithHotness,
|
Optional<uint64_t> RemarksHotnessThreshold = 0);
|
||||||
unsigned RemarksHotnessThreshold = 0);
|
|
||||||
|
|
||||||
} // end namespace llvm
|
} // end namespace llvm
|
||||||
|
|
||||||
|
|
|
@ -121,6 +121,21 @@ struct Config {
|
||||||
/// Whether to emit optimization remarks with hotness informations.
|
/// Whether to emit optimization remarks with hotness informations.
|
||||||
bool RemarksWithHotness = false;
|
bool RemarksWithHotness = false;
|
||||||
|
|
||||||
|
/// The minimum hotness value a diagnostic needs in order to be included in
|
||||||
|
/// optimization diagnostics.
|
||||||
|
///
|
||||||
|
/// The threshold is an Optional value, which maps to one of the 3 states:
|
||||||
|
/// 1. 0 => threshold disabled. All emarks will be printed.
|
||||||
|
/// 2. positive int => manual threshold by user. Remarks with hotness exceed
|
||||||
|
/// threshold will be printed.
|
||||||
|
/// 3. None => 'auto' threshold by user. The actual value is not
|
||||||
|
/// available at command line, but will be synced with
|
||||||
|
/// hotness threhold from profile summary during
|
||||||
|
/// compilation.
|
||||||
|
///
|
||||||
|
/// If threshold option is not specified, it is disabled by default.
|
||||||
|
llvm::Optional<uint64_t> RemarksHotnessThreshold = 0;
|
||||||
|
|
||||||
/// The format used for serializing remarks (default: YAML).
|
/// The format used for serializing remarks (default: YAML).
|
||||||
std::string RemarksFormat = "";
|
std::string RemarksFormat = "";
|
||||||
|
|
||||||
|
|
|
@ -82,10 +82,10 @@ std::string getThinLTOOutputFile(const std::string &Path,
|
||||||
const std::string &NewPrefix);
|
const std::string &NewPrefix);
|
||||||
|
|
||||||
/// Setup optimization remarks.
|
/// Setup optimization remarks.
|
||||||
Expected<std::unique_ptr<ToolOutputFile>>
|
Expected<std::unique_ptr<ToolOutputFile>> setupLLVMOptimizationRemarks(
|
||||||
setupLLVMOptimizationRemarks(LLVMContext &Context, StringRef RemarksFilename,
|
LLVMContext &Context, StringRef RemarksFilename, StringRef RemarksPasses,
|
||||||
StringRef RemarksPasses, StringRef RemarksFormat,
|
StringRef RemarksFormat, bool RemarksWithHotness,
|
||||||
bool RemarksWithHotness, int Count = -1);
|
Optional<uint64_t> RemarksHotnessThreshold = 0, int Count = -1);
|
||||||
|
|
||||||
/// Setups the output file for saving statistics.
|
/// Setups the output file for saving statistics.
|
||||||
Expected<std::unique_ptr<ToolOutputFile>>
|
Expected<std::unique_ptr<ToolOutputFile>>
|
||||||
|
|
|
@ -0,0 +1,63 @@
|
||||||
|
//===- HotnessThresholdParser.h - Parser for hotness threshold --*- C++ -*-===//
|
||||||
|
//
|
||||||
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||||
|
// See https://llvm.org/LICENSE.txt for license information.
|
||||||
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
///
|
||||||
|
/// \file
|
||||||
|
/// This file implements a simple parser to decode commandline option for
|
||||||
|
/// remarks hotness threshold that supports both int and a special 'auto' value.
|
||||||
|
///
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#ifndef LLVM_REMARKS_HOTNESSTHRESHOLDPARSER_H
|
||||||
|
#define LLVM_REMARKS_HOTNESSTHRESHOLDPARSER_H
|
||||||
|
|
||||||
|
#include "llvm/ADT/Optional.h"
|
||||||
|
#include "llvm/Support/CommandLine.h"
|
||||||
|
|
||||||
|
namespace llvm {
|
||||||
|
namespace remarks {
|
||||||
|
|
||||||
|
// Parse remarks hotness threshold argument value.
|
||||||
|
// Valid option values are
|
||||||
|
// 1. integer: manually specified threshold; or
|
||||||
|
// 2. string 'auto': automatically get threshold from profile summary.
|
||||||
|
//
|
||||||
|
// Return None Optional if 'auto' is specified, indicating the value will
|
||||||
|
// be filled later during PSI.
|
||||||
|
inline Expected<Optional<uint64_t>> parseHotnessThresholdOption(StringRef Arg) {
|
||||||
|
if (Arg == "auto")
|
||||||
|
return None;
|
||||||
|
|
||||||
|
int64_t Val;
|
||||||
|
if (Arg.getAsInteger(10, Val))
|
||||||
|
return createStringError(llvm::inconvertibleErrorCode(),
|
||||||
|
"Not an integer: %s", Arg.data());
|
||||||
|
|
||||||
|
// Negative integer effectively means no threshold
|
||||||
|
return Val < 0 ? 0 : Val;
|
||||||
|
}
|
||||||
|
|
||||||
|
// A simple CL parser for '*-remarks-hotness-threshold='
|
||||||
|
class HotnessThresholdParser : public cl::parser<Optional<uint64_t>> {
|
||||||
|
public:
|
||||||
|
HotnessThresholdParser(cl::Option &O) : cl::parser<Optional<uint64_t>>(O) {}
|
||||||
|
|
||||||
|
bool parse(cl::Option &O, StringRef ArgName, StringRef Arg,
|
||||||
|
Optional<uint64_t> &V) {
|
||||||
|
auto ResultOrErr = parseHotnessThresholdOption(Arg);
|
||||||
|
if (!ResultOrErr)
|
||||||
|
return O.error("Invalid argument '" + Arg +
|
||||||
|
"', only integer or 'auto' is supported.");
|
||||||
|
|
||||||
|
V = *ResultOrErr;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace remarks
|
||||||
|
} // namespace llvm
|
||||||
|
#endif // LLVM_REMARKS_HOTNESSTHRESHOLDPARSER_H
|
|
@ -1481,7 +1481,7 @@ public:
|
||||||
|
|
||||||
template <class... Mods>
|
template <class... Mods>
|
||||||
explicit opt(const Mods &... Ms)
|
explicit opt(const Mods &... Ms)
|
||||||
: Option(Optional, NotHidden), Parser(*this) {
|
: Option(llvm::cl::Optional, NotHidden), Parser(*this) {
|
||||||
apply(this, Ms...);
|
apply(this, Ms...);
|
||||||
done();
|
done();
|
||||||
}
|
}
|
||||||
|
|
|
@ -146,11 +146,11 @@ bool LLVMContext::getDiagnosticsHotnessRequested() const {
|
||||||
return pImpl->DiagnosticsHotnessRequested;
|
return pImpl->DiagnosticsHotnessRequested;
|
||||||
}
|
}
|
||||||
|
|
||||||
void LLVMContext::setDiagnosticsHotnessThreshold(uint64_t Threshold) {
|
void LLVMContext::setDiagnosticsHotnessThreshold(Optional<uint64_t> Threshold) {
|
||||||
pImpl->DiagnosticsHotnessThreshold = Threshold;
|
pImpl->DiagnosticsHotnessThreshold = Threshold;
|
||||||
}
|
}
|
||||||
uint64_t LLVMContext::getDiagnosticsHotnessThreshold() const {
|
uint64_t LLVMContext::getDiagnosticsHotnessThreshold() const {
|
||||||
return pImpl->DiagnosticsHotnessThreshold;
|
return pImpl->DiagnosticsHotnessThreshold.getValueOr(UINT64_MAX);
|
||||||
}
|
}
|
||||||
|
|
||||||
remarks::RemarkStreamer *LLVMContext::getMainRemarkStreamer() {
|
remarks::RemarkStreamer *LLVMContext::getMainRemarkStreamer() {
|
||||||
|
|
|
@ -1323,7 +1323,26 @@ public:
|
||||||
std::unique_ptr<DiagnosticHandler> DiagHandler;
|
std::unique_ptr<DiagnosticHandler> DiagHandler;
|
||||||
bool RespectDiagnosticFilters = false;
|
bool RespectDiagnosticFilters = false;
|
||||||
bool DiagnosticsHotnessRequested = false;
|
bool DiagnosticsHotnessRequested = false;
|
||||||
uint64_t DiagnosticsHotnessThreshold = 0;
|
/// The minimum hotness value a diagnostic needs in order to be included in
|
||||||
|
/// optimization diagnostics.
|
||||||
|
///
|
||||||
|
/// The threshold is an Optional value, which maps to one of the 3 states:
|
||||||
|
/// 1). 0 => threshold disabled. All emarks will be printed.
|
||||||
|
/// 2). positive int => manual threshold by user. Remarks with hotness exceed
|
||||||
|
/// threshold will be printed.
|
||||||
|
/// 3). None => 'auto' threshold by user. The actual value is not
|
||||||
|
/// available at command line, but will be synced with
|
||||||
|
/// hotness threhold from profile summary during
|
||||||
|
/// compilation.
|
||||||
|
///
|
||||||
|
/// State 1 and 2 are considered as terminal states. State transition is
|
||||||
|
/// only allowed from 3 to 2, when the threshold is first synced with profile
|
||||||
|
/// summary. This ensures that the threshold is set only once and stays
|
||||||
|
/// constant.
|
||||||
|
///
|
||||||
|
/// If threshold option is not specified, it is disabled (0) by default.
|
||||||
|
Optional<uint64_t> DiagnosticsHotnessThreshold = 0;
|
||||||
|
|
||||||
/// The specialized remark streamer used by LLVM's OptimizationRemarkEmitter.
|
/// The specialized remark streamer used by LLVM's OptimizationRemarkEmitter.
|
||||||
std::unique_ptr<LLVMRemarkStreamer> LLVMRS;
|
std::unique_ptr<LLVMRemarkStreamer> LLVMRS;
|
||||||
|
|
||||||
|
|
|
@ -92,7 +92,7 @@ char LLVMRemarkSetupFormatError::ID = 0;
|
||||||
Expected<std::unique_ptr<ToolOutputFile>> llvm::setupLLVMOptimizationRemarks(
|
Expected<std::unique_ptr<ToolOutputFile>> llvm::setupLLVMOptimizationRemarks(
|
||||||
LLVMContext &Context, StringRef RemarksFilename, StringRef RemarksPasses,
|
LLVMContext &Context, StringRef RemarksFilename, StringRef RemarksPasses,
|
||||||
StringRef RemarksFormat, bool RemarksWithHotness,
|
StringRef RemarksFormat, bool RemarksWithHotness,
|
||||||
unsigned RemarksHotnessThreshold) {
|
Optional<uint64_t> RemarksHotnessThreshold) {
|
||||||
if (RemarksWithHotness)
|
if (RemarksWithHotness)
|
||||||
Context.setDiagnosticsHotnessRequested(true);
|
Context.setDiagnosticsHotnessRequested(true);
|
||||||
|
|
||||||
|
@ -137,11 +137,10 @@ Expected<std::unique_ptr<ToolOutputFile>> llvm::setupLLVMOptimizationRemarks(
|
||||||
return std::move(RemarksFile);
|
return std::move(RemarksFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
Error llvm::setupLLVMOptimizationRemarks(LLVMContext &Context, raw_ostream &OS,
|
Error llvm::setupLLVMOptimizationRemarks(
|
||||||
StringRef RemarksPasses,
|
LLVMContext &Context, raw_ostream &OS, StringRef RemarksPasses,
|
||||||
StringRef RemarksFormat,
|
StringRef RemarksFormat, bool RemarksWithHotness,
|
||||||
bool RemarksWithHotness,
|
Optional<uint64_t> RemarksHotnessThreshold) {
|
||||||
unsigned RemarksHotnessThreshold) {
|
|
||||||
if (RemarksWithHotness)
|
if (RemarksWithHotness)
|
||||||
Context.setDiagnosticsHotnessRequested(true);
|
Context.setDiagnosticsHotnessRequested(true);
|
||||||
|
|
||||||
|
|
|
@ -983,7 +983,8 @@ Error LTO::runRegularLTO(AddStreamFn AddStream) {
|
||||||
// Setup optimization remarks.
|
// Setup optimization remarks.
|
||||||
auto DiagFileOrErr = lto::setupLLVMOptimizationRemarks(
|
auto DiagFileOrErr = lto::setupLLVMOptimizationRemarks(
|
||||||
RegularLTO.CombinedModule->getContext(), Conf.RemarksFilename,
|
RegularLTO.CombinedModule->getContext(), Conf.RemarksFilename,
|
||||||
Conf.RemarksPasses, Conf.RemarksFormat, Conf.RemarksWithHotness);
|
Conf.RemarksPasses, Conf.RemarksFormat, Conf.RemarksWithHotness,
|
||||||
|
Conf.RemarksHotnessThreshold);
|
||||||
if (!DiagFileOrErr)
|
if (!DiagFileOrErr)
|
||||||
return DiagFileOrErr.takeError();
|
return DiagFileOrErr.takeError();
|
||||||
|
|
||||||
|
@ -1488,7 +1489,8 @@ Error LTO::runThinLTO(AddStreamFn AddStream, NativeObjectCache Cache,
|
||||||
|
|
||||||
Expected<std::unique_ptr<ToolOutputFile>> lto::setupLLVMOptimizationRemarks(
|
Expected<std::unique_ptr<ToolOutputFile>> lto::setupLLVMOptimizationRemarks(
|
||||||
LLVMContext &Context, StringRef RemarksFilename, StringRef RemarksPasses,
|
LLVMContext &Context, StringRef RemarksFilename, StringRef RemarksPasses,
|
||||||
StringRef RemarksFormat, bool RemarksWithHotness, int Count) {
|
StringRef RemarksFormat, bool RemarksWithHotness,
|
||||||
|
Optional<uint64_t> RemarksHotnessThreshold, int Count) {
|
||||||
std::string Filename = std::string(RemarksFilename);
|
std::string Filename = std::string(RemarksFilename);
|
||||||
// For ThinLTO, file.opt.<format> becomes
|
// For ThinLTO, file.opt.<format> becomes
|
||||||
// file.opt.<format>.thin.<num>.<format>.
|
// file.opt.<format>.thin.<num>.<format>.
|
||||||
|
@ -1498,7 +1500,8 @@ Expected<std::unique_ptr<ToolOutputFile>> lto::setupLLVMOptimizationRemarks(
|
||||||
.str();
|
.str();
|
||||||
|
|
||||||
auto ResultOrErr = llvm::setupLLVMOptimizationRemarks(
|
auto ResultOrErr = llvm::setupLLVMOptimizationRemarks(
|
||||||
Context, Filename, RemarksPasses, RemarksFormat, RemarksWithHotness);
|
Context, Filename, RemarksPasses, RemarksFormat, RemarksWithHotness,
|
||||||
|
RemarksHotnessThreshold);
|
||||||
if (Error E = ResultOrErr.takeError())
|
if (Error E = ResultOrErr.takeError())
|
||||||
return std::move(E);
|
return std::move(E);
|
||||||
|
|
||||||
|
|
|
@ -574,7 +574,8 @@ Error lto::thinBackend(const Config &Conf, unsigned Task, AddStreamFn AddStream,
|
||||||
// Setup optimization remarks.
|
// Setup optimization remarks.
|
||||||
auto DiagFileOrErr = lto::setupLLVMOptimizationRemarks(
|
auto DiagFileOrErr = lto::setupLLVMOptimizationRemarks(
|
||||||
Mod.getContext(), Conf.RemarksFilename, Conf.RemarksPasses,
|
Mod.getContext(), Conf.RemarksFilename, Conf.RemarksPasses,
|
||||||
Conf.RemarksFormat, Conf.RemarksWithHotness, Task);
|
Conf.RemarksFormat, Conf.RemarksWithHotness, Conf.RemarksHotnessThreshold,
|
||||||
|
Task);
|
||||||
if (!DiagFileOrErr)
|
if (!DiagFileOrErr)
|
||||||
return DiagFileOrErr.takeError();
|
return DiagFileOrErr.takeError();
|
||||||
auto DiagnosticOutputFile = std::move(*DiagFileOrErr);
|
auto DiagnosticOutputFile = std::move(*DiagFileOrErr);
|
||||||
|
|
|
@ -43,6 +43,7 @@
|
||||||
#include "llvm/MC/MCAsmInfo.h"
|
#include "llvm/MC/MCAsmInfo.h"
|
||||||
#include "llvm/MC/MCContext.h"
|
#include "llvm/MC/MCContext.h"
|
||||||
#include "llvm/MC/SubtargetFeature.h"
|
#include "llvm/MC/SubtargetFeature.h"
|
||||||
|
#include "llvm/Remarks/HotnessThresholdParser.h"
|
||||||
#include "llvm/Support/CommandLine.h"
|
#include "llvm/Support/CommandLine.h"
|
||||||
#include "llvm/Support/FileSystem.h"
|
#include "llvm/Support/FileSystem.h"
|
||||||
#include "llvm/Support/Host.h"
|
#include "llvm/Support/Host.h"
|
||||||
|
@ -87,6 +88,14 @@ cl::opt<bool> RemarksWithHotness(
|
||||||
cl::desc("With PGO, include profile count in optimization remarks"),
|
cl::desc("With PGO, include profile count in optimization remarks"),
|
||||||
cl::Hidden);
|
cl::Hidden);
|
||||||
|
|
||||||
|
cl::opt<Optional<uint64_t>, false, remarks::HotnessThresholdParser>
|
||||||
|
RemarksHotnessThreshold(
|
||||||
|
"lto-pass-remarks-hotness-threshold",
|
||||||
|
cl::desc("Minimum profile count required for an "
|
||||||
|
"optimization remark to be output."
|
||||||
|
" Use 'auto' to apply the threshold from profile summary."),
|
||||||
|
cl::value_desc("uint or 'auto'"), cl::init(0), cl::Hidden);
|
||||||
|
|
||||||
cl::opt<std::string>
|
cl::opt<std::string>
|
||||||
RemarksFilename("lto-pass-remarks-output",
|
RemarksFilename("lto-pass-remarks-output",
|
||||||
cl::desc("Output filename for pass remarks"),
|
cl::desc("Output filename for pass remarks"),
|
||||||
|
@ -529,9 +538,9 @@ bool LTOCodeGenerator::optimize(bool DisableVerify, bool DisableInline,
|
||||||
if (!this->determineTarget())
|
if (!this->determineTarget())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
auto DiagFileOrErr =
|
auto DiagFileOrErr = lto::setupLLVMOptimizationRemarks(
|
||||||
lto::setupLLVMOptimizationRemarks(Context, RemarksFilename, RemarksPasses,
|
Context, RemarksFilename, RemarksPasses, RemarksFormat,
|
||||||
RemarksFormat, RemarksWithHotness);
|
RemarksWithHotness, RemarksHotnessThreshold);
|
||||||
if (!DiagFileOrErr) {
|
if (!DiagFileOrErr) {
|
||||||
errs() << "Error: " << toString(DiagFileOrErr.takeError()) << "\n";
|
errs() << "Error: " << toString(DiagFileOrErr.takeError()) << "\n";
|
||||||
report_fatal_error("Can't get an output file for the remarks");
|
report_fatal_error("Can't get an output file for the remarks");
|
||||||
|
|
|
@ -37,6 +37,7 @@
|
||||||
#include "llvm/LTO/SummaryBasedOptimizations.h"
|
#include "llvm/LTO/SummaryBasedOptimizations.h"
|
||||||
#include "llvm/MC/SubtargetFeature.h"
|
#include "llvm/MC/SubtargetFeature.h"
|
||||||
#include "llvm/Object/IRObjectFile.h"
|
#include "llvm/Object/IRObjectFile.h"
|
||||||
|
#include "llvm/Remarks/HotnessThresholdParser.h"
|
||||||
#include "llvm/Support/CachePruning.h"
|
#include "llvm/Support/CachePruning.h"
|
||||||
#include "llvm/Support/Debug.h"
|
#include "llvm/Support/Debug.h"
|
||||||
#include "llvm/Support/Error.h"
|
#include "llvm/Support/Error.h"
|
||||||
|
@ -75,6 +76,8 @@ extern cl::opt<bool> LTODiscardValueNames;
|
||||||
extern cl::opt<std::string> RemarksFilename;
|
extern cl::opt<std::string> RemarksFilename;
|
||||||
extern cl::opt<std::string> RemarksPasses;
|
extern cl::opt<std::string> RemarksPasses;
|
||||||
extern cl::opt<bool> RemarksWithHotness;
|
extern cl::opt<bool> RemarksWithHotness;
|
||||||
|
extern cl::opt<Optional<uint64_t>, false, remarks::HotnessThresholdParser>
|
||||||
|
RemarksHotnessThreshold;
|
||||||
extern cl::opt<std::string> RemarksFormat;
|
extern cl::opt<std::string> RemarksFormat;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1104,7 +1107,7 @@ void ThinLTOCodeGenerator::run() {
|
||||||
Context.enableDebugTypeODRUniquing();
|
Context.enableDebugTypeODRUniquing();
|
||||||
auto DiagFileOrErr = lto::setupLLVMOptimizationRemarks(
|
auto DiagFileOrErr = lto::setupLLVMOptimizationRemarks(
|
||||||
Context, RemarksFilename, RemarksPasses, RemarksFormat,
|
Context, RemarksFilename, RemarksPasses, RemarksFormat,
|
||||||
RemarksWithHotness, count);
|
RemarksWithHotness, RemarksHotnessThreshold, count);
|
||||||
if (!DiagFileOrErr) {
|
if (!DiagFileOrErr) {
|
||||||
errs() << "Error: " << toString(DiagFileOrErr.takeError()) << "\n";
|
errs() << "Error: " << toString(DiagFileOrErr.takeError()) << "\n";
|
||||||
report_fatal_error("ThinLTO: Can't get an output file for the "
|
report_fatal_error("ThinLTO: Can't get an output file for the "
|
||||||
|
|
|
@ -9,6 +9,26 @@
|
||||||
; RUN: -r %t.bc,main,px -o %t.o %t.bc
|
; RUN: -r %t.bc,main,px -o %t.o %t.bc
|
||||||
; RUN: cat %t.yaml | FileCheck %s -check-prefix=YAML
|
; RUN: cat %t.yaml | FileCheck %s -check-prefix=YAML
|
||||||
|
|
||||||
|
; Check low threshold allows remarks to emit.
|
||||||
|
; RUN: rm -f %t.t300.yaml
|
||||||
|
; RUN: llvm-lto2 run -pass-remarks-output=%t.t300.yaml \
|
||||||
|
; RUN: -pass-remarks-with-hotness \
|
||||||
|
; RUN: -pass-remarks-hotness-threshold=300 \
|
||||||
|
; RUN: -r %t.bc,tinkywinky,p \
|
||||||
|
; RUN: -r %t.bc,patatino,px \
|
||||||
|
; RUN: -r %t.bc,main,px -o %t.o %t.bc
|
||||||
|
; RUN: FileCheck %s -check-prefix=YAML < %t.t300.yaml
|
||||||
|
|
||||||
|
; Check high threshold disallows remarks to emit.
|
||||||
|
; RUN: rm -f %t.t301.yaml
|
||||||
|
; RUN: llvm-lto2 run -pass-remarks-output=%t.t301.yaml \
|
||||||
|
; RUN: -pass-remarks-with-hotness \
|
||||||
|
; RUN: -pass-remarks-hotness-threshold=301 \
|
||||||
|
; RUN: -r %t.bc,tinkywinky,p \
|
||||||
|
; RUN: -r %t.bc,patatino,px \
|
||||||
|
; RUN: -r %t.bc,main,px -o %t.o %t.bc
|
||||||
|
; RUN: count 0 < %t.t301.yaml
|
||||||
|
|
||||||
; Check pass remarks emitted to stderr
|
; Check pass remarks emitted to stderr
|
||||||
; RUN: llvm-lto2 run -pass-remarks=inline \
|
; RUN: llvm-lto2 run -pass-remarks=inline \
|
||||||
; RUN: -pass-remarks-with-hotness \
|
; RUN: -pass-remarks-with-hotness \
|
||||||
|
@ -16,6 +36,22 @@
|
||||||
; RUN: -r %t.bc,patatino,px \
|
; RUN: -r %t.bc,patatino,px \
|
||||||
; RUN: -r %t.bc,main,px -o %t.o %t.bc 2>&1 | FileCheck %s
|
; RUN: -r %t.bc,main,px -o %t.o %t.bc 2>&1 | FileCheck %s
|
||||||
|
|
||||||
|
; Check low threshold allows remarks to emit.
|
||||||
|
; RUN: llvm-lto2 run -pass-remarks=inline \
|
||||||
|
; RUN: -pass-remarks-with-hotness \
|
||||||
|
; RUN: -pass-remarks-hotness-threshold=300 \
|
||||||
|
; RUN: -r %t.bc,tinkywinky,p \
|
||||||
|
; RUN: -r %t.bc,patatino,px \
|
||||||
|
; RUN: -r %t.bc,main,px -o %t.o %t.bc 2>&1 | FileCheck %s
|
||||||
|
|
||||||
|
; Check high threshold disallows remarks to emit.
|
||||||
|
; RUN: llvm-lto2 run -pass-remarks=inline \
|
||||||
|
; RUN: -pass-remarks-with-hotness \
|
||||||
|
; RUN: -pass-remarks-hotness-threshold=301 \
|
||||||
|
; RUN: -r %t.bc,tinkywinky,p \
|
||||||
|
; RUN: -r %t.bc,patatino,px \
|
||||||
|
; RUN: -r %t.bc,main,px -o %t.o %t.bc 2>&1 | count 0
|
||||||
|
|
||||||
; YAML: --- !Passed
|
; YAML: --- !Passed
|
||||||
; YAML-NEXT: Pass: inline
|
; YAML-NEXT: Pass: inline
|
||||||
; YAML-NEXT: Name: Inlined
|
; YAML-NEXT: Name: Inlined
|
||||||
|
|
|
@ -2,12 +2,24 @@
|
||||||
; with -lto-pass-remarks-with-hotness.
|
; with -lto-pass-remarks-with-hotness.
|
||||||
|
|
||||||
; RUN: llvm-as < %s >%t.bc
|
; RUN: llvm-as < %s >%t.bc
|
||||||
; RUN: rm -f %t.yaml
|
; RUN: rm -f %t.yaml %t.t300.yaml %t.t301.yaml
|
||||||
; RUN: llvm-lto -lto-pass-remarks-output=%t.yaml \
|
; RUN: llvm-lto -lto-pass-remarks-output=%t.yaml \
|
||||||
; RUN: -lto-pass-remarks-with-hotness \
|
; RUN: -lto-pass-remarks-with-hotness \
|
||||||
; RUN: -exported-symbol _main -o %t.o %t.bc
|
; RUN: -exported-symbol _main -o %t.o %t.bc
|
||||||
; RUN: cat %t.yaml | FileCheck -check-prefix=YAML %s
|
; RUN: cat %t.yaml | FileCheck -check-prefix=YAML %s
|
||||||
|
|
||||||
|
; RUN: llvm-lto -lto-pass-remarks-output=%t.t300.yaml \
|
||||||
|
; RUN: -lto-pass-remarks-with-hotness \
|
||||||
|
; RUN: -lto-pass-remarks-hotness-threshold=300 \
|
||||||
|
; RUN: -exported-symbol _main -o %t.o %t.bc
|
||||||
|
; RUN: FileCheck -check-prefix=YAML %s < %t.t300.yaml
|
||||||
|
|
||||||
|
; RUN: llvm-lto -lto-pass-remarks-output=%t.t301.yaml \
|
||||||
|
; RUN: -lto-pass-remarks-with-hotness \
|
||||||
|
; RUN: -lto-pass-remarks-hotness-threshold=301 \
|
||||||
|
; RUN: -exported-symbol _main -o %t.o %t.bc
|
||||||
|
; RUN: not FileCheck -check-prefix=YAML %s < %t.t301.yaml
|
||||||
|
|
||||||
; YAML: --- !Passed
|
; YAML: --- !Passed
|
||||||
; YAML-NEXT: Pass: inline
|
; YAML-NEXT: Pass: inline
|
||||||
; YAML-NEXT: Name: Inlined
|
; YAML-NEXT: Name: Inlined
|
||||||
|
|
|
@ -11,8 +11,22 @@
|
||||||
; RUN: -plugin-opt=opt-remarks-format=yaml \
|
; RUN: -plugin-opt=opt-remarks-format=yaml \
|
||||||
; RUN: -plugin-opt=opt-remarks-with-hotness \
|
; RUN: -plugin-opt=opt-remarks-with-hotness \
|
||||||
; RUN: -plugin-opt=opt-remarks-filename=%t.hot.yaml %t.o -o %t2.o 2>&1
|
; RUN: -plugin-opt=opt-remarks-filename=%t.hot.yaml %t.o -o %t2.o 2>&1
|
||||||
|
; RUN: %gold -m elf_x86_64 -plugin %llvmshlibdir/LLVMgold%shlibext -shared \
|
||||||
|
; RUN: -plugin-opt=opt-remarks-passes=inline \
|
||||||
|
; RUN: -plugin-opt=opt-remarks-format=yaml \
|
||||||
|
; RUN: -plugin-opt=opt-remarks-with-hotness \
|
||||||
|
; RUN: -plugin-opt=opt-remarks-hotness-threshold=300 \
|
||||||
|
; RUN: -plugin-opt=opt-remarks-filename=%t.t300.yaml %t.o -o %t2.o 2>&1
|
||||||
|
; RUN: %gold -m elf_x86_64 -plugin %llvmshlibdir/LLVMgold%shlibext -shared \
|
||||||
|
; RUN: -plugin-opt=opt-remarks-passes=inline \
|
||||||
|
; RUN: -plugin-opt=opt-remarks-format=yaml \
|
||||||
|
; RUN: -plugin-opt=opt-remarks-with-hotness \
|
||||||
|
; RUN: -plugin-opt=opt-remarks-hotness-threshold=301 \
|
||||||
|
; RUN: -plugin-opt=opt-remarks-filename=%t.t301.yaml %t.o -o %t2.o 2>&1
|
||||||
; RUN: cat %t.yaml | FileCheck %s -check-prefix=YAML
|
; RUN: cat %t.yaml | FileCheck %s -check-prefix=YAML
|
||||||
; RUN: cat %t.hot.yaml | FileCheck %s -check-prefix=YAML-HOT
|
; RUN: cat %t.hot.yaml | FileCheck %s -check-prefix=YAML-HOT
|
||||||
|
; RUN: FileCheck %s -check-prefix=YAML-HOT < %t.t300.yaml
|
||||||
|
; RUN: count 0 < %t.t301.yaml
|
||||||
|
|
||||||
; Check that @f is inlined after optimizations.
|
; Check that @f is inlined after optimizations.
|
||||||
; CHECK-LABEL: define i32 @_start
|
; CHECK-LABEL: define i32 @_start
|
||||||
|
@ -46,7 +60,6 @@
|
||||||
; YAML-NEXT: - String: ')'
|
; YAML-NEXT: - String: ')'
|
||||||
; YAML-NEXT: ...
|
; YAML-NEXT: ...
|
||||||
|
|
||||||
; YAML-HOT: ...
|
|
||||||
; YAML-HOT: --- !Passed
|
; YAML-HOT: --- !Passed
|
||||||
; YAML-HOT: Pass: inline
|
; YAML-HOT: Pass: inline
|
||||||
; YAML-HOT-NEXT: Name: Inlined
|
; YAML-HOT-NEXT: Name: Inlined
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
#include "llvm/LTO/Caching.h"
|
#include "llvm/LTO/Caching.h"
|
||||||
#include "llvm/LTO/LTO.h"
|
#include "llvm/LTO/LTO.h"
|
||||||
#include "llvm/Object/Error.h"
|
#include "llvm/Object/Error.h"
|
||||||
|
#include "llvm/Remarks/HotnessThresholdParser.h"
|
||||||
#include "llvm/Support/CachePruning.h"
|
#include "llvm/Support/CachePruning.h"
|
||||||
#include "llvm/Support/CommandLine.h"
|
#include "llvm/Support/CommandLine.h"
|
||||||
#include "llvm/Support/FileSystem.h"
|
#include "llvm/Support/FileSystem.h"
|
||||||
|
@ -213,6 +214,7 @@ namespace options {
|
||||||
static std::string RemarksFilename;
|
static std::string RemarksFilename;
|
||||||
static std::string RemarksPasses;
|
static std::string RemarksPasses;
|
||||||
static bool RemarksWithHotness = false;
|
static bool RemarksWithHotness = false;
|
||||||
|
static Optional<uint64_t> RemarksHotnessThreshold = 0;
|
||||||
static std::string RemarksFormat;
|
static std::string RemarksFormat;
|
||||||
|
|
||||||
// Context sensitive PGO options.
|
// Context sensitive PGO options.
|
||||||
|
@ -297,6 +299,12 @@ namespace options {
|
||||||
RemarksPasses = std::string(opt);
|
RemarksPasses = std::string(opt);
|
||||||
} else if (opt == "opt-remarks-with-hotness") {
|
} else if (opt == "opt-remarks-with-hotness") {
|
||||||
RemarksWithHotness = true;
|
RemarksWithHotness = true;
|
||||||
|
} else if (opt.consume_front("opt-remarks-hotness-threshold=")) {
|
||||||
|
auto ResultOrErr = remarks::parseHotnessThresholdOption(opt);
|
||||||
|
if (!ResultOrErr)
|
||||||
|
message(LDPL_FATAL, "Invalid remarks hotness threshold: %s", opt);
|
||||||
|
else
|
||||||
|
RemarksHotnessThreshold = *ResultOrErr;
|
||||||
} else if (opt.consume_front("opt-remarks-format=")) {
|
} else if (opt.consume_front("opt-remarks-format=")) {
|
||||||
RemarksFormat = std::string(opt);
|
RemarksFormat = std::string(opt);
|
||||||
} else if (opt.consume_front("stats-file=")) {
|
} else if (opt.consume_front("stats-file=")) {
|
||||||
|
@ -931,6 +939,7 @@ static std::unique_ptr<LTO> createLTO(IndexWriteCallback OnIndexWrite,
|
||||||
Conf.RemarksFilename = options::RemarksFilename;
|
Conf.RemarksFilename = options::RemarksFilename;
|
||||||
Conf.RemarksPasses = options::RemarksPasses;
|
Conf.RemarksPasses = options::RemarksPasses;
|
||||||
Conf.RemarksWithHotness = options::RemarksWithHotness;
|
Conf.RemarksWithHotness = options::RemarksWithHotness;
|
||||||
|
Conf.RemarksHotnessThreshold = options::RemarksHotnessThreshold;
|
||||||
Conf.RemarksFormat = options::RemarksFormat;
|
Conf.RemarksFormat = options::RemarksFormat;
|
||||||
|
|
||||||
// Use new pass manager if set in driver
|
// Use new pass manager if set in driver
|
||||||
|
|
|
@ -37,6 +37,7 @@
|
||||||
#include "llvm/InitializePasses.h"
|
#include "llvm/InitializePasses.h"
|
||||||
#include "llvm/MC/SubtargetFeature.h"
|
#include "llvm/MC/SubtargetFeature.h"
|
||||||
#include "llvm/Pass.h"
|
#include "llvm/Pass.h"
|
||||||
|
#include "llvm/Remarks/HotnessThresholdParser.h"
|
||||||
#include "llvm/Support/CommandLine.h"
|
#include "llvm/Support/CommandLine.h"
|
||||||
#include "llvm/Support/Debug.h"
|
#include "llvm/Support/Debug.h"
|
||||||
#include "llvm/Support/FileSystem.h"
|
#include "llvm/Support/FileSystem.h"
|
||||||
|
@ -142,11 +143,13 @@ static cl::opt<bool> RemarksWithHotness(
|
||||||
cl::desc("With PGO, include profile count in optimization remarks"),
|
cl::desc("With PGO, include profile count in optimization remarks"),
|
||||||
cl::Hidden);
|
cl::Hidden);
|
||||||
|
|
||||||
static cl::opt<unsigned>
|
static cl::opt<Optional<uint64_t>, false, remarks::HotnessThresholdParser>
|
||||||
RemarksHotnessThreshold("pass-remarks-hotness-threshold",
|
RemarksHotnessThreshold(
|
||||||
cl::desc("Minimum profile count required for "
|
"pass-remarks-hotness-threshold",
|
||||||
"an optimization remark to be output"),
|
cl::desc("Minimum profile count required for "
|
||||||
cl::Hidden);
|
"an optimization remark to be output. "
|
||||||
|
"Use 'auto' to apply the threshold from profile summary."),
|
||||||
|
cl::value_desc("N or 'auto'"), cl::init(0), cl::Hidden);
|
||||||
|
|
||||||
static cl::opt<std::string>
|
static cl::opt<std::string>
|
||||||
RemarksFilename("pass-remarks-output",
|
RemarksFilename("pass-remarks-output",
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
#include "llvm/LTO/Caching.h"
|
#include "llvm/LTO/Caching.h"
|
||||||
#include "llvm/LTO/LTO.h"
|
#include "llvm/LTO/LTO.h"
|
||||||
#include "llvm/Passes/PassPlugin.h"
|
#include "llvm/Passes/PassPlugin.h"
|
||||||
|
#include "llvm/Remarks/HotnessThresholdParser.h"
|
||||||
#include "llvm/Support/CommandLine.h"
|
#include "llvm/Support/CommandLine.h"
|
||||||
#include "llvm/Support/FileSystem.h"
|
#include "llvm/Support/FileSystem.h"
|
||||||
#include "llvm/Support/InitLLVM.h"
|
#include "llvm/Support/InitLLVM.h"
|
||||||
|
@ -103,6 +104,14 @@ static cl::opt<bool> RemarksWithHotness(
|
||||||
cl::desc("With PGO, include profile count in optimization remarks"),
|
cl::desc("With PGO, include profile count in optimization remarks"),
|
||||||
cl::Hidden);
|
cl::Hidden);
|
||||||
|
|
||||||
|
cl::opt<Optional<uint64_t>, false, remarks::HotnessThresholdParser>
|
||||||
|
RemarksHotnessThreshold(
|
||||||
|
"pass-remarks-hotness-threshold",
|
||||||
|
cl::desc("Minimum profile count required for an "
|
||||||
|
"optimization remark to be output."
|
||||||
|
" Use 'auto' to apply the threshold from profile summary."),
|
||||||
|
cl::value_desc("uint or 'auto'"), cl::init(0), cl::Hidden);
|
||||||
|
|
||||||
static cl::opt<std::string>
|
static cl::opt<std::string>
|
||||||
RemarksFilename("pass-remarks-output",
|
RemarksFilename("pass-remarks-output",
|
||||||
cl::desc("Output filename for pass remarks"),
|
cl::desc("Output filename for pass remarks"),
|
||||||
|
@ -246,6 +255,7 @@ static int run(int argc, char **argv) {
|
||||||
Conf.RemarksFilename = RemarksFilename;
|
Conf.RemarksFilename = RemarksFilename;
|
||||||
Conf.RemarksPasses = RemarksPasses;
|
Conf.RemarksPasses = RemarksPasses;
|
||||||
Conf.RemarksWithHotness = RemarksWithHotness;
|
Conf.RemarksWithHotness = RemarksWithHotness;
|
||||||
|
Conf.RemarksHotnessThreshold = RemarksHotnessThreshold;
|
||||||
Conf.RemarksFormat = RemarksFormat;
|
Conf.RemarksFormat = RemarksFormat;
|
||||||
|
|
||||||
Conf.SampleProfile = SamplePGOFile;
|
Conf.SampleProfile = SamplePGOFile;
|
||||||
|
|
|
@ -38,6 +38,7 @@
|
||||||
#include "llvm/LinkAllIR.h"
|
#include "llvm/LinkAllIR.h"
|
||||||
#include "llvm/LinkAllPasses.h"
|
#include "llvm/LinkAllPasses.h"
|
||||||
#include "llvm/MC/SubtargetFeature.h"
|
#include "llvm/MC/SubtargetFeature.h"
|
||||||
|
#include "llvm/Remarks/HotnessThresholdParser.h"
|
||||||
#include "llvm/Support/Debug.h"
|
#include "llvm/Support/Debug.h"
|
||||||
#include "llvm/Support/FileSystem.h"
|
#include "llvm/Support/FileSystem.h"
|
||||||
#include "llvm/Support/Host.h"
|
#include "llvm/Support/Host.h"
|
||||||
|
@ -262,11 +263,13 @@ static cl::opt<bool> RemarksWithHotness(
|
||||||
cl::desc("With PGO, include profile count in optimization remarks"),
|
cl::desc("With PGO, include profile count in optimization remarks"),
|
||||||
cl::Hidden);
|
cl::Hidden);
|
||||||
|
|
||||||
static cl::opt<unsigned>
|
static cl::opt<Optional<uint64_t>, false, remarks::HotnessThresholdParser>
|
||||||
RemarksHotnessThreshold("pass-remarks-hotness-threshold",
|
RemarksHotnessThreshold(
|
||||||
cl::desc("Minimum profile count required for "
|
"pass-remarks-hotness-threshold",
|
||||||
"an optimization remark to be output"),
|
cl::desc("Minimum profile count required for "
|
||||||
cl::Hidden);
|
"an optimization remark to be output. "
|
||||||
|
"Use 'auto' to apply the threshold from profile summary."),
|
||||||
|
cl::value_desc("N or 'auto'"), cl::init(0), cl::Hidden);
|
||||||
|
|
||||||
static cl::opt<std::string>
|
static cl::opt<std::string>
|
||||||
RemarksFilename("pass-remarks-output",
|
RemarksFilename("pass-remarks-output",
|
||||||
|
|
Loading…
Reference in New Issue