<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p.msonormal0, li.msonormal0, div.msonormal0
        {mso-style-name:msonormal;
        mso-margin-top-alt:auto;
        margin-right:0cm;
        mso-margin-bottom-alt:auto;
        margin-left:0cm;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
span.EmailStyle18
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;
        mso-fareast-language:EN-US;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:2.0cm 42.5pt 2.0cm 3.0cm;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="RU" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><span lang="EN-US" style="mso-fareast-language:EN-US">Hi<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="mso-fareast-language:EN-US">Ilya, thanks for revert. Could you please check if it passes with this patch together with fix
<a href="https://reviews.llvm.org/D55357">https://reviews.llvm.org/D55357</a> ? I don’t have a chance to build clang and check it on my side, at least not within reasonable amount of time.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="mso-fareast-language:EN-US">Regards,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="mso-fareast-language:EN-US">Max<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><b><span lang="EN-US">From:</span></b><span lang="EN-US"> Ilya Biryukov <ibiryukov@google.com>
<br>
<b>Sent:</b> Thursday, December 6, 2018 8:20 PM<br>
<b>To:</b> Maxim Kazantsev <max.kazantsev@azul.com><br>
<b>Cc:</b> llvm-commits <llvm-commits@lists.llvm.org><br>
<b>Subject:</b> Re: [llvm] r348457 - [LoopSimplifyCFG] Delete dead in-loop blocks<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div>
<div>
<div>
<div>
<p class="MsoNormal">Hi Max,<o:p></o:p></p>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">I ran into a crash caused by this change when compiling an instrumented version of clang. The crash happens when -fprofile-generate and -fexperimental-new-pass-manager are specified.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">The reproduces reliably with:<o:p></o:p></p>
</div>
<div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">LLVM_ROOT="$HOME/projects/llvm"<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">BUILD_ROOT="$HOME/projects/llvm/build-rel"<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">$BUILD_ROOT/bin/clang++ -fexperimental-new-pass-manager -O3 -I "$LLVM_ROOT/include" -I "$BUILD_ROOT/include" -std=gnu++17 -fprofile-generate=./profile -c "$LLVM_ROOT/lib/CodeGen/RegAllocPBQP.cpp" -o foo.o<o:p></o:p></p>
</div>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">I'll revert the change to unblock our integrate, but please let me know if need help reproducing this.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<div>
<p class="MsoNormal">LLVM_ROOT="$HOME/projects/llvm"<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">BUILD_ROOT="$HOME/projects/llvm/build-rel"<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">./bin/clang++ -fexperimental-new-pass-manager -O3 -I "$LLVM_ROOT/include" -I "$BUILD_ROOT/include" -std=gnu++17 -fprofile-generate=./profile -c "$LLVM_ROOT/lib/CodeGen/RegAllocPBQP.cpp" -o foo.o<o:p></o:p></p>
</div>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Crash stacktrace:<o:p></o:p></p>
</div>
<div>
<div>
<p class="MsoNormal">0.      Program arguments: /home/ibiryukov/projects/llvm/build-rel/bin/clang-8 -cc1 -triple x86_64-unknown-linux-gnu -emit-obj -disable-free -main-file-name RegAllocPBQP.cpp -mrelocation-model static -mthread-model posix -fmath-errno -masm-verbose
 -mconstructor-aliases -munwind-tables -fuse-init-array -target-cpu x86-64 -dwarf-column-info -debugger-tuning=gdb -momit-leaf-frame-pointer -fprofile-instrument=llvm -fprofile-instrument-path=./profile/default_%m.profraw -coverage-notes-file /home/ibiryukov/projects/llvm/build-rel/foo.gcno
 -resource-dir /home/ibiryukov/projects/llvm/build-rel/lib/clang/8.0.0 -I /home/ibiryukov/projects/llvm/include -I /home/ibiryukov/projects/llvm/build-rel/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/8.0.1/../../../../include/c++/8.0.1 -internal-isystem
 /usr/lib/gcc/x86_64-linux-gnu/8.0.1/../../../../include/x86_64-linux-gnu/c++/8.0.1 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/8.0.1/../../../../include/x86_64-linux-gnu/c++/8.0.1 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/8.0.1/../../../../include/c++/8.0.1/backward
 -internal-isystem /usr/local/include -internal-isystem /home/ibiryukov/projects/llvm/build-rel/lib/clang/8.0.0/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -O3 -fdeprecated-macro
 -fdebug-compilation-dir /home/ibiryukov/projects/llvm/build-rel -ferror-limit 19 -fmessage-length 213 -fexperimental-new-pass-manager -fobjc-runtime=gcc -fcxx-exceptions -fexceptions -fdiagnostics-show-option -fcolor-diagnostics -vectorize-loops -vectorize-slp
 -o foo.o -x c++ /home/ibiryukov/projects/llvm/lib/CodeGen/RegAllocPBQP.cpp -faddrsig<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">1.      <eof> parser at end of file<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">2.      Optimizer<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#0 0x0000000003f63c84 PrintStackTrace /home/ibiryukov/projects/llvm/build-rel/../lib/Support/Unix/Signals.inc:495:13<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#1 0x0000000003f63c84 PrintStackTraceSignalHandler(void*) /home/ibiryukov/projects/llvm/build-rel/../lib/Support/Unix/Signals.inc:558:0<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#2 0x0000000003f619ee llvm::sys::RunSignalHandlers() /home/ibiryukov/projects/llvm/build-rel/../lib/Support/Signals.cpp:68:18<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#3 0x0000000003f63e48 SignalHandler(int) /home/ibiryukov/projects/llvm/build-rel/../lib/Support/Unix/Signals.inc:358:1<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#4 0x00007f3452c550c0 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x110c0)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#5 0x00007f34517e6fcf gsignal (/lib/x86_64-linux-gnu/libc.so.6+0x32fcf)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#6 0x00007f34517e83fa abort (/lib/x86_64-linux-gnu/libc.so.6+0x343fa)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#7 0x00007f34517dfe37 (/lib/x86_64-linux-gnu/libc.so.6+0x2be37)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#8 0x00007f34517dfee2 (/lib/x86_64-linux-gnu/libc.so.6+0x2bee2)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#9 0x0000000003f65888 (/home/ibiryukov/projects/llvm/build-rel/bin/clang-8+0x3f65888)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#10 0x0000000003da202a fetch_add /usr/bin/../lib/gcc/x86_64-linux-gnu/8.0.1/../../../../include/c++/8.0.1/bits/atomic_base.h:514:16<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#11 0x0000000003da202a operator++ /home/ibiryukov/projects/llvm/build-rel/../include/llvm/ADT/Statistic.h:80:0<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#12 0x0000000003da202a ConstantTerminatorFoldingImpl::deleteDeadLoopBlocks() /home/ibiryukov/projects/llvm/build-rel/../lib/Transforms/Scalar/LoopSimplifyCFG.cpp:256:0<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#13 0x0000000003da04b2 ConstantTerminatorFoldingImpl::run() /home/ibiryukov/projects/llvm/build-rel/../lib/Transforms/Scalar/LoopSimplifyCFG.cpp:384:5<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#14 0x0000000003d9f38d constantFoldTerminators /home/ibiryukov/projects/llvm/build-rel/../lib/Transforms/Scalar/LoopSimplifyCFG.cpp:406:23<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#15 0x0000000003d9f38d simplifyLoopCFG(llvm::Loop&, llvm::DominatorTree&, llvm::LoopInfo&, llvm::ScalarEvolution&, llvm::MemorySSAUpdater*) /home/ibiryukov/projects/llvm/build-rel/../lib/Transforms/Scalar/LoopSimplifyCFG.cpp:442:0<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#16 0x0000000003d9f15d llvm::LoopSimplifyCFGPass::run(llvm::Loop&, llvm::AnalysisManager<llvm::Loop, llvm::LoopStandardAnalysisResults&>&, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&) /home/ibiryukov/projects/llvm/build-rel/../lib/Transforms/Scalar/LoopSimplifyCFG.cpp:459:7<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#17 0x0000000004af33ed llvm::detail::PassModel<llvm::Loop, llvm::LoopSimplifyCFGPass, llvm::PreservedAnalyses, llvm::AnalysisManager<llvm::Loop, llvm::LoopStandardAnalysisResults&>, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&>::run(llvm::Loop&,
 llvm::AnalysisManager<llvm::Loop, llvm::LoopStandardAnalysisResults&>&, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&) /home/ibiryukov/projects/llvm/build-rel/../include/llvm/IR/PassManagerInternal.h:80:5<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#18 0x0000000004b4a6e8 llvm::PassManager<llvm::Loop, llvm::AnalysisManager<llvm::Loop, llvm::LoopStandardAnalysisResults&>, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&>::run(llvm::Loop&, llvm::AnalysisManager<llvm::Loop, llvm::LoopStandardAnalysisResults&>&,
 llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&) /home/ibiryukov/projects/llvm/build-rel/../lib/Transforms/Scalar/LoopPassManager.cpp:45:38<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#19 0x0000000004af676e runBeforePass<llvm::Function, llvm::PassManager<llvm::Function> > /home/ibiryukov/projects/llvm/build-rel/../include/llvm/IR/PassInstrumentation.h:132:10<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#20 0x0000000004af676e llvm::FunctionToLoopPassAdaptor<llvm::PassManager<llvm::Loop, llvm::AnalysisManager<llvm::Loop, llvm::LoopStandardAnalysisResults&>, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&> >::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&)
 /home/ibiryukov/projects/llvm/build-rel/../include/llvm/Transforms/Scalar/LoopPassManager.h:284:0<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#21 0x0000000004af5ddd llvm::detail::PassModel<llvm::Function, llvm::FunctionToLoopPassAdaptor<llvm::PassManager<llvm::Loop, llvm::AnalysisManager<llvm::Loop, llvm::LoopStandardAnalysisResults&>, llvm::LoopStandardAnalysisResults&, llvm::LPMUpdater&>
 >, llvm::PreservedAnalyses, llvm::AnalysisManager<llvm::Function> >::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) /home/ibiryukov/projects/llvm/build-rel/../include/llvm/IR/PassManagerInternal.h:80:5<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#22 0x0000000003978761 llvm::PassManager<llvm::Function, llvm::AnalysisManager<llvm::Function> >::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) /home/ibiryukov/projects/llvm/build-rel/../include/llvm/IR/PassManager.h:509:37<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#23 0x0000000004afc960 runBeforePass<llvm::Function, llvm::PassManager<llvm::Function> > /home/ibiryukov/projects/llvm/build-rel/../include/llvm/IR/PassInstrumentation.h:132:10<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#24 0x0000000004afc960 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&) /home/ibiryukov/projects/llvm/build-rel/../include/llvm/Analysis/CGSCCPassManager.h:634:0<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#25 0x0000000004afc47d 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&) /home/ibiryukov/projects/llvm/build-rel/../include/llvm/IR/PassManagerInternal.h:80:5<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#26 0x00000000039e4113 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&) /home/ibiryukov/projects/llvm/build-rel/../lib/Analysis/CGSCCPassManager.cpp:80:38<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#27 0x0000000004b090e9 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&) /home/ibiryukov/projects/llvm/build-rel/../include/llvm/Analysis/CGSCCPassManager.h:763:39<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#28 0x0000000004b08575 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>&) /home/ibiryukov/projects/llvm/build-rel/../include/llvm/Analysis/CGSCCPassManager.h:442:45<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#29 0x0000000004b0785d 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>&) /home/ibiryukov/projects/llvm/build-rel/../include/llvm/IR/PassManagerInternal.h:80:5<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#30 0x0000000003976c51 llvm::PassManager<llvm::Module, llvm::AnalysisManager<llvm::Module> >::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) /home/ibiryukov/projects/llvm/build-rel/../include/llvm/IR/PassManager.h:509:37<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#31 0x0000000004b1140d 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>&)
 /home/ibiryukov/projects/llvm/build-rel/../include/llvm/IR/PassManagerInternal.h:80:5<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#32 0x0000000003976c51 llvm::PassManager<llvm::Module, llvm::AnalysisManager<llvm::Module> >::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) /home/ibiryukov/projects/llvm/build-rel/../include/llvm/IR/PassManager.h:509:37<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#33 0x0000000004137bc2 isSmall /home/ibiryukov/projects/llvm/build-rel/../include/llvm/ADT/SmallPtrSet.h:195:33<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#34 0x0000000004137bc2 ~SmallPtrSetImplBase /home/ibiryukov/projects/llvm/build-rel/../include/llvm/ADT/SmallPtrSet.h:83:0<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#35 0x0000000004137bc2 ~PreservedAnalyses /home/ibiryukov/projects/llvm/build-rel/../include/llvm/IR/PassManager.h:154:0<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#36 0x0000000004137bc2 EmitAssemblyWithNewPassManager /home/ibiryukov/projects/llvm/build-rel/../tools/clang/lib/CodeGen/BackendUtil.cpp:1097:0<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#37 0x0000000004137bc2 clang::EmitBackendOutput(clang::DiagnosticsEngine&, clang::HeaderSearchOptions const&, clang::CodeGenOptions const&, clang::TargetOptions const&, clang::LangOptions const&, llvm::DataLayout const&, llvm::Module*,
 clang::BackendAction, std::unique_ptr<llvm::raw_pwrite_stream, std::default_delete<llvm::raw_pwrite_stream> >) /home/ibiryukov/projects/llvm/build-rel/../tools/clang/lib/CodeGen/BackendUtil.cpp:1299:0<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#38 0x000000000477550a ~unique_ptr /usr/bin/../lib/gcc/x86_64-linux-gnu/8.0.1/../../../../include/c++/8.0.1/bits/unique_ptr.h:273:6<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#39 0x000000000477550a clang::BackendConsumer::HandleTranslationUnit(clang::ASTContext&) /home/ibiryukov/projects/llvm/build-rel/../tools/clang/lib/CodeGen/CodeGenAction.cpp:293:0<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#40 0x000000000523b5b3 __normal_iterator /usr/bin/../lib/gcc/x86_64-linux-gnu/8.0.1/../../../../include/c++/8.0.1/bits/stl_iterator.h:781:20<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#41 0x000000000523b5b3 begin /usr/bin/../lib/gcc/x86_64-linux-gnu/8.0.1/../../../../include/c++/8.0.1/bits/stl_vector.h:699:0<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#42 0x000000000523b5b3 finalize<std::vector<std::unique_ptr<clang::TemplateInstantiationCallback, std::default_delete<clang::TemplateInstantiationCallback> >, std::allocator<std::unique_ptr<clang::TemplateInstantiationCallback, std::default_delete<clang::TemplateInstantiationCallback>
 > > > > /home/ibiryukov/projects/llvm/build-rel/../tools/clang/include/clang/Sema/TemplateInstCallback.h:55:0<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#43 0x000000000523b5b3 clang::ParseAST(clang::Sema&, bool, bool) /home/ibiryukov/projects/llvm/build-rel/../tools/clang/lib/Parse/ParseAST.cpp:177:0<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#44 0x00000000046d4ac0 clang::FrontendAction::Execute() /home/ibiryukov/projects/llvm/build-rel/../tools/clang/lib/Frontend/FrontendAction.cpp:921:10<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#45 0x0000000004647dc1 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) /home/ibiryukov/projects/llvm/build-rel/../tools/clang/lib/Frontend/CompilerInstance.cpp:956:11<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#46 0x000000000476fab4 clang::ExecuteCompilerInvocation(clang::CompilerInstance*) /home/ibiryukov/projects/llvm/build-rel/../tools/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp:266:25<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#47 0x0000000002544c97 cc1_main(llvm::ArrayRef<char const*>, char const*, void*) /home/ibiryukov/projects/llvm/build-rel/../tools/clang/tools/driver/cc1_main.cpp:219:13<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#48 0x0000000002542db5 ExecuteCC1Tool /home/ibiryukov/projects/llvm/build-rel/../tools/clang/tools/driver/driver.cpp:310:12<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#49 0x0000000002542db5 main /home/ibiryukov/projects/llvm/build-rel/../tools/clang/tools/driver/driver.cpp:382:0<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#50 0x00007f34517d42b1 __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x202b1)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">#51 0x000000000254002a _start (/home/ibiryukov/projects/llvm/build-rel/bin/clang-8+0x254002a)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">clang-8: error: unable to execute command: Aborted<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">clang-8: error: clang frontend command failed due to signal (use -v to see invocation)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">clang version 8.0.0 (trunk 348473) (llvm/trunk 348482)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">Target: x86_64-unknown-linux-gnu<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">Thread model: posix<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">InstalledDir: /home/ibiryukov/projects/llvm/build-rel/./bin<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div>
