[llvm-commits] [llvm] r84803 - in /llvm/trunk: lib/CodeGen/BranchFolding.cpp test/CodeGen/CellSPU/2009-01-01-BrCond.ll test/CodeGen/Generic/switch-lower-feature-2.ll test/CodeGen/X86/loop-blocks.ll

Dan Gohman gohman at apple.com
Wed Oct 21 17:03:58 PDT 2009


Author: djg
Date: Wed Oct 21 19:03:58 2009
New Revision: 84803

URL: http://llvm.org/viewvc/llvm-project?rev=84803&view=rev
Log:
Revert the main portion of r31856. It was causing BranchFolding
to break up CFG diamonds by banishing one of the blocks to the end of
the function, which is bad for code density and branch size.

This does pessimize MultiSource/Benchmarks/Ptrdist/yacr2, the
benchmark cited as the reason for the change, however I've examined
the code and it looks more like a case of gaming a particular
branch than of being generally applicable.

Modified:
    llvm/trunk/lib/CodeGen/BranchFolding.cpp
    llvm/trunk/test/CodeGen/CellSPU/2009-01-01-BrCond.ll
    llvm/trunk/test/CodeGen/Generic/switch-lower-feature-2.ll
    llvm/trunk/test/CodeGen/X86/loop-blocks.ll

Modified: llvm/trunk/lib/CodeGen/BranchFolding.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/BranchFolding.cpp?rev=84803&r1=84802&r2=84803&view=diff

==============================================================================
--- llvm/trunk/lib/CodeGen/BranchFolding.cpp (original)
+++ llvm/trunk/lib/CodeGen/BranchFolding.cpp Wed Oct 21 19:03:58 2009
@@ -945,15 +945,15 @@
       }
     }
     
-    // If this block doesn't fall through (e.g. it ends with an uncond branch or
-    // has no successors) and if the pred falls through into this block, and if
-    // it would otherwise fall through into the block after this, move this
-    // block to the end of the function.
+    // If this block has no successors (e.g. it is a return block or ends with
+    // a call to a no-return function like abort or __cxa_throw) and if the pred
+    // falls through into this block, and if it would otherwise fall through
+    // into the block after this, move this block to the end of the function.
     //
     // We consider it more likely that execution will stay in the function (e.g.
     // due to loops) than it is to exit it.  This asserts in loops etc, moving
     // the assert condition out of the loop body.
-    if (!PriorCond.empty() && PriorFBB == 0 &&
+    if (MBB->succ_empty() && !PriorCond.empty() && PriorFBB == 0 &&
         MachineFunction::iterator(PriorTBB) == FallThrough &&
         !CanFallThrough(MBB)) {
       bool DoTransform = true;

Modified: llvm/trunk/test/CodeGen/CellSPU/2009-01-01-BrCond.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/CellSPU/2009-01-01-BrCond.ll?rev=84803&r1=84802&r2=84803&view=diff

==============================================================================
--- llvm/trunk/test/CodeGen/CellSPU/2009-01-01-BrCond.ll (original)
+++ llvm/trunk/test/CodeGen/CellSPU/2009-01-01-BrCond.ll Wed Oct 21 19:03:58 2009
@@ -1,4 +1,4 @@
-; RUN: llc < %s -march=cellspu -o - | grep brz
+; RUN: llc < %s -march=cellspu -o - | grep brnz
 ; PR3274
 
 target datalayout = "E-p:32:32:128-i1:8:128-i8:8:128-i16:16:128-i32:32:128-i64:32:128-f32:32:128-f64:64:128-v64:64:64-v128:128:128-a0:0:128-s0:128:128"

Modified: llvm/trunk/test/CodeGen/Generic/switch-lower-feature-2.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Generic/switch-lower-feature-2.ll?rev=84803&r1=84802&r2=84803&view=diff

==============================================================================
--- llvm/trunk/test/CodeGen/Generic/switch-lower-feature-2.ll (original)
+++ llvm/trunk/test/CodeGen/Generic/switch-lower-feature-2.ll Wed Oct 21 19:03:58 2009
@@ -5,9 +5,9 @@
 ; RUN: grep 1023 %t | count 1
 ; RUN: grep 119  %t | count 1
 ; RUN: grep JTI %t | count 2
-; RUN: grep jg %t | count 1
+; RUN: grep jg %t | count 3
 ; RUN: grep ja %t | count 1
-; RUN: grep js %t | count 1
+; RUN: grep jns %t | count 1
 
 target triple = "i686-pc-linux-gnu"
 

Modified: llvm/trunk/test/CodeGen/X86/loop-blocks.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/loop-blocks.ll?rev=84803&r1=84802&r2=84803&view=diff

==============================================================================
--- llvm/trunk/test/CodeGen/X86/loop-blocks.ll (original)
+++ llvm/trunk/test/CodeGen/X86/loop-blocks.ll Wed Oct 21 19:03:58 2009
@@ -74,16 +74,16 @@
 ; CHECK: yet_more_involved:
 ;      CHECK:   jmp .LBB3_1
 ; CHECK-NEXT:   align
-; CHECK-NEXT: .LBB3_7:
-; CHECK-NEXT:   call block_a_true_func
-; CHECK-NEXT:   jmp .LBB3_4
-; CHECK-NEXT: .LBB3_2:
+; CHECK-NEXT: .LBB3_3:
 ; CHECK-NEXT:   call bar99
 ; CHECK-NEXT:   call get
 ; CHECK-NEXT:   cmpl $2999, %eax
-; CHECK-NEXT:   jle .LBB3_7
+; CHECK-NEXT:   jg .LBB3_5
+; CHECK-NEXT:   call block_a_true_func
+; CHECK-NEXT:   jmp .LBB3_6
+; CHECK-NEXT: .LBB3_5:
 ; CHECK-NEXT:   call block_a_false_func
-; CHECK-NEXT: .LBB3_4:
+; CHECK-NEXT: .LBB3_6:
 ; CHECK-NEXT:   call block_a_merge_func
 ; CHECK-NEXT: .LBB3_1:
 ; CHECK-NEXT:   call body





More information about the llvm-commits mailing list