<div dir="ltr">Gah. This looks very much like there are underlying bugs in the loop pass manager. We could probably end up hitting them at any time in the future. <div><br></div><div>Sadly, this was just a drive-by cleanup while I had the code in my head. Thanks for reverting, I'll probably leave it reverted until I or someone else has time to really figure out why we aren't preserving loop canonical form.</div><div><br></div><div>-Chandler<br><br><div class="gmail_quote"><div dir="ltr">On Thu, Aug 13, 2015 at 4:12 AM Renato Golin via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi Chandler,<br>
<br>
I got this failure on my prototype bot:<br>
<br>
<a href="http://buildmaster.tcwglab.linaro.org/builders/clang-cmake-aarch64-prototype/builds/87" rel="noreferrer" target="_blank">http://buildmaster.tcwglab.linaro.org/builders/clang-cmake-aarch64-prototype/builds/87</a><br>
<br>
clang-3.8: /home/rengolin/devel/buildslave/clang-cmake-aarch64-prototype/llvm/lib/Transforms/Scalar/LoopIdiomRecognize.cpp:836:<br>
bool {anonymous}::LoopIdiomRecognize::recognizePopcount(): Assertion<br>
`CurLoop->isLoopSimplifyForm() && "Loop passes require simplified<br>
form!"' failed.<br>
0  clang-3.8 0x00000000013613c4<br>
llvm::sys::PrintStackTrace(llvm::raw_ostream&) + 80<br>
Stack dump:<br>
0.      Program arguments:<br>
/home/rengolin/devel/buildslave/clang-cmake-aarch64-prototype/stage1.install/bin/clang-3.8<br>
-cc1 -triple aarch64-unknown-linux-gnu -emit-obj -disable-free<br>
-main-file-name 2004-03-15-IndirectGoto.c -mrelocation-model static<br>
-mthread-model posix -fmath-errno -masm-verbose -mconstructor-aliases<br>
-fuse-init-array -target-cpu cortex-a57 -target-feature +neon<br>
-target-feature +crc -target-feature +crypto -target-abi aapcs<br>
-dwarf-column-info -coverage-file<br>
/home/rengolin/devel/buildslave/clang-cmake-aarch64-prototype/test/sandbox/build/SingleSource/Regression/C/Output/2004-03-15-IndirectGoto.llvm.o<br>
-resource-dir /home/rengolin/devel/buildslave/clang-cmake-aarch64-prototype/stage1.install/bin/../lib/clang/3.8.0<br>
-I /home/rengolin/devel/buildslave/clang-cmake-aarch64-prototype/test/sandbox/build/SingleSource/Regression/C<br>
-I /home/rengolin/devel/buildslave/clang-cmake-aarch64-prototype/test/test-suite/SingleSource/Regression/C<br>
-I /home/rengolin/devel/buildslave/clang-cmake-aarch64-prototype/test/test-suite/include<br>
-I ../../../include -D _GNU_SOURCE -D __STDC_LIMIT_MACROS -D NDEBUG<br>
-internal-isystem /usr/local/include -internal-isystem<br>
/home/rengolin/devel/buildslave/clang-cmake-aarch64-prototype/stage1.install/bin/../lib/clang/3.8.0/include<br>
-internal-externc-isystem /usr/include/aarch64-linux-gnu<br>
-internal-externc-isystem /include -internal-externc-isystem<br>
/usr/include -O3 -fdebug-compilation-dir<br>
/home/rengolin/devel/buildslave/clang-cmake-aarch64-prototype/test/sandbox/build/SingleSource/Regression/C<br>
-ferror-limit 19 -fmessage-length 0 -mstackrealign<br>
-fallow-half-arguments-and-returns -fno-signed-char -fobjc-runtime=gcc<br>
-fdiagnostics-show-option -vectorize-loops -vectorize-slp -o<br>
Output/2004-03-15-IndirectGoto.llvm.o -x c<br>
/home/rengolin/devel/buildslave/clang-cmake-aarch64-prototype/test/test-suite/SingleSource/Regression/C/2004-03-15-IndirectGoto.c<br>
1.      <eof> parser at end of file<br>
2.      Per-module optimization passes<br>
3.      Running pass 'CallGraph Pass Manager' on module<br>
'/home/rengolin/devel/buildslave/clang-cmake-aarch64-prototype/test/test-suite/SingleSource/Regression/C/2004-03-15-IndirectGoto.c'.<br>
4.      Running pass 'Loop Pass Manager' on function '@main'<br>
5.      Running pass 'Recognize loop idioms' on basic block '%L3'<br>
clang-3.8: error: unable to execute command: Aborted<br>
clang-3.8: error: clang frontend command failed due to signal (use -v<br>
to see invocation)<br>
<br>
244880 still has the same problem...<br>
<br>
cheers,<br>
--renato<br>
<br>
On 13 August 2015 at 10:56, Chandler Carruth via llvm-commits<br>
<<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>> wrote:<br>
> Author: chandlerc<br>
> Date: Thu Aug 13 04:56:20 2015<br>
> New Revision: 244879<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=244879&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=244879&view=rev</a><br>
> Log:<br>
> [LIR] Start leveraging the fundamental guarantees of a loop in<br>
> simplified form to remove redundant checks and simplify the code for<br>
> popcount recognition. We don't actually need to handle all of these<br>
> cases.<br>
><br>
> I've left a FIXME for one in particular until I finish inspecting to<br>
> make sure we don't actually *rely* on the predicate in any way.<br>
><br>
> Modified:<br>
>     llvm/trunk/lib/Transforms/Scalar/LoopIdiomRecognize.cpp<br>
><br>
> Modified: llvm/trunk/lib/Transforms/Scalar/LoopIdiomRecognize.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopIdiomRecognize.cpp?rev=244879&r1=244878&r2=244879&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopIdiomRecognize.cpp?rev=244879&r1=244878&r2=244879&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/lib/Transforms/Scalar/LoopIdiomRecognize.cpp (original)<br>
> +++ llvm/trunk/lib/Transforms/Scalar/LoopIdiomRecognize.cpp Thu Aug 13 04:56:20 2015<br>
> @@ -830,29 +830,32 @@ bool LoopIdiomRecognize::recognizePopcou<br>
>    // non-compact loop. Therefore, recognizing popcount idiom only makes sense<br>
>    // in a compact loop.<br>
><br>
> -  // Give up if the loop has multiple blocks or multiple backedges.<br>
> -  if (CurLoop->getNumBackEdges() != 1 || CurLoop->getNumBlocks() != 1)<br>
> +  assert(CurLoop->isLoopSimplifyForm() &&<br>
> +         "Loop passes require simplified form!");<br>
> +<br>
> +  // Give up if the loop has multiple blocks.<br>
> +  if (CurLoop->getNumBlocks() != 1)<br>
>      return false;<br>
><br>
> -  BasicBlock *LoopBody = *(CurLoop->block_begin());<br>
> -  if (LoopBody->size() >= 20) {<br>
> -    // The loop is too big, bail out.<br>
> +  // If the loop is too big, bail out.<br>
> +  BasicBlock &LoopBB = *CurLoop->getHeader();<br>
> +  if (LoopBB.size() >= 20)<br>
>      return false;<br>
> -  }<br>
><br>
>    // It should have a preheader containing nothing but an unconditional branch.<br>
> -  BasicBlock *PH = CurLoop->getLoopPreheader();<br>
> -  if (!PH)<br>
> -    return false;<br>
> -  if (&PH->front() != PH->getTerminator())<br>
> +  BasicBlock &PH = *CurLoop->getLoopPreheader();<br>
> +  if (&PH.front() != PH.getTerminator())<br>
>      return false;<br>
> -  auto *EntryBI = dyn_cast<BranchInst>(PH->getTerminator());<br>
> +  // FIXME: Technically, it shouldn't matter what instruction we use as<br>
> +  // a terminator, the only property needed is the definition of a preheader:<br>
> +  // a single loop predecessor whose only successor is the loop header.<br>
> +  auto *EntryBI = dyn_cast<BranchInst>(PH.getTerminator());<br>
>    if (!EntryBI || EntryBI->isConditional())<br>
>      return false;<br>
><br>
>    // It should have a precondition block where the generated popcount instrinsic<br>
>    // function can be inserted.<br>
> -  auto *PreCondBB = PH->getSinglePredecessor();<br>
> +  auto *PreCondBB = PH.getSinglePredecessor();<br>
>    if (!PreCondBB)<br>
>      return false;<br>
>    auto *PreCondBI = dyn_cast<BranchInst>(PreCondBB->getTerminator());<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" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><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" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div></div></div>