<p class="MsoNormal">On Thu, Dec 6, 2018 at 6:47 AM Max Kazantsev via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<o:p></o:p></p>
</div>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0cm 0cm 0cm 6.0pt;margin-left:4.8pt;margin-right:0cm">
<p class="MsoNormal">Author: mkazantsev<br>
Date: Wed Dec  5 21:45:02 2018<br>
New Revision: 348457<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=348457&view=rev" target="_blank">
http://llvm.org/viewvc/llvm-project?rev=348457&view=rev</a><br>
Log:<br>
[LoopSimplifyCFG] Delete dead in-loop blocks<br>
<br>
This patch teaches LoopSimplifyCFG to delete loop blocks that have<br>
become unreachable after terminator folding has been done.<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D54023" target="_blank">
https://reviews.llvm.org/D54023</a><br>
Reviewed By: anna<br>
<br>
Modified:<br>
    llvm/trunk/lib/Transforms/Scalar/LoopSimplifyCFG.cpp<br>
    llvm/trunk/test/Transforms/LoopSimplifyCFG/constant-fold-branch.ll<br>
<br>
Modified: llvm/trunk/lib/Transforms/Scalar/LoopSimplifyCFG.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopSimplifyCFG.cpp?rev=348457&r1=348456&r2=348457&view=diff" target="_blank">
http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopSimplifyCFG.cpp?rev=348457&r1=348456&r2=348457&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Transforms/Scalar/LoopSimplifyCFG.cpp (original)<br>
+++ llvm/trunk/lib/Transforms/Scalar/LoopSimplifyCFG.cpp Wed Dec  5 21:45:02 2018<br>
@@ -46,6 +46,8 @@ static cl::opt<bool> EnableTermFolding("<br>
<br>
 STATISTIC(NumTerminatorsFolded,<br>
           "Number of terminators folded to unconditional branches");<br>
+STATISTIC(NumLoopBlocksDeleted,<br>
+          "Number of loop blocks deleted");<br>
<br>
 /// If \p BB is a switch or a conditional branch, but only one of its successors<br>
 /// can be reached from this block in runtime, return this successor. Otherwise,<br>
@@ -234,6 +236,27 @@ private:<br>
            "All blocks that stay in loop should be live!");<br>
   }<br>
