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:
Dehao Chen 2017-03-23 23:26:00 +00:00
parent 0a6105c658
commit 42ca2b084a
4 changed files with 40 additions and 0 deletions

View File

@ -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); }

View File

@ -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));
}

View File

@ -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();

View 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}