summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJun Bum Lim <junbuml@codeaurora.org>2016-09-23 17:26:14 +0000
committerJun Bum Lim <junbuml@codeaurora.org>2016-09-23 17:26:14 +0000
commit3822939ba79fbae0cd7464a403ffb63fca53471b (patch)
tree80f06643b7105a9a2f9c633dcdb07d28773c7ae9
parent7bc254f89c4d7abd26e0c9ccffac2b650c2b6500 (diff)
downloadbcm5719-llvm-3822939ba79fbae0cd7464a403ffb63fca53471b.tar.gz
bcm5719-llvm-3822939ba79fbae0cd7464a403ffb63fca53471b.zip
Enhance calcColdCallHeuristics for InvokeInst
Summary: When identifying cold blocks, consider only the edge to the normal destination if the terminator is InvokeInst and let calcInvokeHeuristics() decide edge weights for the InvokeInst. Reviewers: mcrosier, hfinkel, davidxl Subscribers: mcrosier, llvm-commits Differential Revision: https://reviews.llvm.org/D24868 llvm-svn: 282262
-rw-r--r--llvm/lib/Analysis/BranchProbabilityInfo.cpp10
-rw-r--r--llvm/test/Analysis/BranchProbabilityInfo/basic.ll93
2 files changed, 103 insertions, 0 deletions
diff --git a/llvm/lib/Analysis/BranchProbabilityInfo.cpp b/llvm/lib/Analysis/BranchProbabilityInfo.cpp
index bf02653b492..0228e895879 100644
--- a/llvm/lib/Analysis/BranchProbabilityInfo.cpp
+++ b/llvm/lib/Analysis/BranchProbabilityInfo.cpp
@@ -279,6 +279,16 @@ bool BranchProbabilityInfo::calcColdCallHeuristics(const BasicBlock *BB) {
}
}
+ if (auto *II = dyn_cast<InvokeInst>(TI)) {
+ // If the terminator is an InvokeInst, consider only the normal destination
+ // block.
+ if (PostDominatedByColdCall.count(II->getNormalDest()))
+ PostDominatedByColdCall.insert(BB);
+ // Return false here so that edge weights for InvokeInst could be decided
+ // in calcInvokeHeuristics().
+ return false;
+ }
+
// Skip probabilities if this block has a single successor.
if (TI->getNumSuccessors() == 1 || ColdEdges.empty())
return false;
diff --git a/llvm/test/Analysis/BranchProbabilityInfo/basic.ll b/llvm/test/Analysis/BranchProbabilityInfo/basic.ll
index a278c4a70c7..67d3e9e850c 100644
--- a/llvm/test/Analysis/BranchProbabilityInfo/basic.ll
+++ b/llvm/test/Analysis/BranchProbabilityInfo/basic.ll
@@ -176,6 +176,99 @@ exit:
ret i32 %ret
}
+; CHECK-LABEL: test_invoke_code_callsite1
+define i32 @test_invoke_code_callsite1(i1 %c) personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
+entry:
+ br i1 %c, label %if.then, label %if.end
+; Edge "entry->if.end" should have higher probability based on the cold call
+; heuristic which treat %if.then as a cold block because the normal destination
+; of the invoke instruction in %if.then is post-dominated by ColdFunc().
+; CHECK: edge entry -> if.then probability is 0x07878788 / 0x80000000 = 5.88%
+; CHECK: edge entry -> if.end probability is 0x78787878 / 0x80000000 = 94.12% [HOT edge]
+
+if.then:
+ invoke i32 @InvokeCall()
+ 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:
+ call void @ColdFunc() #0
+ br label %if.end
+
+lpad:
+ %ll = landingpad { i8*, i32 }
+ cleanup
+ br label %if.end
+
+if.end:
+ ret i32 0
+}
+
+; CHECK-LABEL: test_invoke_code_callsite2
+define i32 @test_invoke_code_callsite2(i1 %c) personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
+entry:
+ br i1 %c, label %if.then, label %if.end
+
+; CHECK: edge entry -> if.then probability is 0x40000000 / 0x80000000 = 50.00%
+; CHECK: edge entry -> if.end probability is 0x40000000 / 0x80000000 = 50.00%
+
+if.then:
+ invoke i32 @InvokeCall()
+ to label %invoke.cont unwind label %lpad
+; The cold call heuristic should not kick in when the cold callsite is in EH path.
+; 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:
+ br label %if.end
+
+lpad:
+ %ll = landingpad { i8*, i32 }
+ cleanup
+ call void @ColdFunc() #0
+ br label %if.end
+
+if.end:
+ ret i32 0
+}
+
+; CHECK-LABEL: test_invoke_code_callsite3
+define i32 @test_invoke_code_callsite3(i1 %c) personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
+entry:
+ br i1 %c, label %if.then, label %if.end
+; CHECK: edge entry -> if.then probability is 0x07878788 / 0x80000000 = 5.88%
+; CHECK: edge entry -> if.end probability is 0x78787878 / 0x80000000 = 94.12% [HOT edge]
+
+if.then:
+ invoke i32 @InvokeCall()
+ to label %invoke.cont unwind label %lpad
+; Regardless of cold calls, edge weights from a invoke instruction should be
+; determined by the invoke heuristic.
+; 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:
+ call void @ColdFunc() #0
+ br label %if.end
+
+lpad:
+ %ll = landingpad { i8*, i32 }
+ cleanup
+ call void @ColdFunc() #0
+ br label %if.end
+
+if.end:
+ ret i32 0
+}
+
+declare i32 @__gxx_personality_v0(...)
+declare void @ColdFunc()
+declare i32 @InvokeCall()
+
+attributes #0 = { cold }
+
+
define i32 @zero1(i32 %i, i32 %a, i32 %b) {
; CHECK: Printing analysis {{.*}} for function 'zero1'
entry:
OpenPOWER on IntegriCloud