<br>
+  /// Delete loop blocks that have become unreachable after folding. Make all<br>
+  /// relevant updates to DT and LI.<br>
+  void deleteDeadLoopBlocks() {<br>
+    DomTreeUpdater DTU(DT, DomTreeUpdater::UpdateStrategy::Eager);<br>
+    if (MSSAU)<br>
+      MSSAU->removeBlocks(DeadLoopBlocks);<br>
+    for (auto *BB : DeadLoopBlocks) {<br>
+      assert(BB != L.getHeader() &&<br>
+             "Header of the current loop cannot be dead!");<br>
+      LLVM_DEBUG(dbgs() << "Deleting dead loop block " << BB->getName()<br>
+                        << "\n");<br>
+      if (LI.isLoopHeader(BB)) {<br>
+        assert(LI.getLoopFor(BB) != &L && "Attempt to remove current loop!");<br>
+        LI.erase(LI.getLoopFor(BB));<br>
+      }<br>
+      LI.removeBlock(BB);<br>
+      DeleteDeadBlock(BB, &DTU);<br>
+      ++NumLoopBlocksDeleted;<br>
+    }<br>
+  }<br>
+<br>
   /// Constant-fold terminators of blocks acculumated in FoldCandidates into the<br>
   /// unconditional branches.<br>
   void foldTerminators() {<br>
@@ -318,15 +341,6 @@ public:<br>
       return false;<br>
     }<br>
