1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 11:02:59 +02:00

FoldBranchToCommonDest merges branches into a single branch with or/and of the condition. It has a heuristics for estimating when some of the dependencies are processed by out-of-order processors. This patch adds another rule to the heuristics that says that if the "BonusInstruction" that we speculatively execute is used by the condition of the second branch then it is okay to hoist it. This change exposes more opportunities for other passes to transform the code. It does not matter that much that we if-convert the code because the selectiondag builder splits or/and branches into multiple branches when profitable.

llvm-svn: 194524
This commit is contained in:
Nadav Rotem 2013-11-12 22:37:16 +00:00
parent 99c10a8e6d
commit 8fbd606127
2 changed files with 36 additions and 2 deletions

View File

@ -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(),

View File

@ -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(...)