diff options
-rw-r--r-- | lib/Transforms/Utils/SimplifyCFG.cpp | 9 | ||||
-rw-r--r-- | test/Transforms/SimplifyCFG/common-dest-folding.ll | 29 |
2 files changed, 36 insertions, 2 deletions
diff --git a/lib/Transforms/Utils/SimplifyCFG.cpp b/lib/Transforms/Utils/SimplifyCFG.cpp index d56bb32..ff50b12 100644 --- a/lib/Transforms/Utils/SimplifyCFG.cpp +++ b/lib/Transforms/Utils/SimplifyCFG.cpp @@ -2090,8 +2090,13 @@ bool llvm::FoldBranchToCommonDest(BranchInst *BI) { // Ensure that any values used in the bonus instruction are also used // by the terminator of the predecessor. This means that those values // must already have been resolved, so we won't be inhibiting the - // out-of-order core by speculating them earlier. - if (BonusInst) { + // out-of-order core by speculating them earlier. We also allow + // instructions that are used by the terminator's condition because it + // exposes more merging opportunities. + bool UsedByBranch = (BonusInst && BonusInst->hasOneUse() && + *BonusInst->use_begin() == Cond); + + if (BonusInst && !UsedByBranch) { // Collect the values used by the bonus inst SmallPtrSet<Value*, 4> UsedValues; for (Instruction::op_iterator OI = BonusInst->op_begin(), diff --git a/test/Transforms/SimplifyCFG/common-dest-folding.ll b/test/Transforms/SimplifyCFG/common-dest-folding.ll index 10fb7d4..0aa3b2c 100644 --- a/test/Transforms/SimplifyCFG/common-dest-folding.ll +++ b/test/Transforms/SimplifyCFG/common-dest-folding.ll @@ -25,4 +25,33 @@ define i32 @foo(i32 %k, i32 %c1, i32 %c2) { ret i32 undef } +;CHECK: @conduse +;CHECK: shl i32 1, %c1 +;CHECK-NEXT: shl i32 1, %c2 +;CHECK-NEXT: and i32 +;CHECK-NEXT: icmp eq i32 +;CHECK-NEXT: and i32 +;CHECK-NEXT: icmp eq i32 +;CHECK: ret +define i32 @conduse(i32 %k, i32 %c1, i32 %c2) #0 { +bb: + %tmp = shl i32 1, %c1 + %tmp4 = shl i32 1, %c2 + %tmp1 = and i32 %tmp, %k + %tmp2 = icmp eq i32 %tmp1, 0 + br i1 %tmp2, label %bb9, label %bb3 + +bb3: ; preds = %bb + %tmp5 = and i32 %tmp4, %k + %tmp6 = icmp eq i32 %tmp5, 0 + br i1 %tmp6, label %bb9, label %bb7 + +bb7: ; preds = %bb3 + %tmp8 = tail call i32 (...)* @bar() #1 + br label %bb9 + +bb9: ; preds = %bb7, %bb3, %bb + ret i32 undef +} + declare i32 @bar(...) |