Do trivial CSE of dead BBs during codegen preparation.
authorBill Wendling <isanbard@gmail.com>
Sun, 4 Mar 2012 10:46:01 +0000 (10:46 +0000)
committerBill Wendling <isanbard@gmail.com>
Sun, 4 Mar 2012 10:46:01 +0000 (10:46 +0000)
Some BBs can become dead after codegen preparation. If we delete them here, it
could help enable tail-call optimizations later on.
<rdar://problem/10256573>

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@152002 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/CodeGenPrepare.cpp
test/CodeGen/ARM/2011-03-15-LdStMultipleBug.ll
test/CodeGen/ARM/cse-libcalls.ll
test/CodeGen/X86/2011-11-09-FoldImpDefs.ll
test/CodeGen/X86/unreachable-stack-protector.ll

index 5ca5e47cd05caf49bb90f1de70b8a380174b6865..aad3a924f14a4d969100e8958b4eb7bda7edaed2 100644 (file)
@@ -65,6 +65,11 @@ static cl::opt<bool> DisableBranchOpts(
   "disable-cgp-branch-opts", cl::Hidden, cl::init(false),
   cl::desc("Disable branch optimizations in CodeGenPrepare"));
 
+// FIXME: Remove this abomination once all of the tests pass without it!
+static cl::opt<bool> DisableDeleteDeadBlocks(
+  "disable-cgp-delete-dead-blocks", cl::Hidden, cl::init(false),
+  cl::desc("Disable deleting dead blocks in CodeGenPrepare"));
+
 namespace {
   class CodeGenPrepare : public FunctionPass {
     /// TLI - Keep a pointer of a TargetLowering to consult for determining
@@ -160,8 +165,22 @@ bool CodeGenPrepare::runOnFunction(Function &F) {
 
   if (!DisableBranchOpts) {
     MadeChange = false;
-    for (Function::iterator BB = F.begin(), E = F.end(); BB != E; ++BB)
+    SmallPtrSet<BasicBlock*, 8> WorkList;
+    for (Function::iterator BB = F.begin(), E = F.end(); BB != E; ++BB) {
+      SmallVector<BasicBlock*, 2> Successors(succ_begin(BB), succ_end(BB));
       MadeChange |= ConstantFoldTerminator(BB, true);
+      if (!MadeChange) continue;
+
+      for (SmallVectorImpl<BasicBlock*>::iterator
+             II = Successors.begin(), IE = Successors.end(); II != IE; ++II)
+        if (pred_begin(*II) == pred_end(*II))
+          WorkList.insert(*II);
+    }
+
+    if (!DisableDeleteDeadBlocks)
+      for (SmallPtrSet<BasicBlock*, 8>::iterator
+             I = WorkList.begin(), E = WorkList.end(); I != E; ++I)
+        DeleteDeadBlock(*I);
 
     if (MadeChange)
       ModifiedDT = true;
index ccda281e901eac2015639ce1e9df4636a054725b..2faa04af8bacaf08938ae389bc548eb56291a131 100644 (file)
@@ -1,4 +1,4 @@
-; RUN: llc < %s -mtriple=thumbv7-apple-darwin10 -relocation-model=pic -disable-fp-elim -mcpu=cortex-a8 | FileCheck %s
+; RUN: llc < %s -mtriple=thumbv7-apple-darwin10 -relocation-model=pic -disable-fp-elim -disable-cgp-delete-dead-blocks -mcpu=cortex-a8 | FileCheck %s
 
 ; Do not form Thumb2 ldrd / strd if the offset is not multiple of 4.
 ; rdar://9133587
index 0dcf9ddc0bb1728c28add44570818a0e588904ae..1d011be93c3c09b1b299cb4b53c9895fe8c4cb23 100644 (file)
@@ -4,7 +4,7 @@ target triple = "i386-apple-darwin8"
 
 ; Without CSE of libcalls, there are two calls in the output instead of one.
 
-define i32 @u_f_nonbon(double %lambda) nounwind {
+define double @u_f_nonbon(double %lambda) nounwind {
 entry:
        %tmp19.i.i = load double* null, align 4         ; <double> [#uses=2]
        %tmp6.i = fcmp olt double %tmp19.i.i, 1.000000e+00              ; <i1> [#uses=1]
@@ -26,5 +26,5 @@ bb502.loopexit.i:             ; preds = %bb28.i
        br i1 false, label %bb.nph53.i, label %bb508.i
 
 bb508.i:               ; preds = %bb502.loopexit.i, %entry
-       ret i32 1
+       ret double %tmp10.i4
 }
index 095d8c68c22b6e9f55566a88a4126383c84e0d45..029aa91658d729fa03f885a4469382ac2a43a839 100644 (file)
@@ -1,4 +1,4 @@
-; RUN: llc < %s -verify-regalloc | FileCheck %s
+; RUN: llc < %s -disable-cgp-delete-dead-blocks -verify-regalloc | FileCheck %s
 ; PR11347
 ;
 ; This test case materializes the constant 1 in a register:
index eeebceea71d44d31ce4b34bbd1ad003e5b65cf9f..b066297ff1b451f2fdb15701f692aa71f277fa02 100644 (file)
@@ -1,4 +1,4 @@
-; RUN: llc < %s | FileCheck %s
+; RUN: llc < %s -disable-cgp-delete-dead-blocks | FileCheck %s
 target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
 target triple = "x86_64-apple-darwin10.0.0"