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

David Green via llvm-commits llvm-commits at lists.llvm.org
Tue Feb 13 08:39:49 PST 2018


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=324571&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