<br>
-    // TODO: Support deletion of dead loop blocks.<br>
-    if (!DeadLoopBlocks.empty()) {<br>
-      LLVM_DEBUG(dbgs() << "Give up constant terminator folding in loop "<br>
-                        << L.getHeader()->getName()<br>
-                        << ": we don't currently"<br>
-                           " support deletion of dead in-loop blocks.\n");<br>
-      return false;<br>
-    }<br>
-<br>
     // TODO: Support dead loop exits.<br>
     if (!DeadExitBlocks.empty()) {<br>
       LLVM_DEBUG(dbgs() << "Give up constant terminator folding in loop "<br>
@@ -337,7 +351,8 @@ public:<br>
<br>
     // TODO: Support blocks that are not dead, but also not in loop after the<br>
     // folding.<br>
-    if (BlocksInLoopAfterFolding.size() != L.getNumBlocks()) {<br>
+    if (BlocksInLoopAfterFolding.size() + DeadLoopBlocks.size() !=<br>
+        L.getNumBlocks()) {<br>
       LLVM_DEBUG(<br>
           dbgs() << "Give up constant terminator folding in loop "<br>
                  << L.getHeader()->getName()<br>
@@ -357,6 +372,13 @@ public:<br>
     // Make the actual transforms.<br>
     foldTerminators();<br>
<br>
+    if (!DeadLoopBlocks.empty()) {<br>
+      LLVM_DEBUG(dbgs() << "Deleting " << DeadLoopBlocks.size()<br>
+                    << " dead blocks in loop " << L.getHeader()->getName()<br>
+                    << "\n");<br>
+      deleteDeadLoopBlocks();<br>
+    }<br>
+<br>
 #ifndef NDEBUG<br>
     // Make sure that we have preserved all data structures after the transform.<br>
     DT.verify();<br>
<br>
Modified: llvm/trunk/test/Transforms/LoopSimplifyCFG/constant-fold-branch.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LoopSimplifyCFG/constant-fold-branch.ll?rev=348457&r1=348456&r2=348457&view=diff" target="_blank">
http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LoopSimplifyCFG/constant-fold-branch.ll?rev=348457&r1=348456&r2=348457&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/test/Transforms/LoopSimplifyCFG/constant-fold-branch.ll (original)<br>
+++ llvm/trunk/test/Transforms/LoopSimplifyCFG/constant-fold-branch.ll Wed Dec  5 21:45:02 2018<br>
@@ -88,18 +88,12 @@ define i32 @dead_block_test_branch_loop(<br>
 ; CHECK-NEXT:  preheader:<br>
 ; CHECK-NEXT:    br label [[HEADER:%.*]]<br>
 ; CHECK:       header:<br>
-; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[PREHEADER:%.*]] ], [ [[I_INC:%.*]], [[BACKEDGE:%.*]] ]<br>
-; CHECK-NEXT:    br i1 true, label [[BACKEDGE]], label [[DEAD:%.*]]<br>
-; CHECK:       dead:<br>
-; CHECK-NEXT:    [[I_2:%.*]] = add i32 [[I]], 1<br>
-; CHECK-NEXT:    br label [[BACKEDGE]]<br>
-; CHECK:       backedge:<br>
-; CHECK-NEXT:    [[I_1:%.*]] = phi i32 [ [[I]], [[HEADER]] ], [ [[I_2]], [[DEAD]] ]<br>
-; CHECK-NEXT:    [[I_INC]] = add i32 [[I_1]], 1<br>
+; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[PREHEADER:%.*]] ], [ [[I_INC:%.*]], [[HEADER]] ]<br>
+; CHECK-NEXT:    [[I_INC]] = add i32 [[I]], 1<br>
 ; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[I_INC]], [[END:%.*]]<br>
 ; CHECK-NEXT:    br i1 [[CMP]], label [[HEADER]], label [[EXIT:%.*]]<br>
 ; CHECK:       exit:<br>
-; CHECK-NEXT:    [[I_INC_LCSSA:%.*]] = phi i32 [ [[I_INC]], [[BACKEDGE]] ]<br>
+; CHECK-NEXT:    [[I_INC_LCSSA:%.*]] = phi i32 [ [[I_INC]], [[HEADER]] ]<br>
 ; CHECK-NEXT:    ret i32 [[I_INC_LCSSA]]<br>
 ;<br>
 preheader:<br>
@@ -129,22 +123,12 @@ define i32 @dead_block_test_switch_loop(<br>
 ; CHECK-NEXT:  preheader:<br>
 ; CHECK-NEXT:    br label [[HEADER:%.*]]<br>
 ; CHECK:       header:<br>
-; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[PREHEADER:%.*]] ], [ [[I_INC:%.*]], [[BACKEDGE:%.*]] ]<br>
-; CHECK-NEXT:    switch i32 1, label [[DEAD:%.*]] [<br>
-; CHECK-NEXT:    i32 0, label [[DEAD]]<br>
-; CHECK-NEXT:    i32 1, label [[BACKEDGE]]<br>
-; CHECK-NEXT:    i32 2, label [[DEAD]]<br>
-; CHECK-NEXT:    ]<br>
-; CHECK:       dead:<br>
-; CHECK-NEXT:    [[I_2:%.*]] = add i32 [[I]], 1<br>
-; CHECK-NEXT:    br label [[BACKEDGE]]<br>
-; CHECK:       backedge:<br>
-; CHECK-NEXT:    [[I_1:%.*]] = phi i32 [ [[I]], [[HEADER]] ], [ [[I_2]], [[DEAD]] ]<br>
-; CHECK-NEXT:    [[I_INC]] = add i32 [[I_1]], 1<br>
+; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[PREHEADER:%.*]] ], [ [[I_INC:%.*]], [[HEADER]] ]<br>
+; CHECK-NEXT:    [[I_INC]] = add i32 [[I]], 1<br>
 ; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[I_INC]], [[END:%.*]]<br>
 ; CHECK-NEXT:    br i1 [[CMP]], label [[HEADER]], label [[EXIT:%.*]]<br>
 ; CHECK:       exit:<br>
