Skip to content

Conversation

ziqingluo-90
Copy link

@ziqingluo-90 ziqingluo-90 commented Mar 24, 2025

Manually merge '[Clang] Optimize -Wunsafe-buffer-usage. (llvm#125492)'

(rdar://147529568)

llvm#125492)'

[Clang] Optimize -Wunsafe-buffer-usage. (llvm#125492)

The Clang disgnostic `-Wunsafe-buffer-usage` was adding up to +15%
compilation time when used. Profiling showed that most of the overhead
comes from the use of ASTMatchers.

This change replaces the ASTMatcher infrastructure with simple matching
functions and keeps the functionality unchanged. It reduces the overhead
added by `-Wunsafe-buffer-usage` by 87.8%, leaving a negligible
additional compilation time of 1.7% when the diagnostic is used.

**Old version without -Wunsafe-buffer-usage:**
```
$ hyperfine -i -w 1 --runs 5 '/tmp/old_clang -c -std=c++20 /tmp/preprocessed.cc -ferror-limit=20'
Benchmark 1: /tmp/old_clang -c -std=c++20 /tmp/preprocessed.cc -ferror-limit=20
  Time (mean ± σ):     231.035 s ±  3.210 s    [User: 229.134 s, System: 1.704 s]
  Range (min … max):   228.751 s … 236.682 s    5 runs
```

**Old version with -Wunsafe-buffer-usage:**
```
$ hyperfine -i -w 1 --runs 10 '/tmp/old_clang -c -std=c++20 /tmp/preprocessed.cc -ferror-limit=20 -Wunsafe-buffer-usage'
Benchmark 1: /tmp/old_clang -c -std=c++20 /tmp/preprocessed.cc -ferror-limit=20 -Wunsafe-buffer-usage
  Time (mean ± σ):     263.840 s ±  0.854 s    [User: 262.043 s, System: 1.575 s]
  Range (min … max):   262.442 s … 265.142 s    10 runs
```

**New version with -Wunsafe-buffer-usage:**
```
$ hyperfine -i -w 1 --runs 10 '/tmp/new_clang -c -std=c++20 /tmp/preprocessed.cc -ferror-limit=20 -Wunsafe-buffer-usage'
Benchmark 1: /tmp/new_clang -c -std=c++20 /tmp/preprocessed.cc -ferror-limit=20 -Wunsafe-buffer-usage
  Time (mean ± σ):     235.169 s ±  1.408 s    [User: 233.406 s, System: 1.561 s]
  Range (min … max):   232.221 s … 236.792 s    10 runs
```
 Conflicts:
	clang/lib/Analysis/UnsafeBufferUsage.cpp

[-Wunsafe-buffer-usage] Correctly merge "[Clang] Optimize -Wunsafe-buffer-usage"

The upstream commit 18a0bd4fc387e16c4bd342c6d3a83366e2ec2bc1 replaces
ASTMatchers in `UnsafeBufferUsage.cpp` with plain AST matching.  It
improves the performance and makes the code easier to debug and
optimize.

This commit resolves massive conflicts introduced in
18a0bd4fc387e16c4bd342c6d3a83366e2ec2bc1.

(rdar://147529568)
@ziqingluo-90
Copy link
Author

CC @jkorous-apple @dtarditi

Copy link

@jkorous-apple jkorous-apple left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants