Index: include/llvm/IR/Instruction.h =================================================================== --- include/llvm/IR/Instruction.h +++ include/llvm/IR/Instruction.h @@ -255,6 +255,9 @@ /// 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); } Index: lib/IR/Instruction.cpp =================================================================== --- lib/IR/Instruction.cpp +++ lib/IR/Instruction.cpp @@ -652,3 +652,12 @@ MDBuilder MDB(getContext()); setMetadata(LLVMContext::MD_prof, MDB.createBranchWeights(Weights)); } + +void Instruction::setProfWeight(uint64_t W) { + assert((isa(this) || isa(this)) && + "Can only set weights for call and invoke instrucitons"); + SmallVector Weights; + Weights.push_back(W); + MDBuilder MDB(getContext()); + setMetadata(LLVMContext::MD_prof, MDB.createBranchWeights(Weights)); +} Index: lib/Transforms/IPO/DeadArgumentElimination.cpp =================================================================== --- lib/Transforms/IPO/DeadArgumentElimination.cpp +++ lib/Transforms/IPO/DeadArgumentElimination.cpp @@ -194,6 +194,9 @@ cast(Call)->getTailCallKind()); } New->setDebugLoc(Call->getDebugLoc()); + uint64_t W; + if (Call->extractProfTotalWeight(W)) + New->setProfWeight(W); Args.clear(); @@ -900,6 +903,9 @@ cast(Call)->getTailCallKind()); } New->setDebugLoc(Call->getDebugLoc()); + uint64_t W; + if (Call->extractProfTotalWeight(W)) + New->setProfWeight(W); Args.clear(); Index: test/Transforms/DeadArgElim/call_profile.ll =================================================================== --- /dev/null +++ test/Transforms/DeadArgElim/call_profile.ll @@ -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}