-; CHECK-NEXT:    [[I_INC_LCSSA:%.*]] = phi i32 [ [[I_INC]], [[BACKEDGE]] ]<br>
+; CHECK-NEXT:    [[I_INC_LCSSA:%.*]] = phi i32 [ [[I_INC]], [[HEADER]] ]<br>
 ; CHECK-NEXT:    ret i32 [[I_INC_LCSSA]]<br>
 ;<br>
 preheader:<br>
@@ -175,18 +159,12 @@ define i32 @dead_block_propogate_test_br<br>
 ; CHECK-NEXT:  preheader:<br>
 ; CHECK-NEXT:    br label [[HEADER:%.*]]<br>
 ; CHECK:       header:<br>
-; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[PREHEADER:%.*]] ], [ [[I_INC:%.*]], [[BACKEDGE:%.*]] ]<br>
-; CHECK-NEXT:    br i1 true, label [[BACKEDGE]], label [[DEAD:%.*]]<br>
-; CHECK:       dead:<br>
-; CHECK-NEXT:    [[I_2:%.*]] = add i32 [[I]], 1<br>
-; CHECK-NEXT:    br label [[BACKEDGE]]<br>
-; CHECK:       backedge:<br>
-; CHECK-NEXT:    [[I_1:%.*]] = phi i32 [ [[I]], [[HEADER]] ], [ [[I_2]], [[DEAD]] ]<br>
-; CHECK-NEXT:    [[I_INC]] = add i32 [[I_1]], 1<br>
+; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[PREHEADER:%.*]] ], [ [[I_INC:%.*]], [[HEADER]] ]<br>
+; CHECK-NEXT:    [[I_INC]] = add i32 [[I]], 1<br>
 ; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[I_INC]], [[END:%.*]]<br>
 ; CHECK-NEXT:    br i1 [[CMP]], label [[HEADER]], label [[EXIT:%.*]]<br>
 ; CHECK:       exit:<br>
