Skip to content

Commit

Permalink
[JumpThreading] Fix opcode bonus in getJumpThreadDuplicationCost()
Browse files Browse the repository at this point in the history
The code that was meant to adjust the duplication cost based on the
terminator opcode was not being executed in cases where the initial
threshold was hit inside the loop.

Subscribers: mcrosier, llvm-commits

Differential Revision: http://reviews.llvm.org/D15536

llvm-svn: 256568
  • Loading branch information
geoffberry committed Dec 29, 2015
1 parent 755baa4 commit 43dc285
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 10 deletions.
26 changes: 16 additions & 10 deletions llvm/lib/Transforms/Scalar/JumpThreading.cpp
Expand Up @@ -286,6 +286,21 @@ static unsigned getJumpThreadDuplicationCost(const BasicBlock *BB,
// FIXME: THREADING will delete values that are just used to compute the
// branch, so they shouldn't count against the duplication cost.

unsigned Bonus = 0;
const TerminatorInst *BBTerm = BB->getTerminator();
// Threading through a switch statement is particularly profitable. If this
// block ends in a switch, decrease its cost to make it more likely to happen.
if (isa<SwitchInst>(BBTerm))
Bonus = 6;

// The same holds for indirect branches, but slightly more so.
if (isa<IndirectBrInst>(BBTerm))
Bonus = 8;

// Bump the threshold up so the early exit from the loop doesn't skip the
// terminator-based Size adjustment at the end.
Threshold += Bonus;

// Sum up the cost of each instruction until we get to the terminator. Don't
// include the terminator because the copy won't include it.
unsigned Size = 0;
Expand Down Expand Up @@ -326,16 +341,7 @@ static unsigned getJumpThreadDuplicationCost(const BasicBlock *BB,
}
}

// Threading through a switch statement is particularly profitable. If this
// block ends in a switch, decrease its cost to make it more likely to happen.
if (isa<SwitchInst>(I))
Size = Size > 6 ? Size-6 : 0;

// The same holds for indirect branches, but slightly more so.
if (isa<IndirectBrInst>(I))
Size = Size > 8 ? Size-8 : 0;

return Size;
return Size > Bonus ? Size - Bonus : 0;
}

/// FindLoopHeaders - We do not want jump threading to turn proper loop
Expand Down
30 changes: 30 additions & 0 deletions llvm/test/Transforms/JumpThreading/select.ll
Expand Up @@ -91,6 +91,36 @@ L3:
}


; Jump threading of indirectbr with select as address. Test increased
; duplication threshold for cases where indirectbr is being threaded
; through.

; CHECK-LABEL: @test_indirectbr_thresh(
; CHECK-NEXT: entry:
; CHECK-NEXT: br i1 %cond, label %L1, label %L3
; CHECK-NOT: indirectbr
define void @test_indirectbr_thresh(i1 %cond, i8* %address) nounwind {
entry:
br i1 %cond, label %L0, label %L3
L0:
%indirect.goto.dest = select i1 %cond, i8* blockaddress(@test_indirectbr_thresh, %L1), i8* %address
call void @quux()
call void @quux()
call void @quux()
indirectbr i8* %indirect.goto.dest, [label %L1, label %L2, label %L3]

L1:
call void @foo()
ret void
L2:
call void @bar()
ret void
L3:
call void @baz()
ret void
}


; A more complicated case: the condition is a select based on a comparison.

; CHECK-LABEL: @test_switch_cmp(
Expand Down

0 comments on commit 43dc285

Please sign in to comment.