[llvm] r374692 - [SROA] Reuse existing lifetime markers if possible

Alexander Kornienko via llvm-commits llvm-commits at lists.llvm.org
Mon Oct 14 07:46:32 PDT 2019


I'm seeing an assertion failure when compiling
llvm/lib/Analysis/BlockFrequencyInfoImpl.cpp that started happening after
this patch (I verified that reverting it fixes the crash). Please fix or
revert the commit.

I don't have an isolated test case, but maybe there's an obvious error that
you can spot given the stack trace:

assert.h assertion failed at
llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp:543 in void
(anonymous namespace)::PromoteMem2Reg::run(): isAllocaPromotable(AI) &&
"Cannot promote non-promotable alloca!"

 #0 0x00005556fa034751 llvm::sys::PrintStackTrace(llvm::raw_ostream&)
llvm/lib/Support/Unix/Signals.inc:537:11
 #1 0x00005556fa034be9 PrintStackTraceSignalHandler(void*)
llvm/lib/Support/Unix/Signals.inc:593:1
 #2 0x00005556fa03327b llvm::sys::RunSignalHandlers()
llvm/lib/Support/Signals.cpp:67:5
 #3 0x00005556fa035244 SignalHandler(int)
llvm/lib/Support/Unix/Signals.inc:384:1
...
#12 0x00005556fa1adfa0 __assert_fail
#13 0x00005556f94d3703 (anonymous namespace)::PromoteMem2Reg::run()
llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp:543:5
#14 0x00005556f94d342a
llvm::PromoteMemToReg(llvm::ArrayRef<llvm::AllocaInst*>,
llvm::DominatorTree&, llvm::AssumptionCache*)
llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp:1006:3



#15 0x00005556f9157021 llvm::SROA::promoteAllocas(llvm::Function&)
llvm/lib/Transforms/Scalar/SROA.cpp:4559:3
#16 0x00005556f91573cc llvm::SROA::runImpl(llvm::Function&,
llvm::DominatorTree&, llvm::AssumptionCache&)
llvm/lib/Transforms/Scalar/SROA.cpp:4600:16
#17 0x00005556f9157682 llvm::SROA::run(llvm::Function&,
llvm::AnalysisManager<llvm::Function>&)
llvm/lib/Transforms/Scalar/SROA.cpp:4616:10
#18 0x00005556f42bfc35 llvm::detail::PassModel<llvm::Function, llvm::SROA,
llvm::PreservedAnalyses, llvm::AnalysisManager<llvm::Function>
>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&)
llvm/include/llvm/IR/PassManagerInternal.h:79:17


#19 0x00005556f9d5f539 llvm::PassManager<llvm::Function,
llvm::AnalysisManager<llvm::Function> >::run(llvm::Function&,
llvm::AnalysisManager<llvm::Function>&)
llvm/include/llvm/IR/PassManager.h:519:33



#20 0x00005556f42d8e4f
llvm::CGSCCToFunctionPassAdaptor<llvm::PassManager<llvm::Function,
llvm::AnalysisManager<llvm::Function> > >::run(llvm::LazyCallGraph::SCC&,
llvm::AnalysisManager<llvm::LazyCallGraph::SCC, llvm::LazyCallGraph&>&,
llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&)
llvm/include/llvm/Analysis/CGSCCPassManager.h:489:39