-; CHECK-NEXT:    [[I_INC_LCSSA:%.*]] = phi i32 [ [[I_INC]], [[BACKEDGE]] ]<br>
+; CHECK-NEXT:    [[I_INC_LCSSA:%.*]] = phi i32 [ [[I_INC]], [[HEADER]] ]<br>
 ; CHECK-NEXT:    ret i32 [[I_INC_LCSSA]]<br>
 ;<br>
 preheader:<br>
@@ -219,22 +197,12 @@ define i32 @dead_block_propogate_test_sw<br>
 ; CHECK-NEXT:  preheader:<br>
 ; CHECK-NEXT:    br label [[HEADER:%.*]]<br>
 ; CHECK:       header:<br>
-; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[PREHEADER:%.*]] ], [ [[I_INC:%.*]], [[BACKEDGE:%.*]] ]<br>
-; CHECK-NEXT:    switch i32 1, label [[DEAD:%.*]] [<br>
-; CHECK-NEXT:    i32 0, label [[DEAD]]<br>
-; CHECK-NEXT:    i32 1, label [[BACKEDGE]]<br>
-; CHECK-NEXT:    i32 2, label [[DEAD]]<br>
-; CHECK-NEXT:    ]<br>
-; CHECK:       dead:<br>
-; CHECK-NEXT:    [[I_2:%.*]] = add i32 [[I]], 1<br>
-; CHECK-NEXT:    br label [[BACKEDGE]]<br>
-; CHECK:       backedge:<br>
-; CHECK-NEXT:    [[I_1:%.*]] = phi i32 [ [[I]], [[HEADER]] ], [ [[I_2]], [[DEAD]] ]<br>
-; CHECK-NEXT:    [[I_INC]] = add i32 [[I_1]], 1<br>
+; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[PREHEADER:%.*]] ], [ [[I_INC:%.*]], [[HEADER]] ]<br>
+; CHECK-NEXT:    [[I_INC]] = add i32 [[I]], 1<br>
 ; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[I_INC]], [[END:%.*]]<br>
 ; CHECK-NEXT:    br i1 [[CMP]], label [[HEADER]], label [[EXIT:%.*]]<br>
 ; CHECK:       exit:<br>
-; CHECK-NEXT:    [[I_INC_LCSSA:%.*]] = phi i32 [ [[I_INC]], [[BACKEDGE]] ]<br>
+; CHECK-NEXT:    [[I_INC_LCSSA:%.*]] = phi i32 [ [[I_INC]], [[HEADER]] ]<br>
 ; CHECK-NEXT:    ret i32 [[I_INC_LCSSA]]<br>
 ;<br>
 preheader:<br>
@@ -463,32 +431,19 @@ define i32 @dead_sub_loop_test_branch_lo<br>
 ; CHECK-NEXT:  preheader:<br>
 ; CHECK-NEXT:    br label [[HEADER:%.*]]<br>
 ; CHECK:       header:<br>
-; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[PREHEADER:%.*]] ], [ [[I_INC:%.*]], [[BACKEDGE:%.*]] ]<br>
-; CHECK-NEXT:    br i1 true, label [[LIVE_PREHEADER:%.*]], label [[DEAD_PREHEADER:%.*]]<br>
-; CHECK:       live_preheader:<br>
+; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[PREHEADER:%.*]] ], [ [[I_INC:%.*]], [[EXIT_A:%.*]] ]<br>
 ; CHECK-NEXT:    br label [[LIVE_LOOP:%.*]]<br>
 ; CHECK:       live_loop:<br>
-; CHECK-NEXT:    [[A:%.*]] = phi i32 [ 0, [[LIVE_PREHEADER]] ], [ [[A_INC:%.*]], [[LIVE_LOOP]] ]<br>
+; CHECK-NEXT:    [[A:%.*]] = phi i32 [ 0, [[HEADER]] ], [ [[A_INC:%.*]], [[LIVE_LOOP]] ]<br>
 ; CHECK-NEXT:    [[A_INC]] = add i32 [[A]], 1<br>
 ; CHECK-NEXT:    [[CMP_A:%.*]] = icmp slt i32 [[A_INC]], [[END:%.*]]<br>
-; CHECK-NEXT:    br i1 [[CMP_A]], label [[LIVE_LOOP]], label [[EXIT_A:%.*]]<br>
+; CHECK-NEXT:    br i1 [[CMP_A]], label [[LIVE_LOOP]], label [[EXIT_A]]<br>
 ; CHECK:       exit.a:<br>
