LLVM 20.0.0git
PGOForceFunctionAttrs.cpp
Go to the documentation of this file.
1//===----------------------------------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
12#include "llvm/IR/Module.h"
13#include "llvm/IR/PassManager.h"
15
16using namespace llvm;
17
20 if (F.isDeclaration())
21 return false;
22 // Respect existing attributes.
23 if (F.hasOptNone() || F.hasOptSize() || F.hasMinSize())
24 return false;
25 if (F.hasFnAttribute(Attribute::Cold))
26 return true;
27 if (!PSI.hasProfileSummary())
28 return false;
30 return PSI.isFunctionColdInCallGraph(&F, BFI);
31}
32
40 bool MadeChange = false;
41 for (Function &F : M) {
42 if (!shouldRunOnFunction(F, PSI, FAM))
43 continue;
44 switch (ColdType) {
46 llvm_unreachable("bailed out for default above");
47 break;
49 F.addFnAttr(Attribute::OptimizeForSize);
50 break;
52 F.addFnAttr(Attribute::MinSize);
53 break;
55 // alwaysinline is incompatible with optnone.
56 if (F.hasFnAttribute(Attribute::AlwaysInline))
57 continue;
58 F.addFnAttr(Attribute::OptimizeNone);
59 F.addFnAttr(Attribute::NoInline);
60 break;
61 }
62 MadeChange = true;
63 }
64 return MadeChange ? PreservedAnalyses::none() : PreservedAnalyses::all();
65}
#define F(x, y, z)
Definition: MD5.cpp:55
Module.h This file contains the declarations for the Module class.
static bool shouldRunOnFunction(Function &F, ProfileSummaryInfo &PSI, FunctionAnalysisManager &FAM)
FunctionAnalysisManager FAM
This header defines various interfaces for pass management in LLVM.
A container for analyses that lazily runs them and caches their results.
Definition: PassManager.h:253
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
Definition: PassManager.h:405
Analysis pass which computes BlockFrequencyInfo.
BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate IR basic block frequen...
An analysis over an "outer" IR unit that provides access to an analysis manager over an "inner" IR un...
Definition: PassManager.h:563
A Module instance is used to store all the information related to an LLVM module.
Definition: Module.h:65
A set of analyses that are preserved following a run of a transformation pass.
Definition: Analysis.h:111
static PreservedAnalyses none()
Convenience factory function for the empty preserved set.
Definition: Analysis.h:114
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Definition: Analysis.h:117
An analysis pass based on the new PM to deliver ProfileSummaryInfo.
Analysis providing profile information.
bool hasProfileSummary() const
Returns true if profile summary is available.
bool isFunctionColdInCallGraph(const FuncT *F, BFIT &BFI) const
Returns true if F contains only cold code.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM)