dblaikie added a comment.

In D141451#4095303 <https://reviews.llvm.org/D141451#4095303>, @nickdesaulniers 
wrote:

> In D141451#4064298 <https://reviews.llvm.org/D141451#4064298>, @dblaikie 
> wrote:
>
>> Right - I was thinking more, as above, about directly using the existing 
>> metadata generation (if it's too expensive to enable by default, then 
>> possibly under an off-by-default warning or other flag) that the inliner 
>> already knows how to read and write, rather than creating new/different 
>> metadata handling.
>> Again, might be worth knowing what the cost of the debug info metadata loc 
>> tracking mode is.
>
> For a first order approximation, I have this diff applied:
>
>   diff --git a/clang/include/clang/Basic/CodeGenOptions.def 
> b/clang/include/clang/Basic/CodeGenOptions.def
>   index 436226c6f178..6d5049803188 100644
>   --- a/clang/include/clang/Basic/CodeGenOptions.def
>   +++ b/clang/include/clang/Basic/CodeGenOptions.def
>   @@ -386,7 +386,7 @@ VALUE_CODEGENOPT(SmallDataLimit, 32, 0)
>    VALUE_CODEGENOPT(SSPBufferSize, 32, 0)
>    
>    /// The kind of generated debug info.
>   -ENUM_CODEGENOPT(DebugInfo, codegenoptions::DebugInfoKind, 4, 
> codegenoptions::NoDebugInfo)
>   +ENUM_CODEGENOPT(DebugInfo, codegenoptions::DebugInfoKind, 4, 
> codegenoptions::LocTrackingOnly)
>    
>    /// Whether to generate macro debug info.
>    CODEGENOPT(MacroDebugInfo, 1, 0)
>
> This changes the default value of `codegenopts.DebugInfo` from 
> `codegenoptions::NoDebugInfo` to `codegenoptions::LocTrackingOnly`, which is 
> what the optimization remark emitter infra uses.  This emits more debug info 
> than we need (metadata for every statement in IR rather than JUST `call` 
> instructions).  But it would give me analogous metadata I could use to solve 
> this problem addressed by this patch, and it would guarantee that I had 
> precise col/line info.
>
> Comparing 30 Linux kernel x86_64 defconfig (i.e. no debug info) builds with 
> vs without that change:
>
> Without (baseline):
>
>   $ hyperfine --prepare 'make LLVM=1 -j128 -s clean' --runs 30 'make LLVM=1 
> -j128 -s'
>   Benchmark 1: make LLVM=1 -j128 -s
>     Time (mean ± σ):     61.592 s ±  0.156 s    [User: 4378.360 s, System: 
> 312.040 s]
>     Range (min … max):   61.283 s … 62.026 s    30 runs
>
> With diff from above:
>
>   $ hyperfine --prepare 'make LLVM=1 -j128 -s clean' --runs 30 'make LLVM=1 
> -j128 -s'  
>   Benchmark 1: make LLVM=1 -j128 -s
>     Time (mean ± σ):     62.228 s ±  0.523 s    [User: 4433.828 s, System: 
> 312.908 s]
>     Range (min … max):   61.825 s … 64.912 s    30 runs
>
> So that's a slowdown from the mean of ~1.02% ((1 - 61.592/62.228)*100). We 
> probably could claw some of that back if we had another level of 
> `codegenoptions` between `NoDebugInfo` and `LocTrackingOnly` that only 
> emitted LocTracking info for call insts (stated another way, omit 
> `DILocation` for all instructions other than `call`). I'm guessing that would 
> take significant work to add to clang;

I don't think that should be too costly/is probably worthwhile if the cost is 
linear on the number of instructions we have to give locations & calls are 
probably a minority of instructions overall.

This level would be in CodeGenOptions, but wouldn't have to be rendered into 
the LLVM DICompileUnit level - since it'd still be the same "there's some debug 
info here but it's not for emitting DWARF" as far as LLVM was concerned.

> I wasn't able how to figure out how to do so quickly.  I imagine updating the 
> non-debug-info clang tests to also be a treat.

Hopefully non-debug-info tests won't generally care about a bit of extra 
metadata, but no doubt some'll need updating.

>   Is a 1% compile time performance hit worth more precise backend 
> diagnostics? Probably (IMO). Perhaps worth an RFC?

Probably

I guess my only other question (worth mentioning in the RFC, perhaps)/direction 
would be that any of these "things that are expensive but make backend 
diagnostics better" could be to put them under a different warning flag (if 
making `-Wattribute-{warning|error}` off by default isn't feasible - leaving 
them on-by-default but less than great user experience when optimizing code, 
and have the warning suggest enabling a different warning flag that's more 
verbose but off by default and also enables the extra location tracking - so 
codebases that generally do use these attributes can opt in to that, while 
codebases that generally don't do that don't entirely lose/ignore the 
attributes).


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D141451/new/

https://reviews.llvm.org/D141451

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
  • [PATCH] D141451: [clang] ... Nick Desaulniers via Phabricator via cfe-commits
    • [PATCH] D141451: [cl... David Blaikie via Phabricator via cfe-commits

Reply via email to