@@ -42,7 +42,7 @@ class AMDGPUAlwaysInline : public ModulePass {
42
42
43
43
void getAnalysisUsage (AnalysisUsage &AU) const override {
44
44
AU.setPreservesAll ();
45
- }
45
+ }
46
46
};
47
47
48
48
} // End anonymous namespace
@@ -54,7 +54,8 @@ char AMDGPUAlwaysInline::ID = 0;
54
54
55
55
static void
56
56
recursivelyVisitUsers (GlobalValue &GV,
57
- SmallPtrSetImpl<Function *> &FuncsToAlwaysInline) {
57
+ SmallPtrSetImpl<Function *> &FuncsToAlwaysInline,
58
+ bool &Preserved) {
58
59
SmallVector<User *, 16 > Stack (GV.users ());
59
60
60
61
SmallPtrSet<const Value *, 8 > Visited;
@@ -73,6 +74,7 @@ recursivelyVisitUsers(GlobalValue &GV,
73
74
// Unfortunately, clang adds noinline to all functions at -O0. We have
74
75
// to override this here until that's fixed.
75
76
F->removeFnAttr (Attribute::NoInline);
77
+ Preserved = false ;
76
78
77
79
FuncsToAlwaysInline.insert (F);
78
80
Stack.push_back (F);
@@ -89,6 +91,7 @@ recursivelyVisitUsers(GlobalValue &GV,
89
91
static bool alwaysInlineImpl (Module &M, bool GlobalOpt) {
90
92
std::vector<GlobalAlias*> AliasesToRemove;
91
93
94
+ bool Preserved = true ;
92
95
SmallPtrSet<Function *, 8 > FuncsToAlwaysInline;
93
96
SmallPtrSet<Function *, 8 > FuncsToNoInline;
94
97
Triple TT (M.getTargetTriple ());
@@ -98,6 +101,7 @@ static bool alwaysInlineImpl(Module &M, bool GlobalOpt) {
98
101
if (TT.getArch () == Triple::amdgcn &&
99
102
A.getLinkage () != GlobalValue::InternalLinkage)
100
103
continue ;
104
+ Preserved = false ;
101
105
A.replaceAllUsesWith (F);
102
106
AliasesToRemove.push_back (&A);
103
107
}
@@ -128,7 +132,7 @@ static bool alwaysInlineImpl(Module &M, bool GlobalOpt) {
128
132
if ((AS == AMDGPUAS::REGION_ADDRESS) ||
129
133
(AS == AMDGPUAS::LOCAL_ADDRESS &&
130
134
(!AMDGPUTargetMachine::EnableLowerModuleLDS)))
131
- recursivelyVisitUsers (GV, FuncsToAlwaysInline);
135
+ recursivelyVisitUsers (GV, FuncsToAlwaysInline, Preserved );
132
136
}
133
137
134
138
if (!AMDGPUTargetMachine::EnableFunctionCalls || StressCalls) {
@@ -153,7 +157,7 @@ static bool alwaysInlineImpl(Module &M, bool GlobalOpt) {
153
157
for (Function *F : FuncsToNoInline)
154
158
F->addFnAttr (Attribute::NoInline);
155
159
156
- return !FuncsToAlwaysInline.empty () || !FuncsToNoInline.empty ();
160
+ return !Preserved || ! FuncsToAlwaysInline.empty () || !FuncsToNoInline.empty ();
157
161
}
158
162
159
163
bool AMDGPUAlwaysInline::runOnModule (Module &M) {
@@ -166,6 +170,6 @@ ModulePass *llvm::createAMDGPUAlwaysInlinePass(bool GlobalOpt) {
166
170
167
171
PreservedAnalyses AMDGPUAlwaysInlinePass::run (Module &M,
168
172
ModuleAnalysisManager &AM) {
169
- alwaysInlineImpl (M, GlobalOpt);
170
- return PreservedAnalyses::all ();
173
+ const bool Changed = alwaysInlineImpl (M, GlobalOpt);
174
+ return Changed ? PreservedAnalyses::none () : PreservedAnalyses::all ();
171
175
}
0 commit comments