[llvm] [Transforms][IPO] Add remarks for ArgumentPromotion and DeadArgumentE… (PR #105740)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Aug 22 14:50:31 PDT 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-transforms
Author: None (yonghong-song)
<details>
<summary>Changes</summary>
…limination
ArgumentPromotion and DeadArgumentElimination passes may change function signature. This makes bpf tracing difficult since users either not aware of signature change or need to poke into IR or assembly to understand the function signature change.
This patch enabled to emit some remarks so if recompiling with -foptimization-record-file=<file>, users can check remarks to see what kind of signature changes for a particular function. The following are some examples for implemented remarks:
```
Pass: deadargelim
Name: ReturnValueRemoved
DebugLoc: { File: 'bpf-next/net/mptcp/protocol.c', Line: 572, Column: 0 }
Function: mptcp_check_data_fin
Args:
- Function: mptcp_check_data_fin
DebugLoc: { File: 'bpf-next/net/mptcp/protocol.c', Line: 572,
Column: 0 }
- String: ' removing return value '
- String: '0'
Pass: deadargelim
Name: ArgumentRemoved
DebugLoc: { File: 'bpf-next/kernel/bpf/syscall.c', Line: 1670, Column: 0 }
Function: map_delete_elem
Args:
- Function: map_delete_elem
DebugLoc: { File: 'bpf-next/kernel/bpf/syscall.c', Line: 1670,
Column: 0 }
- String: ' removing argument '
- String: '1'
- String: ' ('
- String: uattr.coerce0
- String: ')'
Pass: argpromotion
Name: ArgumentPromoted
DebugLoc: { File: 'bpf-next/net/mptcp/protocol.h', Line: 570, Column: 0 }
Function: mptcp_subflow_ctx
Args:
- Function: mptcp_subflow_ctx
DebugLoc: { File: 'bpf-next/net/mptcp/protocol.h', Line: 570,
Column: 0 }
- String: ' promoting argument '
- String: '0'
- String: ' ('
- String: sk
- String: ')'
```
[1] https://github.com/llvm/llvm-project/issues/104678
---
Full diff: https://github.com/llvm/llvm-project/pull/105740.diff
2 Files Affected:
- (modified) llvm/lib/Transforms/IPO/ArgumentPromotion.cpp (+14)
- (modified) llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp (+14)
``````````diff
diff --git a/llvm/lib/Transforms/IPO/ArgumentPromotion.cpp b/llvm/lib/Transforms/IPO/ArgumentPromotion.cpp
index 452fff7898d0ea..9369d2be74bb7d 100644
--- a/llvm/lib/Transforms/IPO/ArgumentPromotion.cpp
+++ b/llvm/lib/Transforms/IPO/ArgumentPromotion.cpp
@@ -42,6 +42,7 @@
#include "llvm/Analysis/CallGraph.h"
#include "llvm/Analysis/Loads.h"
#include "llvm/Analysis/MemoryLocation.h"
+#include "llvm/Analysis/OptimizationRemarkEmitter.h"
#include "llvm/Analysis/TargetTransformInfo.h"
#include "llvm/Analysis/ValueTracking.h"
#include "llvm/IR/Argument.h"
@@ -126,6 +127,7 @@ doPromotion(Function *F, FunctionAnalysisManager &FAM,
// arguments.
SmallVector<unsigned> NewArgIndices;
AttributeList PAL = F->getAttributes();
+ OptimizationRemarkEmitter ORE(F);
// First, determine the new argument list
unsigned ArgNo = 0, NewArgNo = 0;
@@ -139,6 +141,12 @@ doPromotion(Function *F, FunctionAnalysisManager &FAM,
} else if (I->use_empty()) {
// Dead argument (which are always marked as promotable)
++NumArgumentsDead;
+ ORE.emit([&]() {
+ return OptimizationRemark(DEBUG_TYPE, "ArgumentRemoved", F)
+ << ore::NV("Function", F) << " removing argument "
+ << std::to_string(ArgNo) << " (" << I->getName() << ")";
+ });
+
NewArgIndices.push_back((unsigned)-1);
} else {
const auto &ArgParts = ArgsToPromote.find(&*I)->second;
@@ -147,6 +155,12 @@ doPromotion(Function *F, FunctionAnalysisManager &FAM,
ArgAttrVec.push_back(AttributeSet());
}
++NumArgumentsPromoted;
+ ORE.emit([&]() {
+ return OptimizationRemark(DEBUG_TYPE, "ArgumentPromoted", F)
+ << ore::NV("Function", F) << " promoting argument "
+ << std::to_string(ArgNo) << " (" << I->getName() << ")";
+ });
+
NewArgIndices.push_back((unsigned)-1);
NewArgNo += ArgParts.size();
}
diff --git a/llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp b/llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp
index f5a7ab26a49e96..bb71993995cf18 100644
--- a/llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp
+++ b/llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp
@@ -19,6 +19,7 @@
#include "llvm/Transforms/IPO/DeadArgumentElimination.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Statistic.h"
+#include "llvm/Analysis/OptimizationRemarkEmitter.h"
#include "llvm/IR/Argument.h"
#include "llvm/IR/AttributeMask.h"
#include "llvm/IR/Attributes.h"
@@ -748,6 +749,7 @@ bool DeadArgumentEliminationPass::removeDeadStuffFromFunction(Function *F) {
// Set up to build a new list of parameter attributes.
SmallVector<AttributeSet, 8> ArgAttrVec;
const AttributeList &PAL = F->getAttributes();
+ OptimizationRemarkEmitter ORE(F);
// Remember which arguments are still alive.
SmallVector<bool, 10> ArgAlive(FTy->getNumParams(), false);
@@ -765,6 +767,12 @@ bool DeadArgumentEliminationPass::removeDeadStuffFromFunction(Function *F) {
HasLiveReturnedArg |= PAL.hasParamAttr(ArgI, Attribute::Returned);
} else {
++NumArgumentsEliminated;
+
+ ORE.emit([&]() {
+ return OptimizationRemark(DEBUG_TYPE, "ArgumentRemoved", F)
+ << ore::NV("Function", F) << " removing argument "
+ << std::to_string(ArgI) << " (" << I->getName() << ")";
+ });
LLVM_DEBUG(dbgs() << "DeadArgumentEliminationPass - Removing argument "
<< ArgI << " (" << I->getName() << ") from "
<< F->getName() << "\n");
@@ -810,6 +818,12 @@ bool DeadArgumentEliminationPass::removeDeadStuffFromFunction(Function *F) {
NewRetIdxs[Ri] = RetTypes.size() - 1;
} else {
++NumRetValsEliminated;
+
+ ORE.emit([&]() {
+ return OptimizationRemark(DEBUG_TYPE, "ReturnValueRemoved", F)
+ << ore::NV("Function", F) << " removing return value "
+ << std::to_string(Ri);
+ });
LLVM_DEBUG(
dbgs() << "DeadArgumentEliminationPass - Removing return value "
<< Ri << " from " << F->getName() << "\n");
``````````
</details>
https://github.com/llvm/llvm-project/pull/105740
More information about the llvm-commits
mailing list