[LLVMdev] Analysis of polly-detect overhead in oggenc

Tobias Grosser tobias at grosser.es
Tue Jul 23 08:50:12 PDT 2013


On 07/22/2013 11:58 PM, Star Tan wrote:
> Hi Tobias,
>
>
> I have attached a patch file to optimize string operations in Polly-Detect pass.
> In this patch file, I put most of long string operations in the condition variable of "PollyViewMode" or in the DEBUG mode.

OK.

> From 448482106e8d815afa40e4ce8543ba3f6f0237f1 Mon Sep 17 00:00:00 2001
> From: Star Tan <tanmx_star at yeah.net>
> Date: Mon, 22 Jul 2013 23:48:45 -0700
> Subject: [PATCH] ScopDetect: Optimize compile-time cost for log string
>  operations.
>
> String operatioins resulted by raw_string_ostream in the INVALID macro can lead
> to significant compile-time overhead when compiling large size source code.
> This is because raw_string_ostream relies on TypeFinder class, whose
> compile-time cost increases as the size of the module increases. This patch
> targets to avoid calling TypeFinder in normal case, so TypeFinder class is only
> called in DEBUG mode with DEBUG macro or in PollyView mode.
>
> With this patch file, the relative compile-time cost of Polly-detect pass does
> not increase even compiling very large size source code.
> ---
>  include/polly/Options.h        |  3 ++
>  include/polly/ScopDetection.h  |  6 +++
>  lib/Analysis/ScopDetection.cpp | 93 +++++++++++++++++++++++-------------------
>  lib/RegisterPasses.cpp         | 22 ++++++----
>  4 files changed, 75 insertions(+), 49 deletions(-)
>
> diff --git a/include/polly/Options.h b/include/polly/Options.h
> index 62e0960..733edd0 100644
> --- a/include/polly/Options.h
> +++ b/include/polly/Options.h
> @@ -17,4 +17,7 @@
>  #include "llvm/Support/CommandLine.h"
>
>  extern llvm::cl::OptionCategory PollyCategory;
> +namespace polly {
> +  extern bool PollyViewMode;
> +}
>  #endif
> diff --git a/include/polly/ScopDetection.h b/include/polly/ScopDetection.h
> index 6ee48ee..5a5d7d1 100755
> --- a/include/polly/ScopDetection.h
> +++ b/include/polly/ScopDetection.h
> @@ -145,6 +145,12 @@ class ScopDetection : public FunctionPass {
>    /// @return True if the call instruction is valid, false otherwise.
>    static bool isValidCallInst(CallInst &CI);
>
> +  /// @brief Report invalid alias.
> +  ///
> +  /// @param AS The alias set.
> +  /// @param Context The context of scop detection.
> +  void reportInvalidAlias(AliasSet &AS, DetectionContext &Context) const;
Nice.

> diff --git a/lib/Analysis/ScopDetection.cpp b/lib/Analysis/ScopDetection.cpp
> index 9b2a9a8..4f33f6c 100644
> --- a/lib/Analysis/ScopDetection.cpp
> +++ b/lib/Analysis/ScopDetection.cpp
> @@ -108,11 +108,13 @@ STATISTIC(ValidRegion, "Number of regions that a valid part of Scop");
>
>  #define INVALID(NAME, MESSAGE)                                                 \
>    do {                                                                         \
> -    std::string Buf;                                                           \
> -    raw_string_ostream fmt(Buf);                                               \
> -    fmt << MESSAGE;                                                            \
> -    fmt.flush();                                                               \
> -    LastFailure = Buf;                                                         \
> +    if (PollyViewMode) {                                                       \

I believe this variable should describe what we do, rather than if a
a certain user of this feature is enabled.

Something like

if (TrackFailures) {

}

> +void ScopDetection::reportInvalidAlias(AliasSet &AS,
> +                                       DetectionContext &Context) const {

It is great that you extracted this function.

> +  std::string Message;
> +  raw_string_ostream OS(Message);
> +
> +  if (PollyViewMode || ::llvm::DebugFlag) {

This is a little unsatisfying. We now have two conditions that need to
be in sync. I think you can avoid this, if you rename the function to

std::string ScopDetection::formatInvalidAlias(AliasSet &AS)

and keep the INVALID_ macro at the place where the error happens.

> diff --git a/lib/RegisterPasses.cpp b/lib/RegisterPasses.cpp
> index 7fc0960..2e25e4d 100644
> --- a/lib/RegisterPasses.cpp
> +++ b/lib/RegisterPasses.cpp
> @@ -125,28 +125,34 @@ static cl::opt<bool> DeadCodeElim("polly-run-dce",
>                                    cl::Hidden, cl::init(false), cl::ZeroOrMore,
>                                    cl::cat(PollyCategory));
>
> -static cl::opt<bool>
> +bool polly::PollyViewMode;
> +
> +static cl::opt<bool, true>
>  PollyViewer("polly-show",
>              cl::desc("Highlight the code regions that will be optimized in a "
>                       "(CFG BBs and LLVM-IR instructions)"),
> -            cl::init(false), cl::ZeroOrMore, cl::cat(PollyCategory));
> +            cl::location(polly::PollyViewMode), cl::init(false), cl::ZeroOrMore,
> +            cl::cat(PollyCategory));
>
> -static cl::opt<bool>
> +static cl::opt<bool, true>
>  PollyOnlyViewer("polly-show-only",
>                  cl::desc("Highlight the code regions that will be optimized in "
>                           "a (CFG only BBs)"),
> -                cl::init(false), cl::cat(PollyCategory));
> +                cl::location(polly::PollyViewMode), cl::init(false),
> +                cl::cat(PollyCategory));

> -static cl::opt<bool>
> +static cl::opt<bool, true>
>  PollyPrinter("polly-dot", cl::desc("Enable the Polly DOT printer in -O3"),
>               cl::Hidden, cl::value_desc("Run the Polly DOT printer at -O3"),
> -             cl::init(false), cl::cat(PollyCategory));
> +             cl::location(polly::PollyViewMode), cl::init(false),
> +             cl::cat(PollyCategory));
>
> -static cl::opt<bool> PollyOnlyPrinter(
> +static cl::opt<bool, true> PollyOnlyPrinter(
>      "polly-dot-only",
>      cl::desc("Enable the Polly DOT printer in -O3 (no BB content)"), cl::Hidden,
>      cl::value_desc("Run the Polly DOT printer at -O3 (no BB content"),
> -    cl::init(false), cl::cat(PollyCategory));
> +    cl::location(polly::PollyViewMode), cl::init(false),
> +    cl::cat(PollyCategory));
Sorry. Having all options storing their value in the very same location
does not look right.

When I was talking about cl::location() I rather ment that you introduce
a new option -polly-detect-track-failures that can also be set by an
cl::location.

Another alternative is that you add a parameter to Pass
*polly::createScopDetectionPass() { return new ScopDetection(); } which
can be used to enable the failure tracking.

Cheers,
Tobias



More information about the llvm-dev mailing list