diff options
author | Arthur Eubanks <aeubanks@google.com> | 2020-09-01 15:55:05 -0700 |
---|---|---|
committer | Arthur Eubanks <aeubanks@google.com> | 2020-10-22 19:16:25 -0700 |
commit | 0291e2c9330930bd74bfb8206cf6447a84bf492c (patch) | |
tree | ff587bda6c6b78bac56f0a1c4929706f391b4bfb /clang/lib/Basic/SourceManager.cpp | |
parent | 168db92465c504974274302a6a1a5d4a1580ccfe (diff) | |
download | llvm-0291e2c9330930bd74bfb8206cf6447a84bf492c.zip llvm-0291e2c9330930bd74bfb8206cf6447a84bf492c.tar.gz llvm-0291e2c9330930bd74bfb8206cf6447a84bf492c.tar.bz2 |
[Inliner] Run always-inliner in inliner-wrapper
An alwaysinline function may not get inlined in inliner-wrapper due to
the inlining order.
Previously for the following, the inliner would first inline @a() into @b(),
```
define void @a() {
entry:
call void @b()
ret void
}
define void @b() alwaysinline {
entry:
br label %for.cond
for.cond:
call void @a()
br label %for.cond
}
```
making @b() recursive and unable to be inlined into @a(), ending at
```
define void @a() {
entry:
call void @b()
ret void
}
define void @b() alwaysinline {
entry:
br label %for.cond
for.cond:
call void @b()
br label %for.cond
}
```
Running always-inliner first makes sure that we respect alwaysinline in more cases.
Fixes https://bugs.llvm.org/show_bug.cgi?id=46945.
Reviewed By: davidxl, rnk
Differential Revision: https://reviews.llvm.org/D86988
Diffstat (limited to 'clang/lib/Basic/SourceManager.cpp')
0 files changed, 0 insertions, 0 deletions