Zhang via llvm-dev
2021-Jul-22 02:23 UTC
[llvm-dev] Unexpected crash in IndVarSimplify after injecting custom pass
Thanks Florian. To confirm, just leaving getAnalysisUsage unimplemented in my outside ModulePass is the correct way to instruct the remaining pipeline that "I've transformed Input enough that all previous analysis are no longer valid", right? Zhang ------------------ Original ------------------ From: "Florian Hahn"<florian_hahn at apple.com>; Date: Wed, Jul 21, 2021 05:16 PM To: "Zhang"<admin at mayuyu.io>; "llvm-dev"<llvm-dev at lists.llvm.org>; Subject: Re: [llvm-dev] Unexpected crash in IndVarSimplify after injecting custom pass Hi, On 21 Jul 2021, at 10:11, Zhang via llvm-dev <llvm-dev at lists.llvm.org> wrote: Hi: Here in our downstream project we use a ModulePass to schedule our TransformPasses through creating and executing Module/FunctionPassManagers internally. This "wrapper" pass is registered at ExtensionPoint EP_ModuleOptimizerEarly. However, when certain passes in our Pipeline are disabled, LLVM optimization process crashes later in the pipeline with: ``` Assertion failed: (L->getLoopPreheader() && "Can't expand add recurrences without a loop preheader!"), function getAddRecExprPHILiterally, file LLVM/llvm/lib/Transforms/Utils/ScalarEvolutionExpander.cpp, line 1275 1. <eof> parser at end of file 2. Per-module optimization passes 3. Running pass 'CallGraph Pass Manager' on module 'src.cpp'. 4. Running pass 'Loop Pass Manager' on function '@_ZNK8XXXX' 5. Running pass 'Induction Variable Simplification' on basic block '%for.body110' 0 clang++ 0x0000000103df5535 llvm::sys::PrintStackTrace(llvm::raw_ostream&) + 37 1 clang++ 0x0000000103df4765 llvm::sys::RunSignalHandlers() + 85 2 clang++ 0x0000000103df4cc0 llvm::sys::CleanupOnSignal(unsigned long) + 208 3 clang++ 0x0000000103d45f2a (anonymous namespace)::CrashRecoveryContextImpl::HandleCrash(int, unsigned long) + 106 4 clang++ 0x0000000103d460b7 CrashRecoverySignalHandler(int) + 135 5 libsystem_platform.dylib 0x00007fff2055ed7d _sigtramp + 29 6 libdyld.dylib 0x00007fff20534473 dyldGlobalLockRelease() + 0 7 libsystem_c.dylib 0x00007fff2046d720 abort + 120 8 libsystem_c.dylib 0x00007fff2046c9d6 err + 0 9 clang++ 0x0000000106c11a83 llvm::SCEVExpander::getAddRecExprPHILiterally(llvm::SCEVAddRecExpr const*, llvm::Loop const*, llvm::Type*, llvm::Type*, llvm::Type*&, bool&) (.cold.1) + 35 10 clang++ 0x0000000103eb9643 llvm::SCEVExpander::getAddRecExprPHILiterally(llvm::SCEVAddRecExpr const*, llvm::Loop const*, llvm::Type*, llvm::Type*, llvm::Type*&, bool&) + 4259 11 clang++ 0x0000000103eb9bda llvm::SCEVExpander::expandAddRecExprLiterally(llvm::SCEVAddRecExpr const*) + 1066 12 clang++ 0x0000000103eb5f23 llvm::SCEVExpander::expand(llvm::SCEV const*) + 1027 13 clang++ 0x0000000103eb5aac llvm::SCEVExpander::expandCodeFor(llvm::SCEV const*, llvm::Type*) + 28 14 clang++ 0x0000000103ebbc31 llvm::SCEVVisitor<llvm::SCEVExpander, llvm::Value*>::visit(llvm::SCEV const*) + 193 15 clang++ 0x0000000103eb5f23 llvm::SCEVExpander::expand(llvm::SCEV const*) + 1027 16 clang++ 0x0000000103eb5aac llvm::SCEVExpander::expandCodeFor(llvm::SCEV const*, llvm::Type*) + 28 17 clang++ 0x0000000103eb8c49 llvm::SCEVExpander::getAddRecExprPHILiterally(llvm::SCEVAddRecExpr const*, llvm::Loop const*, llvm::Type*, llvm::Type*, llvm::Type*&, bool&) + 1705 18 clang++ 0x0000000103eb9bda llvm::SCEVExpander::expandAddRecExprLiterally(llvm::SCEVAddRecExpr const*) + 1066 19 clang++ 0x0000000103eb5f23 llvm::SCEVExpander::expand(llvm::SCEV const*) + 1027 20 clang++ 0x0000000103eb5aac llvm::SCEVExpander::expandCodeFor(llvm::SCEV const*, llvm::Type*) + 28 21 clang++ 0x0000000103eb9794 llvm::SCEVExpander::expandCodeFor(llvm::SCEV const*, llvm::Type*, llvm::Instruction*) + 148 22 clang++ 0x0000000103b3969a (anonymous namespace)::IndVarSimplify::run(llvm::Loop*) + 8522 23 clang++ 0x0000000103b463c7 (anonymous namespace)::IndVarSimplifyLegacyPass::runOnLoop(llvm::Loop*, llvm::LPPassManager&) + 951 24 clang++ 0x00000001030ee209 llvm::LPPassManager::runOnFunction(llvm::Function&) + 1513 25 clang++ 0x00000001036afe41 llvm::FPPassManager::runOnFunction(llvm::Function&) + 1073 26 clang++ 0x0000000102ff4534 (anonymous namespace)::CGPassManager::runOnModule(llvm::Module&) + 1540 27 clang++ 0x00000001036b049f llvm::legacy::PassManagerImpl::run(llvm::Module&) + 1103 28 clang++ 0x000000010407b653 clang::EmitBackendOutput(clang::DiagnosticsEngine&, clang::HeaderSearchOptions const&, clang::CodeGenOptions const&, clang::TargetOptions const&, clang::LangOptions const&, llvm::DataLayout const&, llvm::Module*, clang::BackendAction, std::__1::unique_ptr<llvm::raw_pwrite_stream, std::__1::default_delete<llvm::raw_pwrite_stream> >) + 15075 29 clang++ 0x00000001043456fb clang::BackendConsumer::HandleTranslationUnit(clang::ASTContext&) + 1131 30 clang++ 0x0000000105438483 clang::ParseAST(clang::Sema&, bool, bool) + 643 31 clang++ 0x0000000104612d04 clang::FrontendAction::Execute() + 84 32 clang++ 0x00000001045b9f13 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) + 2179 33 clang++ 0x00000001046878fb clang::ExecuteCompilerInvocation(clang::CompilerInstance*) + 1435 34 clang++ 0x00000001025db371 cc1_main(llvm::ArrayRef<char const*>, char const*, void*) + 2081 ``` I added createVerifierPass() at the end of our "WrapperPass" and the transformed IR passed the verification. I also didn't overload getAnalysisUsage, which, if my understanding is correct, invalidates all previous analysis including Loops Identified. If IndVarSimplify crashes on valid IR, this is likely a bug. To confirm this, you can extract the IR before IndVarSimplify and check if running IndVarSimplify via opt on the extracted IR also crashes. If that’s the case, please file a bug report online https://bugs.llvm.org including the IR that causes IndVarSimplify to crash. Cheers, Florian -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20210722/5449518b/attachment.html>
Zhang via llvm-dev
2021-Jul-22 02:58 UTC
[llvm-dev] Unexpected crash in IndVarSimplify after injecting custom pass
I've tried to dump the IR out at the end of my pipeline and invoking opt separately with the following output: ``` opt -verify O3bug.ll ``` is fine from LLVM12 stock opt. Yet running ``opt -O3 O3bug.ll`` yields the exact same crash. Is there any infrastructure to help me reduce the IR for bug reporting? The full IR contains some sensitive information that we'd avoid posting publicly. Thanks a lot ------------------ Original ------------------ From: "llvm-dev"<llvm-dev at lists.llvm.org>; Date: Thu, Jul 22, 2021 10:24 AM To: "Florian Hahn"<florian_hahn at apple.com>; "llvm-dev"<llvm-dev at lists.llvm.org>; Subject: Re: [llvm-dev] Unexpected crash in IndVarSimplify after injecting custom pass Thanks Florian. To confirm, just leaving getAnalysisUsage unimplemented in my outside ModulePass is the correct way to instruct the remaining pipeline that "I've transformed Input enough that all previous analysis are no longer valid", right? Zhang ------------------ Original ------------------ From: "Florian Hahn"<florian_hahn at apple.com>; Date: Wed, Jul 21, 2021 05:16 PM To: "Zhang"<admin at mayuyu.io>; "llvm-dev"<llvm-dev at lists.llvm.org>; Subject: Re: [llvm-dev] Unexpected crash in IndVarSimplify after injecting custom pass Hi, On 21 Jul 2021, at 10:11, Zhang via llvm-dev <llvm-dev at lists.llvm.org> wrote: Hi: Here in our downstream project we use a ModulePass to schedule our TransformPasses through creating and executing Module/FunctionPassManagers internally. This "wrapper" pass is registered at ExtensionPoint EP_ModuleOptimizerEarly. However, when certain passes in our Pipeline are disabled, LLVM optimization process crashes later in the pipeline with: ``` Assertion failed: (L->getLoopPreheader() && "Can't expand add recurrences without a loop preheader!"), function getAddRecExprPHILiterally, file LLVM/llvm/lib/Transforms/Utils/ScalarEvolutionExpander.cpp, line 1275 1. <eof> parser at end of file 2. Per-module optimization passes 3. Running pass 'CallGraph Pass Manager' on module 'src.cpp'. 4. Running pass 'Loop Pass Manager' on function '@_ZNK8XXXX' 5. Running pass 'Induction Variable Simplification' on basic block '%for.body110' 0 clang++ 0x0000000103df5535 llvm::sys::PrintStackTrace(llvm::raw_ostream&) + 37 1 clang++ 0x0000000103df4765 llvm::sys::RunSignalHandlers() + 85 2 clang++ 0x0000000103df4cc0 llvm::sys::CleanupOnSignal(unsigned long) + 208 3 clang++ 0x0000000103d45f2a (anonymous namespace)::CrashRecoveryContextImpl::HandleCrash(int, unsigned long) + 106 4 clang++ 0x0000000103d460b7 CrashRecoverySignalHandler(int) + 135 5 libsystem_platform.dylib 0x00007fff2055ed7d _sigtramp + 29 6 libdyld.dylib 0x00007fff20534473 dyldGlobalLockRelease() + 0 7 libsystem_c.dylib 0x00007fff2046d720 abort + 120 8 libsystem_c.dylib 0x00007fff2046c9d6 err + 0 9 clang++ 0x0000000106c11a83 llvm::SCEVExpander::getAddRecExprPHILiterally(llvm::SCEVAddRecExpr const*, llvm::Loop const*, llvm::Type*, llvm::Type*, llvm::Type*&, bool&) (.cold.1) + 35 10 clang++ 0x0000000103eb9643 llvm::SCEVExpander::getAddRecExprPHILiterally(llvm::SCEVAddRecExpr const*, llvm::Loop const*, llvm::Type*, llvm::Type*, llvm::Type*&, bool&) + 4259 11 clang++ 0x0000000103eb9bda llvm::SCEVExpander::expandAddRecExprLiterally(llvm::SCEVAddRecExpr const*) + 1066 12 clang++ 0x0000000103eb5f23 llvm::SCEVExpander::expand(llvm::SCEV const*) + 1027 13 clang++ 0x0000000103eb5aac llvm::SCEVExpander::expandCodeFor(llvm::SCEV const*, llvm::Type*) + 28 14 clang++ 0x0000000103ebbc31 llvm::SCEVVisitor<llvm::SCEVExpander, llvm::Value*>::visit(llvm::SCEV const*) + 193 15 clang++ 0x0000000103eb5f23 llvm::SCEVExpander::expand(llvm::SCEV const*) + 1027 16 clang++ 0x0000000103eb5aac llvm::SCEVExpander::expandCodeFor(llvm::SCEV const*, llvm::Type*) + 28 17 clang++ 0x0000000103eb8c49 llvm::SCEVExpander::getAddRecExprPHILiterally(llvm::SCEVAddRecExpr const*, llvm::Loop const*, llvm::Type*, llvm::Type*, llvm::Type*&, bool&) + 1705 18 clang++ 0x0000000103eb9bda llvm::SCEVExpander::expandAddRecExprLiterally(llvm::SCEVAddRecExpr const*) + 1066 19 clang++ 0x0000000103eb5f23 llvm::SCEVExpander::expand(llvm::SCEV const*) + 1027 20 clang++ 0x0000000103eb5aac llvm::SCEVExpander::expandCodeFor(llvm::SCEV const*, llvm::Type*) + 28 21 clang++ 0x0000000103eb9794 llvm::SCEVExpander::expandCodeFor(llvm::SCEV const*, llvm::Type*, llvm::Instruction*) + 148 22 clang++ 0x0000000103b3969a (anonymous namespace)::IndVarSimplify::run(llvm::Loop*) + 8522 23 clang++ 0x0000000103b463c7 (anonymous namespace)::IndVarSimplifyLegacyPass::runOnLoop(llvm::Loop*, llvm::LPPassManager&) + 951 24 clang++ 0x00000001030ee209 llvm::LPPassManager::runOnFunction(llvm::Function&) + 1513 25 clang++ 0x00000001036afe41 llvm::FPPassManager::runOnFunction(llvm::Function&) + 1073 26 clang++ 0x0000000102ff4534 (anonymous namespace)::CGPassManager::runOnModule(llvm::Module&) + 1540 27 clang++ 0x00000001036b049f llvm::legacy::PassManagerImpl::run(llvm::Module&) + 1103 28 clang++ 0x000000010407b653 clang::EmitBackendOutput(clang::DiagnosticsEngine&, clang::HeaderSearchOptions const&, clang::CodeGenOptions const&, clang::TargetOptions const&, clang::LangOptions const&, llvm::DataLayout const&, llvm::Module*, clang::BackendAction, std::__1::unique_ptr<llvm::raw_pwrite_stream, std::__1::default_delete<llvm::raw_pwrite_stream> >) + 15075 29 clang++ 0x00000001043456fb clang::BackendConsumer::HandleTranslationUnit(clang::ASTContext&) + 1131 30 clang++ 0x0000000105438483 clang::ParseAST(clang::Sema&, bool, bool) + 643 31 clang++ 0x0000000104612d04 clang::FrontendAction::Execute() + 84 32 clang++ 0x00000001045b9f13 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) + 2179 33 clang++ 0x00000001046878fb clang::ExecuteCompilerInvocation(clang::CompilerInstance*) + 1435 34 clang++ 0x00000001025db371 cc1_main(llvm::ArrayRef<char const*>, char const*, void*) + 2081 ``` I added createVerifierPass() at the end of our "WrapperPass" and the transformed IR passed the verification. I also didn't overload getAnalysisUsage, which, if my understanding is correct, invalidates all previous analysis including Loops Identified. If IndVarSimplify crashes on valid IR, this is likely a bug. To confirm this, you can extract the IR before IndVarSimplify and check if running IndVarSimplify via opt on the extracted IR also crashes. If that’s the case, please file a bug report online https://bugs.llvm.org including the IR that causes IndVarSimplify to crash. Cheers, Florian -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20210722/ae5a5626/attachment.html>