Skip to content

Commit 470f55f

Browse files
[Transforms][IPO] Add remarks for ArgumentPromotion and DeadArgumentE… (#105740)
…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: - 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: - String: 'eliminating argument ' - ArgName: uattr.coerce0 - String: '(' - ArgIndex: '1' - String: ')' Pass: argpromotion Name: ArgumentPromoted DebugLoc: { File: 'bpf-next/net/mptcp/protocol.h', Line: 570, Column: 0 } Function: mptcp_subflow_ctx Args: - String: 'promoting argument ' - ArgName: sk - String: '(' - ArgIndex: '0' - String: ')' - String: ' to pass by value' ``` [1] #104678
1 parent 6d9c6f0 commit 470f55f

File tree

4 files changed

+49
-2
lines changed

4 files changed

+49
-2
lines changed

llvm/lib/Transforms/IPO/ArgumentPromotion.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
#include "llvm/Analysis/CallGraph.h"
4343
#include "llvm/Analysis/Loads.h"
4444
#include "llvm/Analysis/MemoryLocation.h"
45+
#include "llvm/Analysis/OptimizationRemarkEmitter.h"
4546
#include "llvm/Analysis/TargetTransformInfo.h"
4647
#include "llvm/Analysis/ValueTracking.h"
4748
#include "llvm/IR/Argument.h"
@@ -126,6 +127,7 @@ doPromotion(Function *F, FunctionAnalysisManager &FAM,
126127
// arguments.
127128
SmallVector<unsigned> NewArgIndices;
128129
AttributeList PAL = F->getAttributes();
130+
OptimizationRemarkEmitter ORE(F);
129131

130132
// First, determine the new argument list
131133
unsigned ArgNo = 0, NewArgNo = 0;
@@ -139,6 +141,12 @@ doPromotion(Function *F, FunctionAnalysisManager &FAM,
139141
} else if (I->use_empty()) {
140142
// Dead argument (which are always marked as promotable)
141143
++NumArgumentsDead;
144+
ORE.emit([&]() {
145+
return OptimizationRemark(DEBUG_TYPE, "ArgumentRemoved", F)
146+
<< "eliminating argument " << ore::NV("ArgName", I->getName())
147+
<< "(" << ore::NV("ArgIndex", ArgNo) << ")";
148+
});
149+
142150
NewArgIndices.push_back((unsigned)-1);
143151
} else {
144152
const auto &ArgParts = ArgsToPromote.find(&*I)->second;
@@ -147,6 +155,13 @@ doPromotion(Function *F, FunctionAnalysisManager &FAM,
147155
ArgAttrVec.push_back(AttributeSet());
148156
}
149157
++NumArgumentsPromoted;
158+
ORE.emit([&]() {
159+
return OptimizationRemark(DEBUG_TYPE, "ArgumentPromoted", F)
160+
<< "promoting argument " << ore::NV("ArgName", I->getName())
161+
<< "(" << ore::NV("ArgIndex", ArgNo) << ")"
162+
<< " to pass by value";
163+
});
164+
150165
NewArgIndices.push_back((unsigned)-1);
151166
NewArgNo += ArgParts.size();
152167
}

llvm/lib/Transforms/IPO/DeadArgumentElimination.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "llvm/Transforms/IPO/DeadArgumentElimination.h"
2020
#include "llvm/ADT/SmallVector.h"
2121
#include "llvm/ADT/Statistic.h"
22+
#include "llvm/Analysis/OptimizationRemarkEmitter.h"
2223
#include "llvm/IR/Argument.h"
2324
#include "llvm/IR/AttributeMask.h"
2425
#include "llvm/IR/Attributes.h"
@@ -748,6 +749,7 @@ bool DeadArgumentEliminationPass::removeDeadStuffFromFunction(Function *F) {
748749
// Set up to build a new list of parameter attributes.
749750
SmallVector<AttributeSet, 8> ArgAttrVec;
750751
const AttributeList &PAL = F->getAttributes();
752+
OptimizationRemarkEmitter ORE(F);
751753

752754
// Remember which arguments are still alive.
753755
SmallVector<bool, 10> ArgAlive(FTy->getNumParams(), false);
@@ -765,6 +767,12 @@ bool DeadArgumentEliminationPass::removeDeadStuffFromFunction(Function *F) {
765767
HasLiveReturnedArg |= PAL.hasParamAttr(ArgI, Attribute::Returned);
766768
} else {
767769
++NumArgumentsEliminated;
770+
771+
ORE.emit([&]() {
772+
return OptimizationRemark(DEBUG_TYPE, "ArgumentRemoved", F)
773+
<< "eliminating argument " << ore::NV("ArgName", I->getName())
774+
<< "(" << ore::NV("ArgIndex", ArgI) << ")";
775+
});
768776
LLVM_DEBUG(dbgs() << "DeadArgumentEliminationPass - Removing argument "
769777
<< ArgI << " (" << I->getName() << ") from "
770778
<< F->getName() << "\n");
@@ -810,6 +818,11 @@ bool DeadArgumentEliminationPass::removeDeadStuffFromFunction(Function *F) {
810818
NewRetIdxs[Ri] = RetTypes.size() - 1;
811819
} else {
812820
++NumRetValsEliminated;
821+
822+
ORE.emit([&]() {
823+
return OptimizationRemark(DEBUG_TYPE, "ReturnValueRemoved", F)
824+
<< "removing return value " << std::to_string(Ri);
825+
});
813826
LLVM_DEBUG(
814827
dbgs() << "DeadArgumentEliminationPass - Removing return value "
815828
<< Ri << " from " << F->getName() << "\n");

llvm/test/Transforms/ArgumentPromotion/2008-02-01-ReturnAttrs.ll

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,22 @@
11
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes
2-
; RUN: opt < %s -passes=argpromotion -S | FileCheck %s
2+
; RUN: opt < %s -passes=argpromotion -S -pass-remarks-output=%t | FileCheck %s
3+
; RUN: cat %t | FileCheck -check-prefix=REMARK %s
34

45
define internal i32 @deref(ptr %x) nounwind {
56
; CHECK-LABEL: define {{[^@]+}}@deref
67
; CHECK-SAME: (i32 [[X_0_VAL:%.*]]) #[[ATTR0:[0-9]+]] {
78
; CHECK-NEXT: entry:
89
; CHECK-NEXT: ret i32 [[X_0_VAL]]
910
;
11+
; REMARK-LABEL: Function: deref
12+
; REMARK: Args:
13+
; REMARK-NEXT: - String: 'promoting argument '
14+
; REMARK-NEXT: - ArgName: x
15+
; REMARK-NEXT: - String: '('
16+
; REMARK-NEXT: - ArgIndex: '0'
17+
; REMARK-NEXT: - String: ')'
18+
; REMARK-NEXT: - String: ' to pass by value'
19+
;
1020
entry:
1121
%temp2 = load i32, ptr %x, align 4
1222
ret i32 %temp2

llvm/test/Transforms/DeadArgElim/2007-12-20-ParamAttrs.ll

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,19 @@
1-
; RUN: opt < %s -passes=deadargelim -S | FileCheck %s
1+
; RUN: opt < %s -passes=deadargelim -S -pass-remarks-output=%t | FileCheck %s
2+
; RUN: cat %t | FileCheck -check-prefix=REMARK %s
23

34
%struct = type { }
45

56
@g = global i8 0
67

78
; CHECK: define internal void @foo(i8 signext %y) [[NUW:#[0-9]+]]
9+
;
10+
; REMARK-LABEL: Function: foo
11+
; REMARK: Args:
12+
; REMARK-NEXT: - String: 'eliminating argument '
13+
; REMARK-NEXT: - ArgName: p
14+
; REMARK-NEXT: - String: '('
15+
; REMARK-NEXT: - ArgIndex: '0'
16+
; REMARK-NEXT: - String: ')'
817

918
define internal zeroext i8 @foo(ptr inreg %p, i8 signext %y, ... ) nounwind {
1019
store i8 %y, ptr @g

0 commit comments

Comments
 (0)