-; CHECK-NEXT:    br label [[BACKEDGE]]<br>
-; CHECK:       dead_preheader:<br>
-; CHECK-NEXT:    br label [[DEAD_LOOP:%.*]]<br>
-; CHECK:       dead_loop:<br>
-; CHECK-NEXT:    [[B:%.*]] = phi i32 [ 0, [[DEAD_PREHEADER]] ], [ [[B_INC:%.*]], [[DEAD_LOOP]] ]<br>
-; CHECK-NEXT:    [[B_INC]] = add i32 [[B]], 1<br>
-; CHECK-NEXT:    [[CMP_B:%.*]] = icmp slt i32 [[B_INC]], [[END]]<br>
-; CHECK-NEXT:    br i1 [[CMP_B]], label [[DEAD_LOOP]], label [[EXIT_B:%.*]]<br>
-; CHECK:       exit.b:<br>
-; CHECK-NEXT:    br label [[BACKEDGE]]<br>
-; CHECK:       backedge:<br>
 ; CHECK-NEXT:    [[I_INC]] = add i32 [[I]], 1<br>
 ; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[I_INC]], [[END]]<br>
 ; CHECK-NEXT:    br i1 [[CMP]], label [[HEADER]], label [[EXIT:%.*]]<br>
 ; CHECK:       exit:<br>
-; CHECK-NEXT:    [[I_INC_LCSSA:%.*]] = phi i32 [ [[I_INC]], [[BACKEDGE]] ]<br>
+; CHECK-NEXT:    [[I_INC_LCSSA:%.*]] = phi i32 [ [[I_INC]], [[EXIT_A]] ]<br>
 ; CHECK-NEXT:    ret i32 [[I_INC_LCSSA]]<br>
 ;<br>
 preheader:<br>
@@ -536,36 +491,19 @@ define i32 @dead_sub_loop_test_switch_lo<br>
 ; CHECK-NEXT:  preheader:<br>
 ; CHECK-NEXT:    br label [[HEADER:%.*]]<br>
 ; CHECK:       header:<br>
-; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[PREHEADER:%.*]] ], [ [[I_INC:%.*]], [[BACKEDGE:%.*]] ]<br>
-; CHECK-NEXT:    switch i32 1, label [[DEAD_PREHEADER:%.*]] [<br>
-; CHECK-NEXT:    i32 0, label [[DEAD_PREHEADER]]<br>
-; CHECK-NEXT:    i32 1, label [[LIVE_PREHEADER:%.*]]<br>
-; CHECK-NEXT:    i32 2, label [[DEAD_PREHEADER]]<br>
-; CHECK-NEXT:    ]<br>
-; CHECK:       live_preheader:<br>
+; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[PREHEADER:%.*]] ], [ [[I_INC:%.*]], [[EXIT_A:%.*]] ]<br>
 ; CHECK-NEXT:    br label [[LIVE_LOOP:%.*]]<br>
 ; CHECK:       live_loop:<br>
-; CHECK-NEXT:    [[A:%.*]] = phi i32 [ 0, [[LIVE_PREHEADER]] ], [ [[A_INC:%.*]], [[LIVE_LOOP]] ]<br>
+; CHECK-NEXT:    [[A:%.*]] = phi i32 [ 0, [[HEADER]] ], [ [[A_INC:%.*]], [[LIVE_LOOP]] ]<br>
 ; CHECK-NEXT:    [[A_INC]] = add i32 [[A]], 1<br>
 ; CHECK-NEXT:    [[CMP_A:%.*]] = icmp slt i32 [[A_INC]], [[END:%.*]]<br>
-; CHECK-NEXT:    br i1 [[CMP_A]], label [[LIVE_LOOP]], label [[EXIT_A:%.*]]<br>
+; CHECK-NEXT:    br i1 [[CMP_A]], label [[LIVE_LOOP]], label [[EXIT_A]]<br>
 ; CHECK:       exit.a:<br>
-; CHECK-NEXT:    br label [[BACKEDGE]]<br>
-; CHECK:       dead_preheader:<br>
-; CHECK-NEXT:    br label [[DEAD_LOOP:%.*]]<br>
-; CHECK:       dead_loop:<br>
-; CHECK-NEXT:    [[B:%.*]] = phi i32 [ 0, [[DEAD_PREHEADER]] ], [ [[B_INC:%.*]], [[DEAD_LOOP]] ]<br>
-; CHECK-NEXT:    [[B_INC]] = add i32 [[B]], 1<br>
-; CHECK-NEXT:    [[CMP_B:%.*]] = icmp slt i32 [[B_INC]], [[END]]<br>
-; CHECK-NEXT:    br i1 [[CMP_B]], label [[DEAD_LOOP]], label [[EXIT_B:%.*]]<br>
-; CHECK:       exit.b:<br>
-; CHECK-NEXT:    br label [[BACKEDGE]]<br>
-; CHECK:       backedge:<br>
 ; CHECK-NEXT:    [[I_INC]] = add i32 [[I]], 1<br>
 ; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[I_INC]], [[END]]<br>
 ; CHECK-NEXT:    br i1 [[CMP]], label [[HEADER]], label [[EXIT:%.*]]<br>
 ; CHECK:       exit:<br>
