mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-14 01:20:40 +00:00
Set the prof weight correctly for call instructions in DeadArgumentElimination.
Summary: In DeadArgumentElimination, the call instructions will be replaced. We also need to set the prof weights so that function inlining can find the correct profile. Reviewers: eraman Reviewed By: eraman Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D31143 llvm-svn: 298660
This commit is contained in:
parent
0a6105c658
commit
42ca2b084a
@ -255,6 +255,9 @@ public:
|
||||
/// Updates branch_weights metadata by scaling it by \p S / \p T.
|
||||
void updateProfWeight(uint64_t S, uint64_t T);
|
||||
|
||||
/// Sets the branch_weights metadata to \p W for CallInst.
|
||||
void setProfWeight(uint64_t W);
|
||||
|
||||
/// Set the debug location information for this instruction.
|
||||
void setDebugLoc(DebugLoc Loc) { DbgLoc = std::move(Loc); }
|
||||
|
||||
|
@ -652,3 +652,12 @@ void Instruction::updateProfWeight(uint64_t S, uint64_t T) {
|
||||
MDBuilder MDB(getContext());
|
||||
setMetadata(LLVMContext::MD_prof, MDB.createBranchWeights(Weights));
|
||||
}
|
||||
|
||||
void Instruction::setProfWeight(uint64_t W) {
|
||||
assert((isa<CallInst>(this) || isa<InvokeInst>(this)) &&
|
||||
"Can only set weights for call and invoke instrucitons");
|
||||
SmallVector<uint32_t, 1> Weights;
|
||||
Weights.push_back(W);
|
||||
MDBuilder MDB(getContext());
|
||||
setMetadata(LLVMContext::MD_prof, MDB.createBranchWeights(Weights));
|
||||
}
|
||||
|
@ -194,6 +194,9 @@ bool DeadArgumentEliminationPass::DeleteDeadVarargs(Function &Fn) {
|
||||
cast<CallInst>(Call)->getTailCallKind());
|
||||
}
|
||||
New->setDebugLoc(Call->getDebugLoc());
|
||||
uint64_t W;
|
||||
if (Call->extractProfTotalWeight(W))
|
||||
New->setProfWeight(W);
|
||||
|
||||
Args.clear();
|
||||
|
||||
@ -901,6 +904,9 @@ bool DeadArgumentEliminationPass::RemoveDeadStuffFromFunction(Function *F) {
|
||||
cast<CallInst>(Call)->getTailCallKind());
|
||||
}
|
||||
New->setDebugLoc(Call->getDebugLoc());
|
||||
uint64_t W;
|
||||
if (Call->extractProfTotalWeight(W))
|
||||
New->setProfWeight(W);
|
||||
|
||||
Args.clear();
|
||||
|
||||
|
22
test/Transforms/DeadArgElim/call_profile.ll
Normal file
22
test/Transforms/DeadArgElim/call_profile.ll
Normal file
@ -0,0 +1,22 @@
|
||||
; RUN: opt -deadargelim -S < %s | FileCheck %s
|
||||
|
||||
; Checks if !prof metadata is corret in deadargelim.
|
||||
|
||||
define void @caller() #0 {
|
||||
; CHECK: call void @test_vararg(), !prof ![[PROF:[0-9]]]
|
||||
; CHECK: call void @test(), !prof ![[PROF]]
|
||||
call void (i32, ...) @test_vararg(i32 1), !prof !0
|
||||
call void @test(i32 1), !prof !0
|
||||
ret void
|
||||
}
|
||||
|
||||
define internal void @test_vararg(i32, ...) #1 {
|
||||
ret void
|
||||
}
|
||||
|
||||
define internal void @test(i32 %a) #1 {
|
||||
ret void
|
||||
}
|
||||
|
||||
; CHECK:![[PROF]] = !{!"branch_weights", i32 30}
|
||||
!0 = !{!"branch_weights", i32 30}
|
Loading…
x
Reference in New Issue
Block a user