[llvm] r298660 - Set the prof weight correctly for call instructions in DeadArgumentElimination.
Dehao Chen via llvm-commits
llvm-commits at lists.llvm.org
Thu Mar 23 16:26:00 PDT 2017
Author: dehao
Date: Thu Mar 23 18:26:00 2017
New Revision: 298660
URL: http://llvm.org/viewvc/llvm-project?rev=298660&view=rev
Log:
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
Added:
llvm/trunk/test/Transforms/DeadArgElim/call_profile.ll
Modified:
llvm/trunk/include/llvm/IR/Instruction.h
llvm/trunk/lib/IR/Instruction.cpp
llvm/trunk/lib/Transforms/IPO/DeadArgumentElimination.cpp
Modified: llvm/trunk/include/llvm/IR/Instruction.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/Instruction.h?rev=298660&r1=298659&r2=298660&view=diff
==============================================================================
--- llvm/trunk/include/llvm/IR/Instruction.h (original)
+++ llvm/trunk/include/llvm/IR/Instruction.h Thu Mar 23 18:26:00 2017
@@ -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); }
Modified: llvm/trunk/lib/IR/Instruction.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Instruction.cpp?rev=298660&r1=298659&r2=298660&view=diff
==============================================================================
--- llvm/trunk/lib/IR/Instruction.cpp (original)
+++ llvm/trunk/lib/IR/Instruction.cpp Thu Mar 23 18:26:00 2017
@@ -652,3 +652,12 @@ void Instruction::updateProfWeight(uint6
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));
+}
Modified: llvm/trunk/lib/Transforms/IPO/DeadArgumentElimination.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/DeadArgumentElimination.cpp?rev=298660&r1=298659&r2=298660&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/IPO/DeadArgumentElimination.cpp (original)
+++ llvm/trunk/lib/Transforms/IPO/DeadArgumentElimination.cpp Thu Mar 23 18:26:00 2017
@@ -194,6 +194,9 @@ bool DeadArgumentEliminationPass::Delete
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::Remove
cast<CallInst>(Call)->getTailCallKind());
}
New->setDebugLoc(Call->getDebugLoc());
+ uint64_t W;
+ if (Call->extractProfTotalWeight(W))
+ New->setProfWeight(W);
Args.clear();
Added: llvm/trunk/test/Transforms/DeadArgElim/call_profile.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/DeadArgElim/call_profile.ll?rev=298660&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/DeadArgElim/call_profile.ll (added)
+++ llvm/trunk/test/Transforms/DeadArgElim/call_profile.ll Thu Mar 23 18:26:00 2017
@@ -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}
More information about the llvm-commits
mailing list