-; CHECK-NEXT:    [[I_INC_LCSSA:%.*]] = phi i32 [ [[I_INC]], [[BACKEDGE]] ]<br>
+; CHECK-NEXT:    [[I_INC_LCSSA:%.*]] = phi i32 [ [[I_INC]], [[EXIT_A]] ]<br>
 ; CHECK-NEXT:    ret i32 [[I_INC_LCSSA]]<br>
 ;<br>
 preheader:<br>
@@ -898,18 +836,12 @@ define i32 @partial_sub_loop_test_branch<br>
 ; CHECK-NEXT:    [[J:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[J_INC:%.*]], [[OUTER_BACKEDGE:%.*]] ]<br>
 ; CHECK-NEXT:    br label [[HEADER:%.*]]<br>
 ; CHECK:       header:<br>
-; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[OUTER_HEADER]] ], [ [[I_INC:%.*]], [[BACKEDGE:%.*]] ]<br>
-; CHECK-NEXT:    br i1 true, label [[BACKEDGE]], label [[DEAD:%.*]]<br>
-; CHECK:       dead:<br>
-; CHECK-NEXT:    [[I_2:%.*]] = add i32 [[I]], 1<br>
-; CHECK-NEXT:    br label [[BACKEDGE]]<br>
-; CHECK:       backedge:<br>
-; CHECK-NEXT:    [[I_1:%.*]] = phi i32 [ [[I]], [[HEADER]] ], [ [[I_2]], [[DEAD]] ]<br>
-; CHECK-NEXT:    [[I_INC]] = add i32 [[I_1]], 1<br>
+; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[OUTER_HEADER]] ], [ [[I_INC:%.*]], [[HEADER]] ]<br>
+; CHECK-NEXT:    [[I_INC]] = add i32 [[I]], 1<br>
 ; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[I_INC]], [[END:%.*]]<br>
 ; CHECK-NEXT:    br i1 [[CMP]], label [[HEADER]], label [[OUTER_BACKEDGE]]<br>
 ; CHECK:       outer_backedge:<br>
-; CHECK-NEXT:    [[I_INC_LCSSA:%.*]] = phi i32 [ [[I_INC]], [[BACKEDGE]] ]<br>
+; CHECK-NEXT:    [[I_INC_LCSSA:%.*]] = phi i32 [ [[I_INC]], [[HEADER]] ]<br>
 ; CHECK-NEXT:    [[J_INC]] = add i32 [[J]], 1<br>
 ; CHECK-NEXT:    [[CMP_J:%.*]] = icmp slt i32 [[J_INC]], [[END]]<br>
 ; CHECK-NEXT:    br i1 [[CMP_J]], label [[OUTER_HEADER]], label [[EXIT:%.*]]<br>
@@ -958,22 +890,12 @@ define i32 @partial_sub_loop_test_switch<br>
 ; CHECK-NEXT:    [[J:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[J_INC:%.*]], [[OUTER_BACKEDGE:%.*]] ]<br>
 ; CHECK-NEXT:    br label [[HEADER:%.*]]<br>
 ; CHECK:       header:<br>
-; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[OUTER_HEADER]] ], [ [[I_INC:%.*]], [[BACKEDGE:%.*]] ]<br>
-; CHECK-NEXT:    switch i32 1, label [[DEAD:%.*]] [<br>
-; CHECK-NEXT:    i32 0, label [[DEAD]]<br>
-; CHECK-NEXT:    i32 1, label [[BACKEDGE]]<br>
-; CHECK-NEXT:    i32 2, label [[DEAD]]<br>
-; CHECK-NEXT:    ]<br>
-; CHECK:       dead:<br>
-; CHECK-NEXT:    [[I_2:%.*]] = add i32 [[I]], 1<br>
-; CHECK-NEXT:    br label [[BACKEDGE]]<br>
-; CHECK:       backedge:<br>
-; CHECK-NEXT:    [[I_1:%.*]] = phi i32 [ [[I]], [[HEADER]] ], [ [[I_2]], [[DEAD]] ]<br>
-; CHECK-NEXT:    [[I_INC]] = add i32 [[I_1]], 1<br>
+; CHECK-NEXT:    [[I:%.*]] = phi i32 [ 0, [[OUTER_HEADER]] ], [ [[I_INC:%.*]], [[HEADER]] ]<br>
+; CHECK-NEXT:    [[I_INC]] = add i32 [[I]], 1<br>
 ; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[I_INC]], [[END:%.*]]<br>
 ; CHECK-NEXT:    br i1 [[CMP]], label [[HEADER]], label [[OUTER_BACKEDGE]]<br>
 ; CHECK:       outer_backedge:<br>
-; CHECK-NEXT:    [[I_INC_LCSSA:%.*]] = phi i32 [ [[I_INC]], [[BACKEDGE]] ]<br>
+; CHECK-NEXT:    [[I_INC_LCSSA:%.*]] = phi i32 [ [[I_INC]], [[HEADER]] ]<br>
 ; CHECK-NEXT:    [[J_INC]] = add i32 [[J]], 1<br>
 ; CHECK-NEXT:    [[CMP_J:%.*]] = icmp slt i32 [[J_INC]], [[END]]<br>
 ; CHECK-NEXT:    br i1 [[CMP_J]], label [[OUTER_HEADER]], label [[EXIT:%.*]]<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><o:p></o:p></p>
</blockquote>
</div>
<p class="MsoNormal"><br clear="all">
<o:p></o:p></p>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<p class="MsoNormal">-- <o:p></o:p></p>
<div>
<div>
<div>
<div>
<div>
<p class="MsoNormal">Regards,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">Ilya Biryukov<o:p></o:p></p>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>