[llvm] r324572 - [SimplifyCFG] Re-apply Relax restriction for folding unconditional branches

Serguei Katkov via llvm-commits llvm-commits at lists.llvm.org
Tue Feb 13 09:08:14 PST 2018


Hello David,

the main idea was removing empty BB in a loop coming to header (latch) but not a removing of pre-header actually.

However it is not clear why removing an empty pre-header comes to regressions. Jut interesting to know about the reason.

Thank you,
Serguei.

> -----Original Message-----
> From: David Green [mailto:David.Green at arm.com]
> Sent: Tuesday, February 13, 2018 11:40 PM
> To: Serguei Katkov <serguei.katkov at azul.com>; llvm-commits <llvm-
> commits at lists.llvm.org>
> Cc: nd <nd at arm.com>
> Subject: Re: [llvm] r324572 - [SimplifyCFG] Re-apply Relax restriction for
> folding unconditional branches
> 
> Hello
> 
> First up, sorry for the lateness of this response.
> 
> Secondly, I am seeing a fair number of small to medium size performance
> regressions from this patch, without many improvements (on ARM). Is the
> idea that this should be removing preheaders? Or just empty blocks in loops?
> 
> The only regressions I have analysed so far have turned into "code is in a
> different order, the backend does something slightly different as a result".
> And many regressions only appear to show up when LTO is enabled.
> 
> So I don't have any sensible reproducers yet, but any thoughts about it
> removing preheaders? It doesn't seem like that was the intent.
> Dave
> 
> 
> 
> From: llvm-commits <llvm-commits-bounces at lists.llvm.org> on behalf of
> Serguei Katkov via llvm-commits <llvm-commits at lists.llvm.org>
> Sent: 08 February 2018 07:16
> To: llvm-commits at lists.llvm.org
> Subject: [llvm] r324572 - [SimplifyCFG] Re-apply Relax restriction for folding
> unconditional branches
> 
> Author: skatkov
> Date: Wed Feb  7 23:16:29 2018
> New Revision: 324572
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=324572&view=rev
> Log:
> [SimplifyCFG] Re-apply Relax restriction for folding unconditional branches
> 
> The commit rL308422 introduces a restriction for folding unconditional
> branches. Specifically if empty block with unconditional branch leads to
> header of the loop then elimination of this basic block is prohibited.
> However it seems this condition is redundantly strict.
> If elimination of this basic block does not introduce more back edges then we
> can eliminate this block.
> 
> The patch implements this relax of restriction.
> 
> The test profile/Linux/counter_promo_nest.c in compiler-rt project is
> updated to meet this change.
> 
> Reviewers: efriedma, mcrosier, pacxx, hsung, davidxl Reviewed By: pacxx
> Subscribers: llvm-commits
> Differential Revision: https://reviews.llvm.org/D42691
> 
> Added:
>     llvm/trunk/test/Transforms/SimplifyCFG/UncondBranchToHeader.ll
> Modified:
>     llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp
>     llvm/trunk/test/Transforms/LoopUnroll/peel-loop.ll
>     llvm/trunk/test/Transforms/LoopUnswitch/2015-06-17-Metadata.ll
>     llvm/trunk/test/Transforms/LoopUnswitch/infinite-loop.ll
> 
> Modified: llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp?rev=324572&r1=32
> 4571&r2=324572&view=diff
> ==========================================================
> ====================
> --- llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp (original)
> +++ llvm/trunk/lib/Transforms/Utils/SimplifyCFG.cpp Wed Feb  7 23:16:29
> +++ 2018
> @@ -5733,9 +5733,12 @@ bool SimplifyCFGOpt::SimplifyUncondBranc
>    // header. (This is for early invocations before loop simplify and
>    // vectorization to keep canonical loop forms for nested loops. These blocks
>    // can be eliminated when the pass is invoked later in the back-end.)
> +  // Note that if BB has only one predecessor then we do not introduce
> + new  // backedge, so we can eliminate BB.
>    bool NeedCanonicalLoop =
>        Options.NeedCanonicalLoop &&
> -      (LoopHeaders && (LoopHeaders->count(BB) || LoopHeaders-
> >count(Succ)));
> +      (LoopHeaders && std::distance(pred_begin(BB), pred_end(BB)) > 1 &&
> +       (LoopHeaders->count(BB) || LoopHeaders->count(Succ)));
>    BasicBlock::iterator I = BB->getFirstNonPHIOrDbg()->getIterator();
>    if (I->isTerminator() && BB != &BB->getParent()->getEntryBlock() &&
>        !NeedCanonicalLoop &&
> TryToSimplifyUncondBranchFromEmptyBlock(BB))
> 
> Modified: llvm/trunk/test/Transforms/LoopUnroll/peel-loop.ll
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/test/Transforms/LoopUnroll/peel-
> loop.ll?rev=324572&r1=324571&r2=324572&view=diff
> ==========================================================
> ====================
> --- llvm/trunk/test/Transforms/LoopUnroll/peel-loop.ll (original)
> +++ llvm/trunk/test/Transforms/LoopUnroll/peel-loop.ll Wed Feb  7
> +++ 23:16:29 2018
> @@ -19,10 +19,8 @@
>  ; CHECK: store i32 2, i32* %[[INC2]], align 4  ; CHECK: %[[CMP3:.*]] = icmp eq
> i32 %k, 3  ; CHECK: br i1 %[[CMP3]], label %for.end, label %[[LOOP_PH:.*]] -;
> CHECK: [[LOOP_PH]]:
> -; CHECK: br label %[[LOOP:.*]]
> -; CHECK: [[LOOP]]:
> -; CHECK: %[[IV:.*]] = phi i32 [ 3, %[[LOOP_PH]] ], [ {{.*}}, %[[LOOP]] ]
> +; CHECK: for.end:
> +; CHECK: ret void
> 
>  define void @basic(i32* %p, i32 %k) #0 {
>  entry:
> @@ -68,11 +66,8 @@ for.end:
>  ; CHECK: store i32 2, i32* %[[INC2]], align 4  ; CHECK: %[[CMP3:.*]] = icmp eq
> i32 %k, 3  ; CHECK: br i1 %[[CMP3]], label %for.end, label %[[LOOP_PH:.*]] -;
> CHECK: [[LOOP_PH]]:
> -; CHECK: br label %[[LOOP:.*]]
> -; CHECK: [[LOOP]]:
> -; CHECK: %[[IV:.*]] = phi i32 [ 3, %[[LOOP_PH]] ], [ %[[IV:.*]], %[[LOOP]] ] -;
> CHECK: %ret = phi i32 [ 0, %entry ], [ 1, %[[NEXT0]] ], [ 2, %[[NEXT1]] ], [ 3,
> %[[NEXT2]] ], [ %[[IV]], %[[LOOP]] ]
> +; CHECK: for.end:
> +; CHECK: %ret = phi i32 [ 0, %entry ], [ 1, %[[NEXT0]] ], [ 2,
> +%[[NEXT1]] ], [ 3, %[[NEXT2]] ], [ %inc, %for.body ]
>  ; CHECK: ret i32 %ret
>  define i32 @output(i32* %p, i32 %k) #0 {
>  entry:
> 
> Modified: llvm/trunk/test/Transforms/LoopUnswitch/2015-06-17-
> Metadata.ll
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/test/Transforms/LoopUnswitch/2015-06-17-
> Metadata.ll?rev=324572&r1=324571&r2=324572&view=diff
> ==========================================================
> ====================
> --- llvm/trunk/test/Transforms/LoopUnswitch/2015-06-17-Metadata.ll
> (original)
> +++ llvm/trunk/test/Transforms/LoopUnswitch/2015-06-17-Metadata.ll Wed
> +++ Feb  7 23:16:29 2018
> @@ -16,7 +16,7 @@ for.body:
>    %cmp1 = icmp eq i32 %a, 12345
>    br i1 %cmp1, label %if.then, label %if.else, !prof !0  ; CHECK: %cmp1 = icmp
> eq i32 %a, 12345 -; CHECK-NEXT: br i1 %cmp1, label
> %for.body.preheader.split.us, label %for.body.preheader.split, !prof !0
> +; CHECK-NEXT: br i1 %cmp1, label %for.body.us, label %for.body, !prof
> +!0
>  if.then:                                          ; preds = %for.body
>  ; CHECK: for.body.us:
>  ; CHECK: add nsw i32 %{{.*}}, 123
> @@ -53,7 +53,7 @@ entry:
>    br label %for.body
>  ;CHECK: entry:
>  ;CHECK-NEXT: %cmp1 = icmp eq i32 1, 2
> -;CHECK-NEXT: br i1 %cmp1, label %entry.split, label %for.cond.cleanup.split,
> !prof !1
> +;CHECK-NEXT: br i1 %cmp1, label %for.body, label
> +%for.cond.cleanup.split, !prof !1
>  ;CHECK: for.body:
>  for.body:                                         ; preds = %for.inc, %entry
>    %inc.i = phi i32 [ 0, %entry ], [ %inc, %if.then ]
> 
> Modified: llvm/trunk/test/Transforms/LoopUnswitch/infinite-loop.ll
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/test/Transforms/LoopUnswitch/infinite-
> loop.ll?rev=324572&r1=324571&r2=324572&view=diff
> ==========================================================
> ====================
> --- llvm/trunk/test/Transforms/LoopUnswitch/infinite-loop.ll (original)
> +++ llvm/trunk/test/Transforms/LoopUnswitch/infinite-loop.ll Wed Feb  7
> +++ 23:16:29 2018
> @@ -16,7 +16,7 @@
>  ; CHECK-NEXT: br i1 %a, label %entry.split, label %abort0.split
> 
>  ; CHECK: entry.split:
> -; CHECK-NEXT: br i1 %b, label %entry.split.split, label %abort1.split
> +; CHECK-NEXT: br i1 %b, label %for.body, label %abort1.split
> 
>  ; CHECK: for.body:
>  ; CHECK-NEXT: br label %for.body
> 
> Added: llvm/trunk/test/Transforms/SimplifyCFG/UncondBranchToHeader.ll
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/test/Transforms/SimplifyCFG/UncondBranchToHeader.ll
> ?rev=324572&view=auto
> ==========================================================
> ====================
> --- llvm/trunk/test/Transforms/SimplifyCFG/UncondBranchToHeader.ll
> (added)
> +++ llvm/trunk/test/Transforms/SimplifyCFG/UncondBranchToHeader.ll
> Wed
> +++ Feb  7 23:16:29 2018
> @@ -0,0 +1,18 @@
> +; RUN: opt < %s -simplifycfg -S | FileCheck %s
> +
> +; Check that we can get rid of empty block leading to header ; if it
> +does not introduce new edge.
> +define i32 @test(i32 %c) {
> +entry:
> +  br label %header
> +header:
> +  %i = phi i32 [0, %entry], [%i.1, %backedge]
> +  %i.1 = add i32 %i, 1
> +  %cmp = icmp slt i32 %i.1, %c
> +  br i1 %cmp, label %backedge, label %exit ; CHECK-NOT: backedge:
> +backedge:
> +  br label %header
> +exit:
> +  ret i32 %i
> +}
> 
> 
> _______________________________________________
> 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