File indexing completed on 2026-05-10 08:44:44
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014 #ifndef LLVM_TRANSFORMS_UTILS_SIMPLIFYLIBCALLS_H
0015 #define LLVM_TRANSFORMS_UTILS_SIMPLIFYLIBCALLS_H
0016
0017 #include "llvm/ADT/STLFunctionalExtras.h"
0018 #include "llvm/Analysis/TargetLibraryInfo.h"
0019
0020 namespace llvm {
0021 class AssumptionCache;
0022 class StringRef;
0023 class Value;
0024 class CallInst;
0025 class DominatorTree;
0026 class DomConditionCache;
0027 class DataLayout;
0028 class Instruction;
0029 class IRBuilderBase;
0030 class Function;
0031 class OptimizationRemarkEmitter;
0032 class BlockFrequencyInfo;
0033 class ProfileSummaryInfo;
0034
0035
0036
0037
0038
0039
0040
0041 class FortifiedLibCallSimplifier {
0042 private:
0043 const TargetLibraryInfo *TLI;
0044 bool OnlyLowerUnknownSize;
0045
0046 public:
0047 FortifiedLibCallSimplifier(const TargetLibraryInfo *TLI,
0048 bool OnlyLowerUnknownSize = false);
0049
0050
0051
0052
0053
0054 Value *optimizeCall(CallInst *CI, IRBuilderBase &B);
0055
0056 private:
0057 Value *optimizeMemCpyChk(CallInst *CI, IRBuilderBase &B);
0058 Value *optimizeMemMoveChk(CallInst *CI, IRBuilderBase &B);
0059 Value *optimizeMemSetChk(CallInst *CI, IRBuilderBase &B);
0060
0061
0062 Value *optimizeStrpCpyChk(CallInst *CI, IRBuilderBase &B, LibFunc Func);
0063 Value *optimizeStrpNCpyChk(CallInst *CI, IRBuilderBase &B, LibFunc Func);
0064 Value *optimizeStrLenChk(CallInst *CI, IRBuilderBase &B);
0065 Value *optimizeMemPCpyChk(CallInst *CI, IRBuilderBase &B);
0066 Value *optimizeMemCCpyChk(CallInst *CI, IRBuilderBase &B);
0067 Value *optimizeSNPrintfChk(CallInst *CI, IRBuilderBase &B);
0068 Value *optimizeSPrintfChk(CallInst *CI,IRBuilderBase &B);
0069 Value *optimizeStrCatChk(CallInst *CI, IRBuilderBase &B);
0070 Value *optimizeStrLCat(CallInst *CI, IRBuilderBase &B);
0071 Value *optimizeStrNCatChk(CallInst *CI, IRBuilderBase &B);
0072 Value *optimizeStrLCpyChk(CallInst *CI, IRBuilderBase &B);
0073 Value *optimizeVSNPrintfChk(CallInst *CI, IRBuilderBase &B);
0074 Value *optimizeVSPrintfChk(CallInst *CI, IRBuilderBase &B);
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094 bool isFortifiedCallFoldable(CallInst *CI, unsigned ObjSizeOp,
0095 std::optional<unsigned> SizeOp = std::nullopt,
0096 std::optional<unsigned> StrOp = std::nullopt,
0097 std::optional<unsigned> FlagsOp = std::nullopt);
0098 };
0099
0100
0101
0102
0103 class LibCallSimplifier {
0104 private:
0105 FortifiedLibCallSimplifier FortifiedSimplifier;
0106 const DataLayout &DL;
0107 const TargetLibraryInfo *TLI;
0108 DominatorTree *DT;
0109 DomConditionCache *DC;
0110 AssumptionCache *AC;
0111 OptimizationRemarkEmitter &ORE;
0112 BlockFrequencyInfo *BFI;
0113 ProfileSummaryInfo *PSI;
0114 bool UnsafeFPShrink = false;
0115 function_ref<void(Instruction *, Value *)> Replacer;
0116 function_ref<void(Instruction *)> Eraser;
0117
0118
0119
0120
0121
0122 static void replaceAllUsesWithDefault(Instruction *I, Value *With) {
0123 I->replaceAllUsesWith(With);
0124 }
0125
0126
0127 static void eraseFromParentDefault(Instruction *I) { I->eraseFromParent(); }
0128
0129
0130 void replaceAllUsesWith(Instruction *I, Value *With);
0131
0132
0133 void eraseFromParent(Instruction *I);
0134
0135
0136 void substituteInParent(Instruction *I, Value *With) {
0137 replaceAllUsesWith(I, With);
0138 eraseFromParent(I);
0139 }
0140
0141 public:
0142 LibCallSimplifier(
0143 const DataLayout &DL, const TargetLibraryInfo *TLI, DominatorTree *DT,
0144 DomConditionCache *DC, AssumptionCache *AC,
0145 OptimizationRemarkEmitter &ORE, BlockFrequencyInfo *BFI,
0146 ProfileSummaryInfo *PSI,
0147 function_ref<void(Instruction *, Value *)> Replacer =
0148 &replaceAllUsesWithDefault,
0149 function_ref<void(Instruction *)> Eraser = &eraseFromParentDefault);
0150
0151
0152
0153
0154
0155
0156
0157
0158 Value *optimizeCall(CallInst *CI, IRBuilderBase &B);
0159
0160 private:
0161
0162 Value *optimizeStrCat(CallInst *CI, IRBuilderBase &B);
0163 Value *optimizeStrNCat(CallInst *CI, IRBuilderBase &B);
0164 Value *optimizeStrChr(CallInst *CI, IRBuilderBase &B);
0165 Value *optimizeStrRChr(CallInst *CI, IRBuilderBase &B);
0166 Value *optimizeStrCmp(CallInst *CI, IRBuilderBase &B);
0167 Value *optimizeStrNCmp(CallInst *CI, IRBuilderBase &B);
0168 Value *optimizeStrNDup(CallInst *CI, IRBuilderBase &B);
0169 Value *optimizeStrCpy(CallInst *CI, IRBuilderBase &B);
0170 Value *optimizeStpCpy(CallInst *CI, IRBuilderBase &B);
0171 Value *optimizeStrLCpy(CallInst *CI, IRBuilderBase &B);
0172 Value *optimizeStrNCpy(CallInst *CI, IRBuilderBase &B);
0173 Value *optimizeStrLen(CallInst *CI, IRBuilderBase &B);
0174 Value *optimizeStrNLen(CallInst *CI, IRBuilderBase &B);
0175 Value *optimizeStrPBrk(CallInst *CI, IRBuilderBase &B);
0176 Value *optimizeStrTo(CallInst *CI, IRBuilderBase &B);
0177 Value *optimizeStrSpn(CallInst *CI, IRBuilderBase &B);
0178 Value *optimizeStrCSpn(CallInst *CI, IRBuilderBase &B);
0179 Value *optimizeStrStr(CallInst *CI, IRBuilderBase &B);
0180 Value *optimizeMemChr(CallInst *CI, IRBuilderBase &B);
0181 Value *optimizeMemRChr(CallInst *CI, IRBuilderBase &B);
0182 Value *optimizeMemCmp(CallInst *CI, IRBuilderBase &B);
0183 Value *optimizeBCmp(CallInst *CI, IRBuilderBase &B);
0184 Value *optimizeMemCmpBCmpCommon(CallInst *CI, IRBuilderBase &B);
0185 Value *optimizeMemCCpy(CallInst *CI, IRBuilderBase &B);
0186 Value *optimizeMemPCpy(CallInst *CI, IRBuilderBase &B);
0187 Value *optimizeMemCpy(CallInst *CI, IRBuilderBase &B);
0188 Value *optimizeMemMove(CallInst *CI, IRBuilderBase &B);
0189 Value *optimizeMemSet(CallInst *CI, IRBuilderBase &B);
0190 Value *optimizeRealloc(CallInst *CI, IRBuilderBase &B);
0191 Value *optimizeNew(CallInst *CI, IRBuilderBase &B, LibFunc &Func);
0192 Value *optimizeWcslen(CallInst *CI, IRBuilderBase &B);
0193 Value *optimizeBCopy(CallInst *CI, IRBuilderBase &B);
0194
0195
0196 Value *optimizeStringNCpy(CallInst *CI, bool RetEnd, IRBuilderBase &B);
0197
0198 Value *optimizeStringMemoryLibCall(CallInst *CI, IRBuilderBase &B);
0199
0200
0201 Value *optimizeCAbs(CallInst *CI, IRBuilderBase &B);
0202 Value *optimizePow(CallInst *CI, IRBuilderBase &B);
0203 Value *replacePowWithExp(CallInst *Pow, IRBuilderBase &B);
0204 Value *replacePowWithSqrt(CallInst *Pow, IRBuilderBase &B);
0205 Value *optimizeExp2(CallInst *CI, IRBuilderBase &B);
0206 Value *optimizeFMinFMax(CallInst *CI, IRBuilderBase &B);
0207 Value *optimizeLog(CallInst *CI, IRBuilderBase &B);
0208 Value *optimizeSqrt(CallInst *CI, IRBuilderBase &B);
0209 Value *optimizeFMod(CallInst *CI, IRBuilderBase &B);
0210 Value *mergeSqrtToExp(CallInst *CI, IRBuilderBase &B);
0211 Value *optimizeSinCosPi(CallInst *CI, bool IsSin, IRBuilderBase &B);
0212 Value *optimizeTrigInversionPairs(CallInst *CI, IRBuilderBase &B);
0213 Value *optimizeSymmetric(CallInst *CI, LibFunc Func, IRBuilderBase &B);
0214 Value *optimizeRemquo(CallInst *CI, IRBuilderBase &B);
0215 Value *optimizeFdim(CallInst *CI, IRBuilderBase &B);
0216
0217 Value *optimizeFloatingPointLibCall(CallInst *CI, LibFunc Func,
0218 IRBuilderBase &B);
0219
0220
0221 Value *optimizeFFS(CallInst *CI, IRBuilderBase &B);
0222 Value *optimizeFls(CallInst *CI, IRBuilderBase &B);
0223 Value *optimizeAbs(CallInst *CI, IRBuilderBase &B);
0224 Value *optimizeIsDigit(CallInst *CI, IRBuilderBase &B);
0225 Value *optimizeIsAscii(CallInst *CI, IRBuilderBase &B);
0226 Value *optimizeToAscii(CallInst *CI, IRBuilderBase &B);
0227 Value *optimizeAtoi(CallInst *CI, IRBuilderBase &B);
0228 Value *optimizeStrToInt(CallInst *CI, IRBuilderBase &B, bool AsSigned);
0229
0230
0231 Value *optimizeErrorReporting(CallInst *CI, IRBuilderBase &B,
0232 int StreamArg = -1);
0233 Value *optimizePrintF(CallInst *CI, IRBuilderBase &B);
0234 Value *optimizeSPrintF(CallInst *CI, IRBuilderBase &B);
0235 Value *optimizeSnPrintF(CallInst *CI, IRBuilderBase &B);
0236 Value *optimizeFPrintF(CallInst *CI, IRBuilderBase &B);
0237 Value *optimizeFWrite(CallInst *CI, IRBuilderBase &B);
0238 Value *optimizeFPuts(CallInst *CI, IRBuilderBase &B);
0239 Value *optimizePuts(CallInst *CI, IRBuilderBase &B);
0240
0241
0242 Value* emitSnPrintfMemCpy(CallInst *CI, Value *StrArg, StringRef Str,
0243 uint64_t N, IRBuilderBase &B);
0244 Value *emitStrLenMemCpy(Value *Src, Value *Dst, uint64_t Len,
0245 IRBuilderBase &B);
0246 void classifyArgUse(Value *Val, Function *F, bool IsFloat,
0247 SmallVectorImpl<CallInst *> &SinCalls,
0248 SmallVectorImpl<CallInst *> &CosCalls,
0249 SmallVectorImpl<CallInst *> &SinCosCalls);
0250 Value *optimizePrintFString(CallInst *CI, IRBuilderBase &B);
0251 Value *optimizeSPrintFString(CallInst *CI, IRBuilderBase &B);
0252 Value *optimizeSnPrintFString(CallInst *CI, IRBuilderBase &B);
0253 Value *optimizeFPrintFString(CallInst *CI, IRBuilderBase &B);
0254
0255
0256 Value *optimizeExit(CallInst *CI);
0257
0258
0259
0260 bool hasFloatVersion(const Module *M, StringRef FuncName);
0261
0262
0263 Value *optimizeStringLength(CallInst *CI, IRBuilderBase &B, unsigned CharSize,
0264 Value *Bound = nullptr);
0265 };
0266 }
0267
0268 #endif