CodeGen: Add LibcallLoweringInfo analysis pass (#168622)

The libcall lowering decisions should be program dependent,
depending on the current module's RuntimeLibcallInfo. We need
another related analysis derived from that plus the current
function's subtarget to provide concrete lowering decisions.

This takes on a somewhat unusual form. It's a Module analysis,
with a lookup keyed on the subtarget. This is a separate module
analysis from RuntimeLibraryAnalysis to avoid that depending on
codegen. It's not a function pass to avoid depending on any
particular function, to avoid repeated subtarget map lookups in
most of the use passes, and to avoid any recomputation in the
common case of one subtarget (and keeps it reusable across
repeated compilations).

This also switches ExpandFp and PreISelIntrinsicLowering as
a sample function and module pass. Note this is not yet wired
up to SelectionDAG, which is still using the LibcallLoweringInfo
constructed inside of TargetLowering.
This commit is contained in:
Matt Arsenault
2025-12-03 16:00:12 -05:00
committed by GitHub
parent 5cbd294ca2
commit 04c81a9973
37 changed files with 331 additions and 66 deletions

View File

@@ -19,6 +19,7 @@
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/Analysis/GlobalsModRef.h"
#include "llvm/Analysis/RuntimeLibcallInfo.h"
#include "llvm/Analysis/TargetLibraryInfo.h"
#include "llvm/Analysis/TargetTransformInfo.h"
#include "llvm/Bitcode/BitcodeReader.h"
@@ -655,6 +656,11 @@ bool EmitAssemblyHelper::AddEmitPasses(legacy::PassManager &CodeGenPasses,
llvm::driver::createTLII(TargetTriple, CodeGenOpts.getVecLib()));
CodeGenPasses.add(new TargetLibraryInfoWrapperPass(*TLII));
const llvm::TargetOptions &Options = TM->Options;
CodeGenPasses.add(new RuntimeLibraryInfoWrapper(
TargetTriple, Options.ExceptionModel, Options.FloatABIType,
Options.EABIVersion, Options.MCOptions.ABIName, Options.VecLib));
// Normal mode, emit a .s or .o file by running the code generator. Note,
// this also adds codegenerator level optimization passes.
CodeGenFileType CGFT = getCodeGenFileType(Action);

View File

@@ -22,7 +22,12 @@ public:
RuntimeLibraryAnalysis() = default;
RuntimeLibraryAnalysis(RTLIB::RuntimeLibcallsInfo &&BaselineInfoImpl)
: LibcallsInfo(std::move(BaselineInfoImpl)) {}
explicit RuntimeLibraryAnalysis(const Triple &T) : LibcallsInfo(T) {}
RuntimeLibraryAnalysis(
const Triple &TT,
ExceptionHandling ExceptionModel = ExceptionHandling::None,
FloatABI::ABIType FloatABI = FloatABI::Default,
EABI EABIVersion = EABI::Default, StringRef ABIName = "",
VectorLibrary VecLib = VectorLibrary::NoLibrary);
LLVM_ABI RTLIB::RuntimeLibcallsInfo run(const Module &M,
ModuleAnalysisManager &);
@@ -41,12 +46,19 @@ class LLVM_ABI RuntimeLibraryInfoWrapper : public ImmutablePass {
public:
static char ID;
RuntimeLibraryInfoWrapper();
explicit RuntimeLibraryInfoWrapper(const Triple &T);
explicit RuntimeLibraryInfoWrapper(const RTLIB::RuntimeLibcallsInfo &RTLCI);
RuntimeLibraryInfoWrapper(
const Triple &TT,
ExceptionHandling ExceptionModel = ExceptionHandling::None,
FloatABI::ABIType FloatABI = FloatABI::Default,
EABI EABIVersion = EABI::Default, StringRef ABIName = "",
VectorLibrary VecLib = VectorLibrary::NoLibrary);
const RTLIB::RuntimeLibcallsInfo &getRTLCI(const Module &M) {
ModuleAnalysisManager DummyMAM;
RTLCI = RTLA.run(M, DummyMAM);
if (!RTLCI) {
ModuleAnalysisManager DummyMAM;
RTLCI = RTLA.run(M, DummyMAM);
}
return *RTLCI;
}

View File

@@ -9,12 +9,16 @@
#ifndef LLVM_CODEGEN_LIBCALLLOWERINGINFO_H
#define LLVM_CODEGEN_LIBCALLLOWERINGINFO_H
#include "llvm/ADT/DenseMap.h"
#include "llvm/IR/RuntimeLibcalls.h"
#include "llvm/Pass.h"
namespace llvm {
class TargetSubtargetInfo;
class TargetMachine;
/// Tracks which library functions to use for a particular subtarget.
class LibcallLoweringInfo {
private:
const RTLIB::RuntimeLibcallsInfo &RTLCI;
@@ -73,6 +77,70 @@ public:
}
};
/// Record a mapping from subtarget to LibcallLoweringInfo.
class LibcallLoweringModuleAnalysisResult {
private:
using LibcallLoweringMap =
DenseMap<const TargetSubtargetInfo *, LibcallLoweringInfo>;
mutable LibcallLoweringMap LoweringMap;
const RTLIB::RuntimeLibcallsInfo *RTLCI = nullptr;
public:
LibcallLoweringModuleAnalysisResult() = default;
LibcallLoweringModuleAnalysisResult(RTLIB::RuntimeLibcallsInfo &RTLCI)
: RTLCI(&RTLCI) {}
void init(const RTLIB::RuntimeLibcallsInfo *RT) { RTLCI = RT; }
void clear() {
RTLCI = nullptr;
LoweringMap.clear();
}
LLVM_ABI bool invalidate(Module &, const PreservedAnalyses &,
ModuleAnalysisManager::Invalidator &);
const LibcallLoweringInfo &
getLibcallLowering(const TargetSubtargetInfo &Subtarget) const {
return LoweringMap.try_emplace(&Subtarget, *RTLCI, Subtarget).first->second;
}
};
class LibcallLoweringModuleAnalysis
: public AnalysisInfoMixin<LibcallLoweringModuleAnalysis> {
private:
friend AnalysisInfoMixin<LibcallLoweringModuleAnalysis>;
static AnalysisKey Key;
LibcallLoweringModuleAnalysisResult LibcallLoweringMap;
public:
using Result = LibcallLoweringModuleAnalysisResult;
LLVM_ABI Result run(Module &M, ModuleAnalysisManager &);
};
class LLVM_ABI LibcallLoweringInfoWrapper : public ImmutablePass {
LibcallLoweringModuleAnalysisResult Result;
public:
static char ID;
LibcallLoweringInfoWrapper();
const LibcallLoweringInfo &
getLibcallLowering(const TargetSubtargetInfo &Subtarget) const {
return Result.getLibcallLowering(Subtarget);
}
const LibcallLoweringModuleAnalysisResult &getResult() const {
return Result;
}
bool doInitialization(Module &M) override;
void getAnalysisUsage(AnalysisUsage &AU) const override;
void releaseMemory() override;
};
} // end namespace llvm
#endif // LLVM_CODEGEN_LIBCALLLOWERINGINFO_H

View File

@@ -133,6 +133,7 @@ LLVM_ABI void initializeGlobalMergeFuncPassWrapperPass(PassRegistry &);
LLVM_ABI void initializeGlobalMergePass(PassRegistry &);
LLVM_ABI void initializeGlobalsAAWrapperPassPass(PassRegistry &);
LLVM_ABI void initializeHardwareLoopsLegacyPass(PassRegistry &);
LLVM_ABI void initializeLibcallLoweringInfoWrapperPass(PassRegistry &);
LLVM_ABI void initializeMIRProfileLoaderPassPass(PassRegistry &);
LLVM_ABI void initializeIRSimilarityIdentifierWrapperPassPass(PassRegistry &);
LLVM_ABI void initializeIRTranslatorPass(PassRegistry &);

View File

@@ -13,6 +13,15 @@ using namespace llvm;
AnalysisKey RuntimeLibraryAnalysis::Key;
RuntimeLibraryAnalysis::RuntimeLibraryAnalysis(const Triple &TT,
ExceptionHandling ExceptionModel,
FloatABI::ABIType FloatABI,
EABI EABIVersion,
StringRef ABIName,
VectorLibrary VecLib)
: LibcallsInfo(std::in_place, TT, ExceptionModel, FloatABI, EABIVersion,
ABIName, VecLib) {}
RTLIB::RuntimeLibcallsInfo
RuntimeLibraryAnalysis::run(const Module &M, ModuleAnalysisManager &) {
if (!LibcallsInfo)
@@ -26,6 +35,13 @@ INITIALIZE_PASS(RuntimeLibraryInfoWrapper, "runtime-library-info",
RuntimeLibraryInfoWrapper::RuntimeLibraryInfoWrapper()
: ImmutablePass(ID), RTLA(RTLIB::RuntimeLibcallsInfo(Triple())) {}
RuntimeLibraryInfoWrapper::RuntimeLibraryInfoWrapper(
const Triple &TT, ExceptionHandling ExceptionModel,
FloatABI::ABIType FloatABI, EABI EABIVersion, StringRef ABIName,
VectorLibrary VecLib)
: ImmutablePass(ID), RTLCI(std::in_place, TT, ExceptionModel, FloatABI,
EABIVersion, ABIName, VecLib) {}
char RuntimeLibraryInfoWrapper::ID = 0;
ModulePass *llvm::createRuntimeLibraryInfoWrapperPass() {

View File

@@ -57,6 +57,7 @@ void llvm::initializeCodeGen(PassRegistry &Registry) {
initializeInterleavedLoadCombinePass(Registry);
initializeInterleavedAccessPass(Registry);
initializeJMCInstrumenterPass(Registry);
initializeLibcallLoweringInfoWrapperPass(Registry);
initializeLiveDebugValuesLegacyPass(Registry);
initializeLiveDebugVariablesWrapperLegacyPass(Registry);
initializeLiveIntervalsWrapperPassPass(Registry);

View File

@@ -975,11 +975,12 @@ static RTLIB::Libcall fremToLibcall(Type *Ty) {
/* Return true if, according to \p LibInfo, the target either directly
supports the frem instruction for the \p Ty, has a custom lowering,
or uses a libcall. */
static bool targetSupportsFrem(const TargetLowering &TLI, Type *Ty) {
static bool targetSupportsFrem(const TargetLowering &TLI,
const LibcallLoweringInfo &Libcalls, Type *Ty) {
if (!TLI.isOperationExpand(ISD::FREM, EVT::getEVT(Ty)))
return true;
return TLI.getLibcallName(fremToLibcall(Ty->getScalarType()));
return Libcalls.getLibcallName(fremToLibcall(Ty->getScalarType()));
}
static void addToWorklist(Instruction &I,
@@ -991,7 +992,7 @@ static void addToWorklist(Instruction &I,
}
static bool runImpl(Function &F, const TargetLowering &TLI,
AssumptionCache *AC) {
const LibcallLoweringInfo &Libcalls, AssumptionCache *AC) {
SmallVector<Instruction *, 4> Worklist;
unsigned MaxLegalFpConvertBitWidth =
@@ -1010,7 +1011,7 @@ static bool runImpl(Function &F, const TargetLowering &TLI,
switch (I.getOpcode()) {
case Instruction::FRem:
return !targetSupportsFrem(TLI, Ty) &&
return !targetSupportsFrem(TLI, Libcalls, Ty) &&
FRemExpander::canExpandType(Ty->getScalarType());
case Instruction::FPToUI:
@@ -1090,20 +1091,27 @@ public:
bool runOnFunction(Function &F) override {
auto *TM = &getAnalysis<TargetPassConfig>().getTM<TargetMachine>();
auto *TLI = TM->getSubtargetImpl(F)->getTargetLowering();
const TargetSubtargetInfo *Subtarget = TM->getSubtargetImpl(F);
auto *TLI = Subtarget->getTargetLowering();
AssumptionCache *AC = nullptr;
const LibcallLoweringInfo &Libcalls =
getAnalysis<LibcallLoweringInfoWrapper>().getLibcallLowering(
*Subtarget);
if (OptLevel != CodeGenOptLevel::None && !F.hasOptNone())
AC = &getAnalysis<AssumptionCacheTracker>().getAssumptionCache(F);
return runImpl(F, *TLI, AC);
return runImpl(F, *TLI, Libcalls, AC);
}
void getAnalysisUsage(AnalysisUsage &AU) const override {
AU.addRequired<LibcallLoweringInfoWrapper>();
AU.addRequired<TargetPassConfig>();
if (OptLevel != CodeGenOptLevel::None)
AU.addRequired<AssumptionCacheTracker>();
AU.addPreserved<AAResultsWrapperPass>();
AU.addPreserved<GlobalsAAWrapperPass>();
AU.addRequired<LibcallLoweringInfoWrapper>();
}
};
} // namespace
@@ -1126,13 +1134,29 @@ PreservedAnalyses ExpandFpPass::run(Function &F, FunctionAnalysisManager &FAM) {
AssumptionCache *AC = nullptr;
if (OptLevel != CodeGenOptLevel::None)
AC = &FAM.getResult<AssumptionAnalysis>(F);
return runImpl(F, TLI, AC) ? PreservedAnalyses::none()
: PreservedAnalyses::all();
auto &MAMProxy = FAM.getResult<ModuleAnalysisManagerFunctionProxy>(F);
const LibcallLoweringModuleAnalysisResult *LibcallLowering =
MAMProxy.getCachedResult<LibcallLoweringModuleAnalysis>(*F.getParent());
if (!LibcallLowering) {
F.getContext().emitError("'" + LibcallLoweringModuleAnalysis::name() +
"' analysis required");
return PreservedAnalyses::all();
}
const LibcallLoweringInfo &Libcalls =
LibcallLowering->getLibcallLowering(*STI);
return runImpl(F, TLI, Libcalls, AC) ? PreservedAnalyses::none()
: PreservedAnalyses::all();
}
char ExpandFpLegacyPass::ID = 0;
INITIALIZE_PASS_BEGIN(ExpandFpLegacyPass, "expand-fp",
"Expand certain fp instructions", false, false)
INITIALIZE_PASS_DEPENDENCY(LibcallLoweringInfoWrapper)
INITIALIZE_PASS_END(ExpandFpLegacyPass, "expand-fp", "Expand fp", false, false)
FunctionPass *llvm::createExpandFpPass(CodeGenOptLevel OptLevel) {

View File

@@ -7,7 +7,10 @@
//===----------------------------------------------------------------------===//
#include "llvm/CodeGen/LibcallLoweringInfo.h"
#include "llvm/Analysis/RuntimeLibcallInfo.h"
#include "llvm/CodeGen/TargetSubtargetInfo.h"
#include "llvm/InitializePasses.h"
#include "llvm/Target/TargetMachine.h"
using namespace llvm;
@@ -28,3 +31,42 @@ LibcallLoweringInfo::LibcallLoweringInfo(
Subtarget.initLibcallLoweringInfo(*this);
}
AnalysisKey LibcallLoweringModuleAnalysis::Key;
bool LibcallLoweringModuleAnalysisResult::invalidate(
Module &, const PreservedAnalyses &PA,
ModuleAnalysisManager::Invalidator &) {
// Passes that change the runtime libcall set must explicitly invalidate this
// pass.
auto PAC = PA.getChecker<LibcallLoweringModuleAnalysis>();
return !PAC.preservedWhenStateless();
}
LibcallLoweringModuleAnalysisResult
LibcallLoweringModuleAnalysis::run(Module &M, ModuleAnalysisManager &MAM) {
LibcallLoweringMap.init(&MAM.getResult<RuntimeLibraryAnalysis>(M));
return LibcallLoweringMap;
}
INITIALIZE_PASS_BEGIN(LibcallLoweringInfoWrapper, "libcall-lowering-info",
"Library Function Lowering Analysis", false, true)
INITIALIZE_PASS_DEPENDENCY(RuntimeLibraryInfoWrapper)
INITIALIZE_PASS_END(LibcallLoweringInfoWrapper, "libcall-lowering-info",
"Library Function Lowering Analysis", false, true)
char LibcallLoweringInfoWrapper::ID = 0;
LibcallLoweringInfoWrapper::LibcallLoweringInfoWrapper() : ImmutablePass(ID) {}
bool LibcallLoweringInfoWrapper::doInitialization(Module &M) {
Result.init(&getAnalysis<RuntimeLibraryInfoWrapper>().getRTLCI(M));
return false;
}
void LibcallLoweringInfoWrapper::getAnalysisUsage(AnalysisUsage &AU) const {
AU.addRequired<RuntimeLibraryInfoWrapper>();
AU.setPreservesAll();
}
void LibcallLoweringInfoWrapper::releaseMemory() { Result.clear(); }

View File

@@ -17,6 +17,7 @@
#include "llvm/Analysis/TargetLibraryInfo.h"
#include "llvm/Analysis/TargetTransformInfo.h"
#include "llvm/CodeGen/ExpandVectorPredication.h"
#include "llvm/CodeGen/LibcallLoweringInfo.h"
#include "llvm/CodeGen/Passes.h"
#include "llvm/CodeGen/TargetLowering.h"
#include "llvm/CodeGen/TargetPassConfig.h"
@@ -51,6 +52,7 @@ namespace {
struct PreISelIntrinsicLowering {
const TargetMachine *TM;
const LibcallLoweringModuleAnalysisResult &ModuleLibcalls;
const function_ref<TargetTransformInfo &(Function &)> LookupTTI;
const function_ref<TargetLibraryInfo &(Function &)> LookupTLI;
@@ -61,11 +63,13 @@ struct PreISelIntrinsicLowering {
explicit PreISelIntrinsicLowering(
const TargetMachine *TM_,
const LibcallLoweringModuleAnalysisResult &ModuleLibcalls_,
function_ref<TargetTransformInfo &(Function &)> LookupTTI_,
function_ref<TargetLibraryInfo &(Function &)> LookupTLI_,
bool UseMemIntrinsicLibFunc_ = true)
: TM(TM_), LookupTTI(LookupTTI_), LookupTLI(LookupTLI_),
UseMemIntrinsicLibFunc(UseMemIntrinsicLibFunc_) {}
: TM(TM_), ModuleLibcalls(ModuleLibcalls_), LookupTTI(LookupTTI_),
LookupTLI(LookupTLI_), UseMemIntrinsicLibFunc(UseMemIntrinsicLibFunc_) {
}
static bool shouldExpandMemIntrinsicWithSize(Value *Size,
const TargetTransformInfo &TTI);
@@ -230,21 +234,26 @@ bool PreISelIntrinsicLowering::shouldExpandMemIntrinsicWithSize(
return SizeVal > Threshold || Threshold == 0;
}
static bool canEmitLibcall(const TargetMachine *TM, Function *F,
RTLIB::Libcall LC) {
static bool
canEmitLibcall(const LibcallLoweringModuleAnalysisResult &ModuleLowering,
const TargetMachine *TM, Function *F, RTLIB::Libcall LC) {
// TODO: Should this consider the address space of the memcpy?
if (!TM)
return true;
const TargetLowering *TLI = TM->getSubtargetImpl(*F)->getTargetLowering();
return TLI->getLibcallName(LC) != nullptr;
const LibcallLoweringInfo &Lowering =
ModuleLowering.getLibcallLowering(*TM->getSubtargetImpl(*F));
return Lowering.getLibcallImpl(LC) != RTLIB::Unsupported;
}
static bool canEmitMemcpy(const TargetMachine *TM, Function *F) {
static bool
canEmitMemcpy(const LibcallLoweringModuleAnalysisResult &ModuleLowering,
const TargetMachine *TM, Function *F) {
// TODO: Should this consider the address space of the memcpy?
if (!TM)
return true;
const TargetLowering *TLI = TM->getSubtargetImpl(*F)->getTargetLowering();
return TLI->getMemcpyImpl() != RTLIB::Unsupported;
const LibcallLoweringInfo &Lowering =
ModuleLowering.getLibcallLowering(*TM->getSubtargetImpl(*F));
return Lowering.getMemcpyImpl() != RTLIB::Unsupported;
}
// Return a value appropriate for use with the memset_pattern16 libcall, if
@@ -317,7 +326,8 @@ bool PreISelIntrinsicLowering::expandMemIntrinsicUses(
Function *ParentFunc = Memcpy->getFunction();
const TargetTransformInfo &TTI = LookupTTI(*ParentFunc);
if (shouldExpandMemIntrinsicWithSize(Memcpy->getLength(), TTI)) {
if (UseMemIntrinsicLibFunc && canEmitMemcpy(TM, ParentFunc))
if (UseMemIntrinsicLibFunc &&
canEmitMemcpy(ModuleLibcalls, TM, ParentFunc))
break;
// TODO: For optsize, emit the loop into a separate function
@@ -349,7 +359,7 @@ bool PreISelIntrinsicLowering::expandMemIntrinsicUses(
const TargetTransformInfo &TTI = LookupTTI(*ParentFunc);
if (shouldExpandMemIntrinsicWithSize(Memmove->getLength(), TTI)) {
if (UseMemIntrinsicLibFunc &&
canEmitLibcall(TM, ParentFunc, RTLIB::MEMMOVE))
canEmitLibcall(ModuleLibcalls, TM, ParentFunc, RTLIB::MEMMOVE))
break;
if (expandMemMoveAsLoop(Memmove, TTI)) {
@@ -366,7 +376,7 @@ bool PreISelIntrinsicLowering::expandMemIntrinsicUses(
const TargetTransformInfo &TTI = LookupTTI(*ParentFunc);
if (shouldExpandMemIntrinsicWithSize(Memset->getLength(), TTI)) {
if (UseMemIntrinsicLibFunc &&
canEmitLibcall(TM, ParentFunc, RTLIB::MEMSET))
canEmitLibcall(ModuleLibcalls, TM, ParentFunc, RTLIB::MEMSET))
break;
expandMemSetAsLoop(Memset);
@@ -619,10 +629,14 @@ public:
void getAnalysisUsage(AnalysisUsage &AU) const override {
AU.addRequired<TargetTransformInfoWrapperPass>();
AU.addRequired<TargetLibraryInfoWrapperPass>();
AU.addRequired<LibcallLoweringInfoWrapper>();
AU.addRequired<TargetPassConfig>();
}
bool runOnModule(Module &M) override {
const LibcallLoweringModuleAnalysisResult &ModuleLibcalls =
getAnalysis<LibcallLoweringInfoWrapper>().getResult();
auto LookupTTI = [this](Function &F) -> TargetTransformInfo & {
return this->getAnalysis<TargetTransformInfoWrapperPass>().getTTI(F);
};
@@ -631,7 +645,7 @@ public:
};
const auto *TM = &getAnalysis<TargetPassConfig>().getTM<TargetMachine>();
PreISelIntrinsicLowering Lowering(TM, LookupTTI, LookupTLI);
PreISelIntrinsicLowering Lowering(TM, ModuleLibcalls, LookupTTI, LookupTLI);
return Lowering.lowerIntrinsics(M);
}
};
@@ -643,6 +657,8 @@ char PreISelIntrinsicLoweringLegacyPass::ID;
INITIALIZE_PASS_BEGIN(PreISelIntrinsicLoweringLegacyPass,
"pre-isel-intrinsic-lowering",
"Pre-ISel Intrinsic Lowering", false, false)
INITIALIZE_PASS_DEPENDENCY(LibcallLoweringInfoWrapper)
INITIALIZE_PASS_DEPENDENCY(RuntimeLibraryInfoWrapper)
INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass)
INITIALIZE_PASS_DEPENDENCY(TargetPassConfig)
INITIALIZE_PASS_DEPENDENCY(TargetTransformInfoWrapperPass)
@@ -654,9 +670,12 @@ ModulePass *llvm::createPreISelIntrinsicLoweringPass() {
return new PreISelIntrinsicLoweringLegacyPass();
}
PreservedAnalyses PreISelIntrinsicLoweringPass::run(Module &M,
ModuleAnalysisManager &AM) {
auto &FAM = AM.getResult<FunctionAnalysisManagerModuleProxy>(M).getManager();
PreservedAnalyses
PreISelIntrinsicLoweringPass::run(Module &M, ModuleAnalysisManager &MAM) {
const LibcallLoweringModuleAnalysisResult &LibcallLowering =
MAM.getResult<LibcallLoweringModuleAnalysis>(M);
auto &FAM = MAM.getResult<FunctionAnalysisManagerModuleProxy>(M).getManager();
auto LookupTTI = [&FAM](Function &F) -> TargetTransformInfo & {
return FAM.getResult<TargetIRAnalysis>(F);
@@ -665,7 +684,7 @@ PreservedAnalyses PreISelIntrinsicLoweringPass::run(Module &M,
return FAM.getResult<TargetLibraryAnalysis>(F);
};
PreISelIntrinsicLowering Lowering(TM, LookupTTI, LookupTLI);
PreISelIntrinsicLowering Lowering(TM, LibcallLowering, LookupTTI, LookupTLI);
if (!Lowering.lowerIntrinsics(M))
return PreservedAnalyses::all();
else

View File

@@ -17,6 +17,7 @@
#include "llvm/Analysis/AliasAnalysis.h"
#include "llvm/Analysis/CGSCCPassManager.h"
#include "llvm/Analysis/ModuleSummaryAnalysis.h"
#include "llvm/Analysis/RuntimeLibcallInfo.h"
#include "llvm/Analysis/TargetLibraryInfo.h"
#include "llvm/Bitcode/BitcodeReader.h"
#include "llvm/Bitcode/BitcodeWriter.h"
@@ -446,6 +447,11 @@ static void codegen(const Config &Conf, TargetMachine *TM,
legacy::PassManager CodeGenPasses;
TargetLibraryInfoImpl TLII(Mod.getTargetTriple());
CodeGenPasses.add(new TargetLibraryInfoWrapperPass(TLII));
CodeGenPasses.add(new RuntimeLibraryInfoWrapper(
Mod.getTargetTriple(), TM->Options.ExceptionModel,
TM->Options.FloatABIType, TM->Options.EABIVersion,
TM->Options.MCOptions.ABIName, TM->Options.VecLib));
// No need to make index available if the module is empty.
// In theory these passes should not use the index for an empty
// module, however, this guards against doing any unnecessary summary-based

View File

@@ -30,6 +30,7 @@ MODULE_ANALYSIS("ir2vec-vocab", IR2VecVocabAnalysis())
MODULE_ANALYSIS("ir-similarity", IRSimilarityAnalysis())
MODULE_ANALYSIS("last-run-tracking", LastRunTrackingAnalysis())
MODULE_ANALYSIS("lcg", LazyCallGraphAnalysis())
MODULE_ANALYSIS("libcall-lowering-info", LibcallLoweringModuleAnalysis())
MODULE_ANALYSIS("module-summary", ModuleSummaryIndexAnalysis())
MODULE_ANALYSIS("no-op-module", NoOpModuleAnalysis())
MODULE_ANALYSIS("pass-instrumentation", PassInstrumentationAnalysis(PIC))

View File

@@ -5,9 +5,11 @@
; CHECK-LABEL: Pass Arguments:
; CHECK-NEXT: Target Library Information
; CHECK-NEXT: Runtime Library Function Analysis
; CHECK-NEXT: Target Pass Configuration
; CHECK-NEXT: Machine Module Information
; CHECK-NEXT: Target Transform Information
; CHECK-NEXT: Library Function Lowering Analysis
; CHECK-NEXT: Create Garbage Collector Module Metadata
; CHECK-NEXT: Profile summary info
; CHECK-NEXT: Assumption Cache Tracker

View File

@@ -5,9 +5,11 @@
; CHECK-LABEL: Pass Arguments:
; CHECK-NEXT: Target Library Information
; CHECK-NEXT: Runtime Library Function Analysis
; CHECK-NEXT: Target Pass Configuration
; CHECK-NEXT: Machine Module Information
; CHECK-NEXT: Target Transform Information
; CHECK-NEXT: Library Function Lowering Analysis
; CHECK-NEXT: Assumption Cache Tracker
; CHECK-NEXT: Profile summary info
; CHECK-NEXT: Type-Based Alias Analysis

View File

@@ -14,9 +14,11 @@
; REQUIRES: asserts
; GCN-O0:Target Library Information
; GCN-O0-NEXT:Runtime Library Function Analysis
; GCN-O0-NEXT:Target Pass Configuration
; GCN-O0-NEXT:Machine Module Information
; GCN-O0-NEXT:Target Transform Information
; GCN-O0-NEXT:Library Function Lowering Analysis
; GCN-O0-NEXT:Assumption Cache Tracker
; GCN-O0-NEXT:Profile summary info
; GCN-O0-NEXT:Argument Register Usage Information Storage
@@ -161,9 +163,11 @@
; GCN-O0-NEXT: Free MachineFunction
; GCN-O1:Target Library Information
; GCN-O1-NEXT:Runtime Library Function Analysis
; GCN-O1-NEXT:Target Pass Configuration
; GCN-O1-NEXT:Machine Module Information
; GCN-O1-NEXT:Target Transform Information
; GCN-O1-NEXT:Library Function Lowering Analysis
; GCN-O1-NEXT:Assumption Cache Tracker
; GCN-O1-NEXT:Profile summary info
; GCN-O1-NEXT:AMDGPU Address space based Alias Analysis
@@ -453,9 +457,11 @@
; GCN-O1-NEXT: Free MachineFunction
; GCN-O1-OPTS:Target Library Information
; GCN-O1-OPTS-NEXT:Runtime Library Function Analysis
; GCN-O1-OPTS-NEXT:Target Pass Configuration
; GCN-O1-OPTS-NEXT:Machine Module Information
; GCN-O1-OPTS-NEXT:Target Transform Information
; GCN-O1-OPTS-NEXT:Library Function Lowering Analysis
; GCN-O1-OPTS-NEXT:Assumption Cache Tracker
; GCN-O1-OPTS-NEXT:Profile summary info
; GCN-O1-OPTS-NEXT:AMDGPU Address space based Alias Analysis
@@ -773,9 +779,11 @@
; GCN-O1-OPTS-NEXT: Free MachineFunction
; GCN-O2:Target Library Information
; GCN-O2-NEXT:Runtime Library Function Analysis
; GCN-O2-NEXT:Target Pass Configuration
; GCN-O2-NEXT:Machine Module Information
; GCN-O2-NEXT:Target Transform Information
; GCN-O2-NEXT:Library Function Lowering Analysis
; GCN-O2-NEXT:Assumption Cache Tracker
; GCN-O2-NEXT:Profile summary info
; GCN-O2-NEXT:AMDGPU Address space based Alias Analysis
@@ -1098,9 +1106,11 @@
; GCN-O2-NEXT: Free MachineFunction
; GCN-O3:Target Library Information
; GCN-O3-NEXT:Runtime Library Function Analysis
; GCN-O3-NEXT:Target Pass Configuration
; GCN-O3-NEXT:Machine Module Information
; GCN-O3-NEXT:Target Transform Information
; GCN-O3-NEXT:Library Function Lowering Analysis
; GCN-O3-NEXT:Assumption Cache Tracker
; GCN-O3-NEXT:Profile summary info
; GCN-O3-NEXT:AMDGPU Address space based Alias Analysis

View File

@@ -9,9 +9,11 @@
; CHECK-LABEL: Pass Arguments:
; CHECK-NEXT: Target Library Information
; CHECK-NEXT: Runtime Library Function Analysis
; CHECK-NEXT: Target Pass Configuration
; CHECK-NEXT: Machine Module Information
; CHECK-NEXT: Target Transform Information
; CHECK-NEXT: Library Function Lowering Analysis
; CHECK-NEXT: Create Garbage Collector Module Metadata
; CHECK-NEXT: Assumption Cache Tracker
; CHECK-NEXT: Profile summary info

View File

@@ -17,9 +17,11 @@
; LAXX-LABEL: Pass Arguments:
; LAXX-NEXT: Target Library Information
; LAXX-NEXT: Runtime Library Function Analysis
; LAXX-NEXT: Target Pass Configuration
; LAXX-NEXT: Machine Module Information
; LAXX-NEXT: Target Transform Information
; LAXX-NEXT: Library Function Lowering Analysis
; LAXX-NEXT: Assumption Cache Tracker
; LAXX-NEXT: Type-Based Alias Analysis
; LAXX-NEXT: Scoped NoAlias Alias Analysis

View File

@@ -6,9 +6,11 @@
; CHECK-LABEL: Pass Arguments:
; CHECK-NEXT: Target Library Information
; CHECK-NEXT: Runtime Library Function Analysis
; CHECK-NEXT: Target Pass Configuration
; CHECK-NEXT: Machine Module Information
; CHECK-NEXT: Target Transform Information
; CHECK-NEXT: Library Function Lowering Analysis
; CHECK-NEXT: Create Garbage Collector Module Metadata
; CHECK-NEXT: Assumption Cache Tracker
; CHECK-NEXT: Profile summary info

View File

@@ -5,9 +5,11 @@
; REQUIRES: asserts
; CHECK-LABEL: Pass Arguments:
; CHECK-NEXT: Target Library Information
; CHECK-NEXT: Runtime Library Function Analysis
; CHECK-NEXT: Target Pass Configuration
; CHECK-NEXT: Machine Module Information
; CHECK-NEXT: Target Transform Information
; CHECK-NEXT: Library Function Lowering Analysis
; CHECK-NEXT: Assumption Cache Tracker
; CHECK-NEXT: Type-Based Alias Analysis
; CHECK-NEXT: Scoped NoAlias Alias Analysis

View File

@@ -9,9 +9,11 @@
; CHECK-LABEL: Pass Arguments:
; CHECK-NEXT: Target Library Information
; CHECK-NEXT: Runtime Library Function Analysis
; CHECK-NEXT: Target Pass Configuration
; CHECK-NEXT: Machine Module Information
; CHECK-NEXT: Target Transform Information
; CHECK-NEXT: Library Function Lowering Analysis
; CHECK-NEXT: Create Garbage Collector Module Metadata
; CHECK-NEXT: Assumption Cache Tracker
; CHECK-NEXT: Profile summary info

View File

@@ -9,9 +9,11 @@
; CHECK-LABEL: Pass Arguments:
; CHECK-NEXT: Target Library Information
; CHECK-NEXT: Runtime Library Function Analysis
; CHECK-NEXT: Target Pass Configuration
; CHECK-NEXT: Machine Module Information
; CHECK-NEXT: Target Transform Information
; CHECK-NEXT: Library Function Lowering Analysis
; CHECK-NEXT: Assumption Cache Tracker
; CHECK-NEXT: Profile summary info
; CHECK-NEXT: Type-Based Alias Analysis

View File

@@ -11,9 +11,11 @@
; REQUIRES:asserts
; SPIRV-O0:Target Library Information
; SPIRV-O0-NEXT:Runtime Library Function Analysis
; SPIRV-O0-NEXT:Target Pass Configuration
; SPIRV-O0-NEXT:Machine Module Information
; SPIRV-O0-NEXT:Target Transform Information
; SPIRV-O0-NEXT:Library Function Lowering Analysis
; SPIRV-O0-NEXT:Create Garbage Collector Module Metadata
; SPIRV-O0-NEXT:Assumption Cache Tracker
; SPIRV-O0-NEXT:Profile summary info
@@ -83,9 +85,11 @@
; SPIRV-O0-NEXT: Free MachineFunction
; SPIRV-Opt:Target Library Information
; SPIRV-Opt-NEXT:Runtime Library Function Analysis
; SPIRV-Opt-NEXT:Target Pass Configuration
; SPIRV-Opt-NEXT:Machine Module Information
; SPIRV-Opt-NEXT:Target Transform Information
; SPIRV-Opt-NEXT:Library Function Lowering Analysis
; SPIRV-Opt-NEXT:Assumption Cache Tracker
; SPIRV-Opt-NEXT:Type-Based Alias Analysis
; SPIRV-Opt-NEXT:Scoped NoAlias Alias Analysis

View File

@@ -7,9 +7,11 @@
; CHECK-LABEL: Pass Arguments:
; CHECK-NEXT: Target Library Information
; CHECK-NEXT: Runtime Library Function Analysis
; CHECK-NEXT: Target Pass Configuration
; CHECK-NEXT: Machine Module Information
; CHECK-NEXT: Target Transform Information
; CHECK-NEXT: Library Function Lowering Analysis
; CHECK-NEXT: Create Garbage Collector Module Metadata
; CHECK-NEXT: Assumption Cache Tracker
; CHECK-NEXT: Profile summary info

View File

@@ -13,9 +13,11 @@
; CHECK-LABEL: Pass Arguments:
; CHECK-NEXT: Target Library Information
; CHECK-NEXT: Runtime Library Function Analysis
; CHECK-NEXT: Target Pass Configuration
; CHECK-NEXT: Machine Module Information
; CHECK-NEXT: Target Transform Information
; CHECK-NEXT: Library Function Lowering Analysis
; CHECK-NEXT: Assumption Cache Tracker
; CHECK-NEXT: Type-Based Alias Analysis
; CHECK-NEXT: Scoped NoAlias Alias Analysis

View File

@@ -1,5 +1,5 @@
; RUN: opt -mtriple=amdgcn -passes="expand-fp<O0>" %s -S -o - | FileCheck --check-prefixes CHECK %s
; RUN: opt -mtriple=amdgcn -passes="expand-fp<O1>" %s -S -o - | FileCheck --check-prefixes CHECK,OPT1 %s
; RUN: opt -mtriple=amdgcn -passes="require<libcall-lowering-info>,expand-fp<O0>" %s -S -o - | FileCheck --check-prefixes CHECK %s
; RUN: opt -mtriple=amdgcn -passes="require<libcall-lowering-info>,expand-fp<O1>" %s -S -o - | FileCheck --check-prefixes CHECK,OPT1 %s
; Check the handling of potentially infinite numerators in the frem
; expansion at different optimization levels and with different

View File

@@ -1,5 +1,5 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
; RUN: opt -mtriple=amdgcn -passes="expand-fp<O1>" %s -S -o - | FileCheck %s
; RUN: opt -mtriple=amdgcn -passes="require<libcall-lowering-info>,expand-fp<O1>" %s -S -o - | FileCheck %s
define amdgpu_kernel void @frem_f16(ptr addrspace(1) %out, ptr addrspace(1) %in1,
; CHECK-LABEL: define amdgpu_kernel void @frem_f16(

View File

@@ -0,0 +1,6 @@
; RUN: not opt -mtriple=amdgcn -passes=expand-fp -disable-output %s 2>&1 | FileCheck %s
; CHECK: 'LibcallLoweringModuleAnalysis' analysis required
define void @empty() {
ret void
}

View File

@@ -1,18 +1,18 @@
; RUN: opt -mtriple=amdgcn -passes="expand-fp<O0>" %s -S -o /dev/null
; RUN: opt -mtriple=amdgcn -passes="expand-fp<O1>" %s -S -o /dev/null
; RUN: opt -mtriple=amdgcn -passes="expand-fp<O2>" %s -S -o /dev/null
; RUN: opt -mtriple=amdgcn -passes="expand-fp<O3>" %s -S -o /dev/null
; RUN: opt -mtriple=amdgcn -passes="require<libcall-lowering-info>,expand-fp<O0>" %s -S -disable-output
; RUN: opt -mtriple=amdgcn -passes="require<libcall-lowering-info>,expand-fp<O1>" %s -S -disable-output
; RUN: opt -mtriple=amdgcn -passes="require<libcall-lowering-info>,expand-fp<O2>" %s -S -disable-output
; RUN: opt -mtriple=amdgcn -passes="require<libcall-lowering-info>,expand-fp<O3>" %s -S -disable-output
; RUN: not opt -mtriple=amdgcn -passes="expand-fp<O4>" %s -S -o /dev/null 2>&1 | FileCheck --check-prefix=TOO-LARGE %s
; RUN: not opt -mtriple=amdgcn -passes="require<libcall-lowering-info>,expand-fp<O4>" %s -S -disable-output 2>&1 | FileCheck --check-prefix=TOO-LARGE %s
; TOO-LARGE: {{.*}}invalid optimization level for expand-fp pass: 4
; RUN: not opt -mtriple=amdgcn -passes="expand-fp<Os>" %s -S -o /dev/null 2>&1 | FileCheck --check-prefix=NON-NUMERIC %s
; RUN: not opt -mtriple=amdgcn -passes="require<libcall-lowering-info>,expand-fp<Os>" %s -S -disable-output 2>&1 | FileCheck --check-prefix=NON-NUMERIC %s
; NON-NUMERIC: {{.*}}invalid expand-fp pass parameter
; RUN: not opt -mtriple=amdgcn -passes="expand-fp<O-1>" %s -S -o /dev/null 2>&1 | FileCheck --check-prefix=NEGATIVE %s
; RUN: not opt -mtriple=amdgcn -passes="require<libcall-lowering-info>,expand-fp<O-1>" %s -S -disable-output 2>&1 | FileCheck --check-prefix=NEGATIVE %s
; NEGATIVE: {{.*}}invalid expand-fp pass parameter 'O-1'
; RUN: not opt -mtriple=amdgcn -passes="expand-fp<foo>" %s -S -o /dev/null 2>&1 | FileCheck --check-prefix=NO-O-PREFIX %s
; RUN: not opt -mtriple=amdgcn -passes="require<libcall-lowering-info>,expand-fp<foo>" %s -S -disable-output 2>&1 | FileCheck --check-prefix=NO-O-PREFIX %s
; NO-O-PREFIX: {{.*}}invalid expand-fp pass parameter 'foo'
define void @empty() {

View File

@@ -1,6 +1,6 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt -S -mtriple=x86_64-- --expand-fp < %s | FileCheck %s
; RUN: opt -S -mtriple=x86_64-- -passes=expand-fp < %s | FileCheck %s
; RUN: opt -S -mtriple=x86_64-- -passes='require<libcall-lowering-info>,expand-fp' < %s | FileCheck %s
define i129 @halftosi129(half %a) {
; CHECK-LABEL: @halftosi129(

View File

@@ -1,6 +1,6 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt -S -mtriple=x86_64-- --expand-fp < %s | FileCheck %s
; RUN: opt -S -mtriple=x86_64-- -passes=expand-fp < %s | FileCheck %s
; RUN: opt -S -mtriple=x86_64-- -passes='require<libcall-lowering-info>,expand-fp' < %s | FileCheck %s
define i129 @halftoui129(half %a) {
; CHECK-LABEL: @halftoui129(

View File

@@ -1,6 +1,6 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt -S -mtriple=x86_64-- --expand-fp < %s | FileCheck %s
; RUN: opt -S -mtriple=x86_64-- -passes=expand-fp < %s | FileCheck %s
; RUN: opt -S -mtriple=x86_64-- -passes='require<libcall-lowering-info>,expand-fp' < %s | FileCheck %s
define half @si129tohalf(i129 %a) {
; CHECK-LABEL: @si129tohalf(

View File

@@ -1,6 +1,6 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt -S -mtriple=x86_64-- --expand-fp < %s | FileCheck %s
; RUN: opt -S -mtriple=x86_64-- -passes=expand-fp < %s | FileCheck %s
; RUN: opt -S -mtriple=x86_64-- -passes='require<libcall-lowering-info>,expand-fp' < %s | FileCheck %s
define half @ui129tohalf(i129 %a) {
; CHECK-LABEL: @ui129tohalf(

View File

@@ -1,6 +1,6 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
; RUN: opt -S -mtriple=x86_64-- --expand-fp < %s | FileCheck %s
; RUN: opt -S -mtriple=x86_64-- -passes=expand-fp < %s | FileCheck %s
; RUN: opt -S -mtriple=x86_64-- -passes='require<libcall-lowering-info>,expand-fp' < %s | FileCheck %s
; expand-fp must also run with optnone

View File

@@ -14,8 +14,10 @@
#include "NewPMDriver.h"
#include "llvm/Analysis/CGSCCPassManager.h"
#include "llvm/Analysis/RuntimeLibcallInfo.h"
#include "llvm/Analysis/TargetLibraryInfo.h"
#include "llvm/CodeGen/CommandFlags.h"
#include "llvm/CodeGen/LibcallLoweringInfo.h"
#include "llvm/CodeGen/MIRParser/MIRParser.h"
#include "llvm/CodeGen/MIRPrinter.h"
#include "llvm/CodeGen/MachineFunctionAnalysis.h"
@@ -136,6 +138,16 @@ int llvm::compileModuleWithNewPM(
SI.registerCallbacks(PIC, &MAM);
FAM.registerPass([&] { return TargetLibraryAnalysis(TLII); });
MAM.registerPass([&] {
const TargetOptions &Options = Target->Options;
return RuntimeLibraryAnalysis(
M->getTargetTriple(), Target->Options.ExceptionModel,
Target->Options.FloatABIType, Target->Options.EABIVersion,
Options.MCOptions.ABIName, Target->Options.VecLib);
});
MAM.registerPass([&] { return LibcallLoweringModuleAnalysis(); });
MAM.registerPass([&] { return MachineModuleAnalysis(MMI); });
ModulePassManager MPM;

View File

@@ -16,6 +16,7 @@
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/ScopeExit.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/Analysis/RuntimeLibcallInfo.h"
#include "llvm/Analysis/TargetLibraryInfo.h"
#include "llvm/CodeGen/CommandFlags.h"
#include "llvm/CodeGen/LinkAllAsmWriterComponents.h"
@@ -727,6 +728,10 @@ static int compileModule(char **argv, LLVMContext &Context,
// Build up all of the passes that we want to do to the module.
legacy::PassManager PM;
PM.add(new TargetLibraryInfoWrapperPass(TLII));
PM.add(new RuntimeLibraryInfoWrapper(
M->getTargetTriple(), Target->Options.ExceptionModel,
Target->Options.FloatABIType, Target->Options.EABIVersion,
Options.MCOptions.ABIName, Target->Options.VecLib));
{
raw_pwrite_stream *OS = &Out->os();

View File

@@ -21,6 +21,7 @@
#include "llvm/Analysis/RuntimeLibcallInfo.h"
#include "llvm/Analysis/TargetLibraryInfo.h"
#include "llvm/Bitcode/BitcodeWriterPass.h"
#include "llvm/CodeGen/LibcallLoweringInfo.h"
#include "llvm/Config/llvm-config.h"
#include "llvm/IR/Dominators.h"
#include "llvm/IR/LLVMContext.h"
@@ -352,9 +353,9 @@ static void registerEPCallbacks(PassBuilder &PB) {
bool llvm::runPassPipeline(
StringRef Arg0, Module &M, TargetMachine *TM, TargetLibraryInfoImpl *TLII,
RTLIB::RuntimeLibcallsInfo &RTLCI, ToolOutputFile *Out,
ToolOutputFile *ThinLTOLinkOut, ToolOutputFile *OptRemarkFile,
StringRef PassPipeline, ArrayRef<PassPlugin> PassPlugins,
ToolOutputFile *Out, ToolOutputFile *ThinLTOLinkOut,
ToolOutputFile *OptRemarkFile, StringRef PassPipeline,
ArrayRef<PassPlugin> PassPlugins,
ArrayRef<std::function<void(PassBuilder &)>> PassBuilderCallbacks,
OutputKind OK, VerifierKind VK, bool ShouldPreserveAssemblyUseListOrder,
bool ShouldPreserveBitcodeUseListOrder, bool EmitSummaryIndex,
@@ -410,14 +411,24 @@ bool llvm::runPassPipeline(
P->CSAction = PGOOptions::CSIRUse;
}
}
if (TM)
TM->setPGOOption(P);
LoopAnalysisManager LAM;
FunctionAnalysisManager FAM;
CGSCCAnalysisManager CGAM;
ModuleAnalysisManager MAM;
MAM.registerPass([&] { return RuntimeLibraryAnalysis(std::move(RTLCI)); });
if (TM) {
TM->setPGOOption(P);
MAM.registerPass([&] {
const TargetOptions &Options = TM->Options;
return RuntimeLibraryAnalysis(M.getTargetTriple(), Options.ExceptionModel,
Options.FloatABIType, Options.EABIVersion,
Options.MCOptions.ABIName, Options.VecLib);
});
MAM.registerPass([&] { return LibcallLoweringModuleAnalysis(); });
}
PassInstrumentationCallbacks PIC;
PrintPassOptions PrintPassOpts;

View File

@@ -31,10 +31,6 @@ class TargetMachine;
class ToolOutputFile;
class TargetLibraryInfoImpl;
namespace RTLIB {
struct RuntimeLibcallsInfo;
}
extern cl::opt<bool> DebugifyEach;
extern cl::opt<std::string> DebugifyExport;
@@ -71,9 +67,9 @@ void printPasses(raw_ostream &OS);
/// nullptr.
bool runPassPipeline(
StringRef Arg0, Module &M, TargetMachine *TM, TargetLibraryInfoImpl *TLII,
RTLIB::RuntimeLibcallsInfo &RTLCI, ToolOutputFile *Out,
ToolOutputFile *ThinLinkOut, ToolOutputFile *OptRemarkFile,
StringRef PassPipeline, ArrayRef<PassPlugin> PassPlugins,
ToolOutputFile *Out, ToolOutputFile *ThinLinkOut,
ToolOutputFile *OptRemarkFile, StringRef PassPipeline,
ArrayRef<PassPlugin> PassPlugins,
ArrayRef<std::function<void(PassBuilder &)>> PassBuilderCallbacks,
opt_tool::OutputKind OK, opt_tool::VerifierKind VK,
bool ShouldPreserveAssemblyUseListOrder,

View File

@@ -657,6 +657,13 @@ optMain(int argc, char **argv,
return 1;
}
TargetOptions CodeGenFlagsOptions;
const TargetOptions *Options = TM ? &TM->Options : &CodeGenFlagsOptions;
if (!TM) {
CodeGenFlagsOptions =
codegen::InitTargetOptionsFromCodeGenFlags(ModuleTriple);
}
// Override function attributes based on CPUStr, FeaturesStr, and command line
// flags.
codegen::setFunctionAttributes(CPUStr, FeaturesStr, *M);
@@ -674,13 +681,8 @@ optMain(int argc, char **argv,
M->addModuleFlag(Module::Error, "UnifiedLTO", 1);
}
VectorLibrary VecLib = codegen::getVectorLibrary();
// Add an appropriate TargetLibraryInfo pass for the module's triple.
TargetLibraryInfoImpl TLII(ModuleTriple, VecLib);
RTLIB::RuntimeLibcallsInfo RTLCI(ModuleTriple, codegen::getExceptionModel(),
codegen::getFloatABIForCalls(),
codegen::getEABIVersion(), ABIName, VecLib);
TargetLibraryInfoImpl TLII(ModuleTriple, Options->VecLib);
// The -disable-simplify-libcalls flag actually disables all builtin optzns.
if (DisableSimplifyLibCalls)
@@ -756,7 +758,7 @@ optMain(int argc, char **argv,
// string. Hand off the rest of the functionality to the new code for that
// layer.
if (!runPassPipeline(
argv[0], *M, TM.get(), &TLII, RTLCI, Out.get(), ThinLinkOut.get(),
argv[0], *M, TM.get(), &TLII, Out.get(), ThinLinkOut.get(),
RemarksFile.get(), Pipeline, PluginList, PassBuilderCallbacks, OK,
VK, /* ShouldPreserveAssemblyUseListOrder */ false,
/* ShouldPreserveBitcodeUseListOrder */ true, EmitSummaryIndex,
@@ -804,6 +806,9 @@ optMain(int argc, char **argv,
(VerifyDebugInfoPreserve && !VerifyEachDebugInfoPreserve);
Passes.add(new TargetLibraryInfoWrapperPass(TLII));
Passes.add(new RuntimeLibraryInfoWrapper(
ModuleTriple, Options->ExceptionModel, Options->FloatABIType,
Options->EABIVersion, Options->MCOptions.ABIName, Options->VecLib));
// Add internal analysis passes from the target machine.
Passes.add(createTargetTransformInfoWrapperPass(TM ? TM->getTargetIRAnalysis()