You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
While investigating the issue fixed in #95864 I came across some surprising behaviour. In trying to figure out whether rustc was generating invalid IR or it was some subsequent LLVM pass, I realized that -Z verify-llvm-ir was essentially ignored with -C no-prepopulate-passes in the new LLVM Pass Manager. This lead me to (incorrectly) assume that the IR rustc generated was valid when it got to LLVM.
It looks like a subtle change in behaviour due to the way the new Pass Manager is constructed in LLVMRustOptimizeWithNewPassManager.
The text was updated successfully, but these errors were encountered:
luqmana
added
A-LLVM
Area: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues.
C-bug
Category: This is a bug.
labels
Apr 10, 2022
…s, r=nikic
Respect -Z verify-llvm-ir and other flags that add extra passes when combined with -C no-prepopulate-passes in the new LLVM Pass Manager.
As part of the switch to the new LLVM Pass Manager the behaviour of flags such as `-Z verify-llvm-ir` (e.g. sanitizer, instrumentation) was modified when combined with `-C no-prepopulate-passes`. With the old PM, rustc was the one manually constructing the pipeline and respected those flags but in the new pass manager, those flags are used to build a list of callbacks that get invoked at certain extension points in the pipeline. Unfortunately, `-C no-prepopulate-passes` would skip building the pipeline altogether meaning we'd never add the corresponding passes. The fix here is to just manually invoke those callbacks as needed.
Fixesrust-lang#95874
Demonstrating the current vs fixed behaviour using the bug in rust-lang#95864
```console
$ rustc +nightly asm-miscompile.rs --edition 2021 --emit=llvm-ir -C no-prepopulate-passes -Z verify-llvm-ir
$ echo $?
0
$ rustc +stage1 asm-miscompile.rs --edition 2021 --emit=llvm-ir -C no-prepopulate-passes -Z verify-llvm-ir
Basic Block in function '_ZN14asm_miscompile3foo28_$u7b$$u7b$closure$u7d$$u7d$17h360e2f7eee1275c5E' does not have terminator!
label %bb1
LLVM ERROR: Broken module found, compilation aborted!
```
While investigating the issue fixed in #95864 I came across some surprising behaviour. In trying to figure out whether
rustc
was generating invalid IR or it was some subsequent LLVM pass, I realized that-Z verify-llvm-ir
was essentially ignored with-C no-prepopulate-passes
in the new LLVM Pass Manager. This lead me to (incorrectly) assume that the IRrustc
generated was valid when it got to LLVM.It looks like a subtle change in behaviour due to the way the new Pass Manager is constructed in
LLVMRustOptimizeWithNewPassManager
.The text was updated successfully, but these errors were encountered: