File indexing completed on 2026-05-10 08:44:40
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019 #ifndef LLVM_TRANSFORMS_IPO_DEADARGUMENTELIMINATION_H
0020 #define LLVM_TRANSFORMS_IPO_DEADARGUMENTELIMINATION_H
0021
0022 #include "llvm/ADT/SmallVector.h"
0023 #include "llvm/ADT/Twine.h"
0024 #include "llvm/IR/Function.h"
0025 #include "llvm/IR/PassManager.h"
0026 #include <map>
0027 #include <set>
0028 #include <string>
0029 #include <tuple>
0030
0031 namespace llvm {
0032
0033 class Module;
0034 class Use;
0035 class Value;
0036
0037
0038 class DeadArgumentEliminationPass
0039 : public PassInfoMixin<DeadArgumentEliminationPass> {
0040 public:
0041
0042
0043
0044 struct RetOrArg {
0045 const Function *F;
0046 unsigned Idx;
0047 bool IsArg;
0048
0049 RetOrArg(const Function *F, unsigned Idx, bool IsArg)
0050 : F(F), Idx(Idx), IsArg(IsArg) {}
0051
0052
0053 bool operator<(const RetOrArg &O) const {
0054 return std::tie(F, Idx, IsArg) < std::tie(O.F, O.Idx, O.IsArg);
0055 }
0056
0057
0058 bool operator==(const RetOrArg &O) const {
0059 return F == O.F && Idx == O.Idx && IsArg == O.IsArg;
0060 }
0061
0062 std::string getDescription() const {
0063 return (Twine(IsArg ? "Argument #" : "Return value #") + Twine(Idx) +
0064 " of function " + F->getName())
0065 .str();
0066 }
0067 };
0068
0069
0070
0071
0072
0073 enum Liveness { Live, MaybeLive };
0074
0075 DeadArgumentEliminationPass(bool ShouldHackArguments = false)
0076 : ShouldHackArguments(ShouldHackArguments) {}
0077
0078 PreservedAnalyses run(Module &M, ModuleAnalysisManager &);
0079
0080
0081 RetOrArg createRet(const Function *F, unsigned Idx) {
0082 return RetOrArg(F, Idx, false);
0083 }
0084
0085
0086 RetOrArg createArg(const Function *F, unsigned Idx) {
0087 return RetOrArg(F, Idx, true);
0088 }
0089
0090 using UseMap = std::multimap<RetOrArg, RetOrArg>;
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106 UseMap Uses;
0107
0108 using LiveSet = std::set<RetOrArg>;
0109 using LiveFuncSet = std::set<const Function *>;
0110
0111
0112 LiveSet LiveValues;
0113
0114
0115 LiveFuncSet LiveFunctions;
0116
0117 using UseVector = SmallVector<RetOrArg, 5>;
0118
0119
0120
0121 bool ShouldHackArguments = false;
0122
0123 private:
0124 Liveness markIfNotLive(RetOrArg Use, UseVector &MaybeLiveUses);
0125 Liveness surveyUse(const Use *U, UseVector &MaybeLiveUses,
0126 unsigned RetValNum = -1U);
0127 Liveness surveyUses(const Value *V, UseVector &MaybeLiveUses);
0128
0129 void surveyFunction(const Function &F);
0130 bool isLive(const RetOrArg &RA);
0131 void markValue(const RetOrArg &RA, Liveness L,
0132 const UseVector &MaybeLiveUses);
0133 void markLive(const RetOrArg &RA);
0134 void markLive(const Function &F);
0135 void propagateLiveness(const RetOrArg &RA);
0136 bool removeDeadStuffFromFunction(Function *F);
0137 bool deleteDeadVarargs(Function &F);
0138 bool removeDeadArgumentsFromCallers(Function &F);
0139 void propagateVirtMustcallLiveness(const Module &M);
0140 };
0141
0142 }
0143
0144 #endif