Enhance BranchProbabilityInfo::calcUnreachableHeuristics for InvokeInst

This is recommit of r256028 with minor fixes in unittests:
  CodeGen/Mips/eh.ll
  CodeGen/Mips/insn-zero-size-bb.ll

Original commit message:

When identifying blocks post-dominated by an unreachable-terminated block
in BranchProbabilityInfo, consider only the edge to the normal destination
block if the terminator is InvokeInst and let calcInvokeHeuristics() decide
edge weights for the InvokeInst.

llvm-svn: 256202
This commit is contained in:
Jun Bum Lim 2015-12-21 22:00:51 +00:00
parent ab361efee7
commit a23e5f7516
5 changed files with 61 additions and 4 deletions

View File

@ -147,6 +147,16 @@ bool BranchProbabilityInfo::calcUnreachableHeuristics(BasicBlock *BB) {
if (TI->getNumSuccessors() == 1 || UnreachableEdges.empty())
return false;
// If the terminator is an InvokeInst, check only the normal destination block
// as the unwind edge of InvokeInst is also very unlikely taken.
if (auto *II = dyn_cast<InvokeInst>(TI))
if (PostDominatedByUnreachable.count(II->getNormalDest())) {
PostDominatedByUnreachable.insert(BB);
// Return false here so that edge weights for InvokeInst could be decided
// in calcInvokeHeuristics().
return false;
}
uint32_t UnreachableWeight =
std::max(UR_TAKEN_WEIGHT / (unsigned)UnreachableEdges.size(), MIN_WEIGHT);
for (SmallVectorImpl<unsigned>::iterator I = UnreachableEdges.begin(),

View File

@ -77,3 +77,48 @@ abort:
exit:
ret i32 %b
}
@_ZTIi = external global i8*
; CHECK-LABEL: throwSmallException
; CHECK-NOT: invoke i32 @smallFunction
define i32 @throwSmallException(i32 %idx, i32 %limit) #0 personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
entry:
%cmp = icmp sge i32 %idx, %limit
br i1 %cmp, label %if.then, label %if.end
; CHECK: edge entry -> if.then probability is 0x00000800 / 0x80000000 = 0.00%
; CHECK: edge entry -> if.end probability is 0x7ffff800 / 0x80000000 = 100.00% [HOT edge]
if.then: ; preds = %entry
%exception = call i8* @__cxa_allocate_exception(i64 1) #0
invoke i32 @smallFunction(i32 %idx)
to label %invoke.cont unwind label %lpad
; CHECK: edge if.then -> invoke.cont probability is 0x7ffff800 / 0x80000000 = 100.00% [HOT edge]
; CHECK: edge if.then -> lpad probability is 0x00000800 / 0x80000000 = 0.00%
invoke.cont: ; preds = %if.then
call void @__cxa_throw(i8* %exception, i8* bitcast (i8** @_ZTIi to i8*), i8* null) #1
unreachable
lpad: ; preds = %if.then
%ll = landingpad { i8*, i32 }
cleanup
ret i32 %idx
if.end: ; preds = %entry
ret i32 %idx
}
@a = global i32 4
define i32 @smallFunction(i32 %a) {
entry:
%r = load volatile i32, i32* @a
ret i32 %r
}
attributes #0 = { nounwind }
attributes #1 = { noreturn }
declare i8* @__cxa_allocate_exception(i64)
declare i32 @__gxx_personality_v0(...)
declare void @__cxa_throw(i8*, i8*, i8*)

View File

@ -24,7 +24,7 @@ entry:
lpad: ; preds = %entry
; CHECK-EL: # %lpad
; CHECK-EL: bne $5
; CHECK-EL: beq $5
%exn.val = landingpad { i8*, i32 }
cleanup

View File

@ -14,7 +14,7 @@ entry:
to label %unreachable unwind label %return
unreachable:
; CHECK: ${{.*}}: # %unreachable
; CHECK: {{.*}}: # %unreachable
; CHECK-NEXT: .insn
unreachable

View File

@ -34,12 +34,14 @@ return: ; preds = %catch, %entry
; CHECK-LABEL: foo: # @foo
; CHECK: testb $1, %cl
; CHECK: jne .LBB0_[[return:[0-9]+]]
; CHECK: je .LBB0_[[try:[0-9]+]]
; CHECK: .LBB0_[[return:[0-9]+]]:
; CHECK: retq
; CHECK: .LBB0_[[try]]:
; CHECK: .Ltmp0:
; CHECK: callq bar
; CHECK: .Ltmp1:
; CHECK: .LBB0_[[catch:[0-9]+]]:
; CHECK: .LBB0_[[return]]:
; CHECK: .seh_handlerdata
; CHECK-NEXT: .Lfoo$parent_frame_offset = 32