#21 0x00005556f42d8bb5 llvm::detail::PassModel<llvm::LazyCallGraph::SCC,
llvm::CGSCCToFunctionPassAdaptor<llvm::PassManager<llvm::Function,
llvm::AnalysisManager<llvm::Function> > >, llvm::PreservedAnalyses,
llvm::AnalysisManager<llvm::LazyCallGraph::SCC, llvm::LazyCallGraph&>,
llvm::LazyCallGraph&,
llvm::CGSCCUpdateResult&>::run(llvm::LazyCallGraph::SCC&,
llvm::AnalysisManager<llvm::LazyCallGraph::SCC, llvm::LazyCallGraph&>&,
llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&)
llvm/include/llvm/IR/PassManagerInternal.h:79:17
#22 0x00005556f95f734a llvm::PassManager<llvm::LazyCallGraph::SCC,
llvm::AnalysisManager<llvm::LazyCallGraph::SCC, llvm::LazyCallGraph&>,
llvm::LazyCallGraph&,
llvm::CGSCCUpdateResult&>::run(llvm::LazyCallGraph::SCC&,
llvm::AnalysisManager<llvm::LazyCallGraph::SCC, llvm::LazyCallGraph&>&,
llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&)
llvm/lib/Analysis/CGSCCPassManager.cpp:81:9
#23 0x00005556f42ee416
llvm::DevirtSCCRepeatedPass<llvm::PassManager<llvm::LazyCallGraph::SCC,
llvm::AnalysisManager<llvm::LazyCallGraph::SCC, llvm::LazyCallGraph&>,
llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&>
>::run(llvm::LazyCallGraph::SCC&,
llvm::AnalysisManager<llvm::LazyCallGraph::SCC, llvm::LazyCallGraph&>&,
llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&)
llvm/include/llvm/Analysis/CGSCCPassManager.h:617:11
#24 0x00005556f42ede49
llvm::ModuleToPostOrderCGSCCPassAdaptor<llvm::DevirtSCCRepeatedPass<llvm::PassManager<llvm::LazyCallGraph::SCC,
llvm::AnalysisManager<llvm::LazyCallGraph::SCC, llvm::LazyCallGraph&>,
llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&> > >::run(llvm::Module&,
llvm::AnalysisManager<llvm::Module>&)
llvm/include/llvm/Analysis/CGSCCPassManager.h:865:18
#25 0x00005556f42ed735 llvm::detail::PassModel<llvm::Module,
llvm::ModuleToPostOrderCGSCCPassAdaptor<llvm::DevirtSCCRepeatedPass<llvm::PassManager<llvm::LazyCallGraph::SCC,
llvm::AnalysisManager<llvm::LazyCallGraph::SCC, llvm::LazyCallGraph&>,
llvm::LazyCallGraph&, llvm::CGSCCUpdateResult&> > >,
llvm::PreservedAnalyses, llvm::AnalysisManager<llvm::Module>
>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&)
llvm/include/llvm/IR/PassManagerInternal.h:79:17
#26 0x00005556f9d5e726 llvm::PassManager<llvm::Module,
llvm::AnalysisManager<llvm::Module> >::run(llvm::Module&,
llvm::AnalysisManager<llvm::Module>&)
llvm/include/llvm/IR/PassManager.h:519:33



#27 0x00005556f42fe5f5 llvm::detail::PassModel<llvm::Module,
llvm::PassManager<llvm::Module, llvm::AnalysisManager<llvm::Module> >,
llvm::PreservedAnalyses, llvm::AnalysisManager<llvm::Module>
>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&)
llvm/include/llvm/IR/PassManagerInternal.h:79:17

#28 0x00005556f9d5e726 llvm::PassManager<llvm::Module,
llvm::AnalysisManager<llvm::Module> >::run(llvm::Module&,
llvm::AnalysisManager<llvm::Module>&)
llvm/include/llvm/IR/PassManager.h:519:33



#29 0x00005556f3ad4791 (anonymous
namespace)::EmitAssemblyHelper::EmitAssemblyWithNewPassManager(clang::BackendAction,
std::__u::unique_ptr<llvm::raw_pwrite_stream,
std::__u::default_delete<llvm::raw_pwrite_stream> >)
llvm/tools/clang/lib/CodeGen/BackendUtil.cpp:1324:5


#30 0x00005556f3ad173e clang::EmitBackendOutput(clang::DiagnosticsEngine&,
clang::HeaderSearchOptions const&, clang::CodeGenOptions const&,
clang::TargetOptions const&, clang::LangOptions const&, llvm::DataLayout
const&, llvm::Module*, clang::BackendAction,
std::__u::unique_ptr<llvm::raw_pwrite_stream,
std::__u::default_delete<llvm::raw_pwrite_stream> >)
llvm/tools/clang/lib/CodeGen/BackendUtil.cpp:1543:5
#31 0x00005556f3ac726c
clang::BackendConsumer::HandleTranslationUnit(clang::ASTContext&)
llvm/tools/clang/lib/CodeGen/CodeGenAction.cpp:307:7
#32 0x00005556f5017623 clang::ParseAST(clang::Sema&, bool, bool)
llvm/tools/clang/lib/Parse/ParseAST.cpp:178:12
#33 0x00005556f4d1fae2 clang::ASTFrontendAction::ExecuteAction()
llvm/tools/clang/lib/Frontend/FrontendAction.cpp:1044:1
#34 0x00005556f3ac353b clang::CodeGenAction::ExecuteAction()
llvm/tools/clang/lib/CodeGen/CodeGenAction.cpp:1089:1
#35 0x00005556f4d1f4b8 clang::FrontendAction::Execute()
llvm/tools/clang/lib/Frontend/FrontendAction.cpp:939:7
#36 0x00005556f4cc16f0
clang::CompilerInstance::ExecuteAction(clang::FrontendAction&)
llvm/tools/clang/lib/Frontend/CompilerInstance.cpp:957:23
#37 0x00005556f2f7dfc0
clang::ExecuteCompilerInvocation(clang::CompilerInstance*)
llvm/tools/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp:290:8
#38 0x00005556f2f5250c cc1_main(llvm::ArrayRef<char const*>, char const*,
void*) llvm/tools/clang/tools/driver/cc1_main.cpp:250:13
#39 0x00005556f2f76e5f ExecuteCC1Tool(llvm::ArrayRef<char const*>,
llvm::StringRef) llvm/tools/clang/tools/driver/driver.cpp:309:5
#40 0x00005556f2f761f9 main llvm/tools/clang/tools/driver/driver.cpp:382:5


