diff options
author | Jun Bum Lim <junbuml@codeaurora.org> | 2016-09-23 17:26:14 +0000 |
---|---|---|
committer | Jun Bum Lim <junbuml@codeaurora.org> | 2016-09-23 17:26:14 +0000 |
commit | 3822939ba79fbae0cd7464a403ffb63fca53471b (patch) | |
tree | 80f06643b7105a9a2f9c633dcdb07d28773c7ae9 | |
parent | 7bc254f89c4d7abd26e0c9ccffac2b650c2b6500 (diff) | |
download | bcm5719-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.cpp | 10 | ||||
-rw-r--r-- | llvm/test/Analysis/BranchProbabilityInfo/basic.ll | 93 |
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: |