diff options
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp')
-rw-r--r-- | contrib/llvm-project/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp | 39 |
1 files changed, 32 insertions, 7 deletions
diff --git a/contrib/llvm-project/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp b/contrib/llvm-project/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp index 76f036358ae8..630c786a3dc7 100644 --- a/contrib/llvm-project/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp +++ b/contrib/llvm-project/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp @@ -32,6 +32,7 @@ #include "llvm/Transforms/Scalar.h" #include "llvm/Transforms/Scalar/LowerAtomicPass.h" #include "llvm/Transforms/Utils.h" +#include <optional> using namespace llvm; #define DEBUG_TYPE "wasm" @@ -79,13 +80,16 @@ extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeWebAssemblyTarget() { initializeWebAssemblyDebugFixupPass(PR); initializeWebAssemblyPeepholePass(PR); initializeWebAssemblyMCLowerPrePassPass(PR); + initializeWebAssemblyLowerRefTypesIntPtrConvPass(PR); + initializeWebAssemblyFixBrTableDefaultsPass(PR); + initializeWebAssemblyDAGToDAGISelPass(PR); } //===----------------------------------------------------------------------===// // WebAssembly Lowering public interface. //===----------------------------------------------------------------------===// -static Reloc::Model getEffectiveRelocModel(Optional<Reloc::Model> RM, +static Reloc::Model getEffectiveRelocModel(std::optional<Reloc::Model> RM, const Triple &TT) { if (!RM) { // Default to static relocation model. This should always be more optimial @@ -108,8 +112,8 @@ static Reloc::Model getEffectiveRelocModel(Optional<Reloc::Model> RM, /// WebAssemblyTargetMachine::WebAssemblyTargetMachine( const Target &T, const Triple &TT, StringRef CPU, StringRef FS, - const TargetOptions &Options, Optional<Reloc::Model> RM, - Optional<CodeModel::Model> CM, CodeGenOpt::Level OL, bool JIT) + const TargetOptions &Options, std::optional<Reloc::Model> RM, + std::optional<CodeModel::Model> CM, CodeGenOpt::Level OL, bool JIT) : LLVMTargetMachine( T, TT.isArch64Bit() @@ -323,6 +327,7 @@ public: void addIRPasses() override; void addISelPrepare() override; bool addInstSelector() override; + void addOptimizedRegAlloc() override; void addPostRegAlloc() override; bool addGCPasses() override { return false; } void addPreEmitPass() override; @@ -336,6 +341,13 @@ public: }; } // end anonymous namespace +MachineFunctionInfo *WebAssemblyTargetMachine::createMachineFunctionInfo( + BumpPtrAllocator &Allocator, const Function &F, + const TargetSubtargetInfo *STI) const { + return WebAssemblyFunctionInfo::create<WebAssemblyFunctionInfo>(Allocator, F, + STI); +} + TargetTransformInfo WebAssemblyTargetMachine::getTargetTransformInfo(const Function &F) const { return TargetTransformInfo(WebAssemblyTTIImpl(this, F)); @@ -412,7 +424,7 @@ void WebAssemblyPassConfig::addIRPasses() { // Add signatures to prototype-less function declarations addPass(createWebAssemblyAddMissingPrototypes()); - // Lower .llvm.global_dtors into .llvm_global_ctors with __cxa_atexit calls. + // Lower .llvm.global_dtors into .llvm.global_ctors with __cxa_atexit calls. addPass(createLowerGlobalDtorsLegacyPass()); // Fix function bitcasts, as WebAssembly requires caller and callee signatures @@ -480,18 +492,31 @@ bool WebAssemblyPassConfig::addInstSelector() { return false; } +void WebAssemblyPassConfig::addOptimizedRegAlloc() { + // Currently RegisterCoalesce degrades wasm debug info quality by a + // significant margin. As a quick fix, disable this for -O1, which is often + // used for debugging large applications. Disabling this increases code size + // of Emscripten core benchmarks by ~5%, which is acceptable for -O1, which is + // usually not used for production builds. + // TODO Investigate why RegisterCoalesce degrades debug info quality and fix + // it properly + if (getOptLevel() == CodeGenOpt::Less) + disablePass(&RegisterCoalescerID); + TargetPassConfig::addOptimizedRegAlloc(); +} + void WebAssemblyPassConfig::addPostRegAlloc() { // TODO: The following CodeGen passes don't currently support code containing // virtual registers. Consider removing their restrictions and re-enabling // them. // These functions all require the NoVRegs property. + disablePass(&MachineLateInstrsCleanupID); disablePass(&MachineCopyPropagationID); disablePass(&PostRAMachineSinkingID); disablePass(&PostRASchedulerID); disablePass(&FuncletLayoutID); disablePass(&StackMapLivenessID); - disablePass(&LiveDebugValuesID); disablePass(&PatchableFunctionID); disablePass(&ShrinkWrapID); @@ -585,7 +610,7 @@ WebAssemblyTargetMachine::createDefaultFuncInfoYAML() const { yaml::MachineFunctionInfo *WebAssemblyTargetMachine::convertFuncInfoToYAML( const MachineFunction &MF) const { const auto *MFI = MF.getInfo<WebAssemblyFunctionInfo>(); - return new yaml::WebAssemblyFunctionInfo(*MFI); + return new yaml::WebAssemblyFunctionInfo(MF, *MFI); } bool WebAssemblyTargetMachine::parseMachineFunctionInfo( @@ -593,6 +618,6 @@ bool WebAssemblyTargetMachine::parseMachineFunctionInfo( SMDiagnostic &Error, SMRange &SourceRange) const { const auto &YamlMFI = static_cast<const yaml::WebAssemblyFunctionInfo &>(MFI); MachineFunction &MF = PFS.MF; - MF.getInfo<WebAssemblyFunctionInfo>()->initializeBaseYamlFields(YamlMFI); + MF.getInfo<WebAssemblyFunctionInfo>()->initializeBaseYamlFields(MF, YamlMFI); return false; } |