[llvm] r321653 - [BasicBlockUtils] Check for unreachable preds before updating LI in UpdateAnalysisInformation

Volkan Keles via llvm-commits llvm-commits at lists.llvm.org
Tue Jan 2 15:45:40 PST 2018


+llvm-commits

> On Jan 2, 2018, at 8:25 AM, Anna Thomas via llvm-commits <llvm-commits at lists.llvm.org> wrote:
> 
> Author: annat
> Date: Tue Jan  2 08:25:50 2018
> New Revision: 321653
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=321653&view=rev
> Log:
> [BasicBlockUtils] Check for unreachable preds before updating LI in UpdateAnalysisInformation
> 
> Summary:
> We are incorrectly updating the LI when loop-simplify generates
> dedicated exit blocks for a loop. The issue is that there's an implicit
> assumption that the Preds passed into UpdateAnalysisInformation are
> reachable. However, this is not true and breaks LI by incorrectly
> updating the header of a loop.
> 
> One such case is when we generate dedicated exits when the exit block is
> a landing pad (through SplitLandingPadPredecessors). There maybe other
> cases as well, since we do not guarantee that Preds passed in are
> reachable basic blocks.
> 
> The added test case shows how loop-simplify breaks LI for the outer loop (and DT in turn)
> after we try to generate the LoopSimplifyForm.
> 
> Reviewers: davide, chandlerc, sanjoy
> 
> Reviewed By: davide
> 
> Subscribers: llvm-commits
> 
> Differential Revision: https://reviews.llvm.org/D41519
> 
> Modified:
>    llvm/trunk/lib/Transforms/Utils/BasicBlockUtils.cpp
>    llvm/trunk/test/Transforms/LoopSimplify/unreachable-loop-pred.ll
> 
> Modified: llvm/trunk/lib/Transforms/Utils/BasicBlockUtils.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/BasicBlockUtils.cpp?rev=321653&r1=321652&r2=321653&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Utils/BasicBlockUtils.cpp (original)
> +++ llvm/trunk/lib/Transforms/Utils/BasicBlockUtils.cpp Tue Jan  2 08:25:50 2018
> @@ -323,6 +323,12 @@ static void UpdateAnalysisInformation(Ba
>   bool IsLoopEntry = !!L;
>   bool SplitMakesNewLoopHeader = false;
>   for (BasicBlock *Pred : Preds) {
> +    // Preds that are not reachable from entry should not be used to identify if
> +    // OldBB is a loop entry or if SplitMakesNewLoopHeader. Unreachable blocks
> +    // are not within any loops, so we incorrectly mark SplitMakesNewLoopHeader
> +    // as true and make the NewBB the header of some loop. This breaks LI.
> +    if (!DT->isReachableFromEntry(Pred))

Hi Anna,

This change breaks our internal bots because DT might be nullptr as it is optional. Is there another way to check this?  

Volkan

> +      continue;
>     // If we need to preserve LCSSA, determine if any of the preds is a loop
>     // exit.
>     if (PreserveLCSSA)
> 
> Modified: llvm/trunk/test/Transforms/LoopSimplify/unreachable-loop-pred.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LoopSimplify/unreachable-loop-pred.ll?rev=321653&r1=321652&r2=321653&view=diff
> ==============================================================================
> --- llvm/trunk/test/Transforms/LoopSimplify/unreachable-loop-pred.ll (original)
> +++ llvm/trunk/test/Transforms/LoopSimplify/unreachable-loop-pred.ll Tue Jan  2 08:25:50 2018
> @@ -18,3 +18,52 @@ while.body115:
> foo:
>   br label %while.body115
> }
> +
> +; When loopsimplify generates dedicated exit block for blocks that are landing
> +; pads (i.e. innerLoopExit in this test), we should not get confused with the
> +; unreachable pred (unreachableB) to innerLoopExit.
> +define align 8 void @baz(i32 %trip) personality i32* ()* @wobble {
> +entry:
> +  br label %outerHeader
> +
> +outerHeader:
> +  invoke void @foo() 
> +          to label %innerPreheader unwind label %innerLoopExit
> +
> +innerPreheader:
> +  br label %innerH
> +
> +innerH:
> +  %tmp50 = invoke i8 * undef()
> +          to label %innerLatch unwind label %innerLoopExit
> +
> +innerLatch:
> +  %cmp = icmp slt i32 %trip, 42
> +  br i1 %cmp, label %innerH, label %retblock
> +
> +unreachableB:                                             ; No predecessors!
> +  %tmp62 = invoke i8 * undef()
> +          to label %retblock unwind label %innerLoopExit
> +
> +; undedicated exit block (preds from inner and outer loop)
> +; Also has unreachableB as pred.
> +innerLoopExit:
> +  %tmp65 = landingpad { i8*, i32 }
> +          cleanup
> +  invoke void @foo() 
> +          to label %outerHeader unwind label %unwindblock
> +
> +unwindblock:
> +  %tmp67 = landingpad { i8*, i32 }
> +          cleanup
> +  ret void
> +
> +retblock:
> +  ret void
> +}
> +
> +; Function Attrs: nounwind
> +declare i32* @wobble()
> +
> +; Function Attrs: uwtable
> +declare void @foo()
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits



More information about the llvm-commits mailing list