This is an archive of the discontinued LLVM Phabricator instance.

[polly] Port NewPM PassInstrumentation to Scop passes.
Needs ReviewPublic

Authored by efriedma on May 21 2021, 4:25 PM.

Details

Summary

Makes opt-bisect work with scop passes.

Diff Detail

Event Timeline

efriedma created this revision.May 21 2021, 4:25 PM
efriedma requested review of this revision.May 21 2021, 4:25 PM
Herald added a project: Restricted Project. · View Herald TranscriptMay 21 2021, 4:25 PM

I think FunctionToScopPassAdaptor also needs this
any tests?

Meinersbur added a comment.EditedMay 25 2021, 4:59 PM

If I recall correctly, I tried this already. Unfortunately I encountered a design problem.

Running -print-after-all (which uses PassInstrumentation to insert a printer pass) crashes:

$ opt newpm.ll -polly -O3 -print-after-all
[...]
Unknown wrapped IR type
UNREACHABLE executed at /home/meinersbur/src/llvm-project/llvm/lib/Passes/StandardInstrumentations.cpp:321!
PLEASE submit a bug report to https://bugs.llvm.org/ and include the crash backtrace.
Stack dump:
0.      Program arguments: /home/meinersbur/build/llvm-project/release/bin/opt newpm.ll -polly -O3 -print-after-all
 #0 0x00007f1ed0880081 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/home/meinersbur/build/llvm-project/release/bin/opt+0x2cc4081)
 #1 0x00007f1ed087dab4 llvm::sys::RunSignalHandlers() (/home/meinersbur/build/llvm-project/release/bin/opt+0x2cc1ab4)
 #2 0x00007f1ed087dc2b SignalHandler(int) Signals.cpp:0:0
 #3 0x00007f1ecdb643c0 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x153c0)
 #4 0x00007f1ecd5c618b raise /build/glibc-eX1tMB/glibc-2.31/signal/../sysdeps/unix/sysv/linux/raise.c:51:1
 #5 0x00007f1ecd5a5859 abort /build/glibc-eX1tMB/glibc-2.31/stdlib/abort.c:81:7
 #6 0x00007f1ed07cdd4e (/home/meinersbur/build/llvm-project/release/bin/opt+0x2c11d4e)
 #7 0x00007f1ed0c49807 (anonymous namespace)::shouldPrintIR(llvm::Any) StandardInstrumentations.cpp:0:0
 #8 0x00007f1ed0c4fbe0 llvm::PrintIRInstrumentation::printAfterPass(llvm::StringRef, llvm::Any) (/home/meinersbur/build/llvm-project/release/bin/opt+0x3093be0)
 #9 0x00007f1ed0c4fe96 void llvm::detail::UniqueFunctionBase<void, llvm::StringRef, llvm::Any, llvm::PreservedAnalyses const&>::CallImpl<llvm::PrintIRInstrumentation::registerCallbacks(llvm::PassInstrumentationCallbacks&)::'lambda0'(llvm::StringRef, llvm::Any, llvm::PreservedAnalyses const&)>(void*, llvm::StringRef, llvm::Any&, llvm::PreservedAnalyses const&) StandardInstrumentations.cpp:0:0
#10 0x00007f1ed0d9d30b llvm::PassManager<polly::Scop, llvm::AnalysisManager<polly::Scop, polly::ScopStandardAnalysisResults&>, polly::ScopStandardAnalysisResults&, polly::SPMUpdater&>::run(polly::Scop&, llvm::AnalysisManager<polly::Scop, polly::ScopStandardAnalysisResults&>&, polly::ScopStandardAnalysisResults&, polly::SPMUpdater&) (/home/meinersbur/build/llvm-project/release/bin/opt+0x31e130b)
#11 0x00007f1ed0d2f913 polly::FunctionToScopPassAdaptor<llvm::PassManager<polly::Scop, llvm::AnalysisManager<polly::Scop, polly::ScopStandardAnalysisResults&>, polly::ScopStandardAnalysisResults&, polly::SPMUpdater&> >::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) RegisterPasses.cpp:0:0

This is because it calls the instrumentation's IRUnit-generic function meant to handle all IRUints (Module, SCC, Function, Loop). Unfortunately nobody though about custom PassManagers, so it crashes when not knowing what to do with the IRUnit of a Scop.

I settled to just ignoring the Scop pass instrumentations instead of crashing. To fix this properly, PassPlugin would need an additional interface for how to handle additional IRUnits.