On Sun, Oct 13, 2019 at 4:18 AM Johannes Doerfert via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Author: jdoerfert
> Date: Sat Oct 12 19:21:23 2019
> New Revision: 374692
>
> URL: http://llvm.org/viewvc/llvm-project?rev=374692&view=rev
> Log:
> [SROA] Reuse existing lifetime markers if possible
>
> Summary:
> If the underlying alloca did not change, we do not necessarily need new
> lifetime markers. This patch adds a check and reuses the old ones if
> possible.
>
> Reviewers: reames, ssarda, t.p.northover, hfinkel
>
> Subscribers: hiraditya, bollu, llvm-commits
>
> Tags: #llvm
>
> Differential Revision: https://reviews.llvm.org/D68900
>
> Added:
>     llvm/trunk/test/Transforms/SROA/reuse_lifetime_markers.ll
> Modified:
>     llvm/trunk/lib/Transforms/Scalar/SROA.cpp
>
> Modified: llvm/trunk/lib/Transforms/Scalar/SROA.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/SROA.cpp?rev=374692&r1=374691&r2=374692&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Scalar/SROA.cpp (original)
> +++ llvm/trunk/lib/Transforms/Scalar/SROA.cpp Sat Oct 12 19:21:23 2019
> @@ -3072,6 +3072,13 @@ private:
>      LLVM_DEBUG(dbgs() << "    original: " << II << "\n");
>      assert(II.getArgOperand(1) == OldPtr);
>
> +    bool EntireRange = (NewBeginOffset == NewAllocaBeginOffset &&
> +                        NewEndOffset == NewAllocaEndOffset);
> +
> +    // If the new lifetime marker would not differ from the old, just
> keep it.
> +    if (&OldAI == &NewAI && EntireRange)
> +      return true;
> +
>      // Record this instruction for deletion.
>      Pass.DeadInsts.insert(&II);
>
> @@ -3082,8 +3089,7 @@ private:
>      // promoted, but PromoteMemToReg doesn't handle that case.)
>      // FIXME: Check whether the alloca is promotable before dropping the
>      // lifetime intrinsics?
> -    if (NewBeginOffset != NewAllocaBeginOffset ||
> -        NewEndOffset != NewAllocaEndOffset)
> +    if (!EntireRange)
>        return true;
>
>      ConstantInt *Size =
>
> Added: llvm/trunk/test/Transforms/SROA/reuse_lifetime_markers.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/SROA/reuse_lifetime_markers.ll?rev=374692&view=auto
>
> ==============================================================================
> --- llvm/trunk/test/Transforms/SROA/reuse_lifetime_markers.ll (added)
> +++ llvm/trunk/test/Transforms/SROA/reuse_lifetime_markers.ll Sat Oct 12
> 19:21:23 2019
> @@ -0,0 +1,69 @@
> +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
> +; RUN: opt < %s -sroa -S | FileCheck %s
> +;
> +; Make sure we reuse the lifetime marker and do not create a new one that
> looks the same but without the call site attributes.
> +target datalayout =
> "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
> +
> +; Function Attrs: argmemonly nounwind willreturn
> +declare void @llvm.lifetime.start.p0i8(i64 immarg, i8* nocapture) #0
> +
> +; Function Attrs: argmemonly nounwind willreturn
> +declare void @llvm.memcpy.p0i8.p0i8.i64(i8* noalias nocapture writeonly,
> i8* noalias nocapture readonly, i64, i1 immarg) #0
> +
> +define hidden void @old_markers() {
> +;
> +; CHECK-LABEL: define {{[^@]+}}@old_markers(
> +; CHECK-NEXT:  entry:
> +; CHECK-NEXT:    [[VV_SROA_4:%.*]] = alloca [3 x i32*]
> +; CHECK-NEXT:    [[VV_SROA_4_0__SROA_CAST61:%.*]] = bitcast [3 x i32*]*
> [[VV_SROA_4]] to i8*
> +; CHECK-NEXT:    [[VV_SROA_4_0__SROA_CAST94:%.*]] = bitcast [3 x i32*]*
> [[VV_SROA_4]] to i8*
> +; CHECK-NEXT:    call void @llvm.lifetime.start.p0i8(i64 24, i8* nonnull
> align 8 dereferenceable(24) [[VV_SROA_4_0__SROA_CAST94]])
> +; CHECK-NEXT:    br i1 undef, label [[DO_BODY:%.*]], label
> [[IF_END31:%.*]]
> +; CHECK:       do.body:
> +; CHECK-NEXT:    ret void
> +; CHECK:       if.end31:
> +; CHECK-NEXT:    call void @llvm.memcpy.p0i8.p0i8.i64(i8* noalias nonnull
> align 8 dereferenceable(24) [[VV_SROA_4_0__SROA_CAST61]], i8* noalias
> nonnull align 8 undef, i64 24, i1 false)
> +; CHECK-NEXT:    unreachable
> +;
> +entry:
> +  %vv.sroa.4 = alloca [3 x i32*]
> +  %vv.sroa.4.0..sroa_cast61 = bitcast [3 x i32*]* %vv.sroa.4 to i8*
> +  %vv.sroa.4.0..sroa_cast94 = bitcast [3 x i32*]* %vv.sroa.4 to i8*
> +  call void @llvm.lifetime.start.p0i8(i64 24, i8* nonnull align 8
> dereferenceable(24) %vv.sroa.4.0..sroa_cast94)
> +  br i1 undef, label %do.body, label %if.end31
> +
> +do.body:                                          ; preds = %entry
> +  ret void
> +
> +if.end31:                                         ; preds = %entry
> +  call void @llvm.memcpy.p0i8.p0i8.i64(i8* noalias nonnull align 8
> dereferenceable(24) %vv.sroa.4.0..sroa_cast61, i8* noalias nonnull align 8
> undef, i64 24, i1 false)
> +  unreachable
> +}
> +
> +define hidden void @new_markers() {
> +;
> +; CHECK-LABEL: define {{[^@]+}}@new_markers(
> +; CHECK-NEXT:  entry:
> +; CHECK-NEXT:    [[VV_SROA_4:%.*]] = alloca [3 x i32*]
> +; CHECK-NEXT:    [[VV_SROA_4_0__SROA_CAST61:%.*]] = bitcast [3 x i32*]*
> [[VV_SROA_4]] to i8*
> +; CHECK-NEXT:    br i1 undef, label [[DO_BODY:%.*]], label
> [[IF_END31:%.*]]
> +; CHECK:       do.body:
> +; CHECK-NEXT:    ret void
> +; CHECK:       if.end31:
> +; CHECK-NEXT:    call void @llvm.memcpy.p0i8.p0i8.i64(i8* noalias nonnull
> align 8 dereferenceable(24) [[VV_SROA_4_0__SROA_CAST61]], i8* noalias
> nonnull align 8 undef, i64 24, i1 false)
> +; CHECK-NEXT:    unreachable
> +;
> +entry:
> +  %vv.sroa.4 = alloca [3 x i32*]
> +  %vv.sroa.4.0..sroa_cast61 = bitcast [3 x i32*]* %vv.sroa.4 to i8*
> +  %vv.sroa.4.0..sroa_cast94 = bitcast [3 x i32*]* %vv.sroa.4 to i8*
> +  call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull align 8
> dereferenceable(24) %vv.sroa.4.0..sroa_cast94)
> +  br i1 undef, label %do.body, label %if.end31
> +
> +do.body:                                          ; preds = %entry
> +  ret void
> +
> +if.end31:                                         ; preds = %entry
> +  call void @llvm.memcpy.p0i8.p0i8.i64(i8* noalias nonnull align 8
> dereferenceable(24) %vv.sroa.4.0..sroa_cast61, i8* noalias nonnull align 8
> undef, i64 24, i1 false)
> +  unreachable
> +}
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20191014/d01dde22/attachment-0001.html>


More information about the llvm-commits mailing list