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 | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/contrib/llvm-project/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp b/contrib/llvm-project/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp index 6ef219f216a3..2db1b6493cc4 100644 --- a/contrib/llvm-project/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp +++ b/contrib/llvm-project/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp @@ -14,12 +14,12 @@ #include "WebAssemblyTargetMachine.h" #include "MCTargetDesc/WebAssemblyMCTargetDesc.h" #include "TargetInfo/WebAssemblyTargetInfo.h" -#include "Utils/WebAssemblyUtilities.h" #include "WebAssembly.h" #include "WebAssemblyISelLowering.h" #include "WebAssemblyMachineFunctionInfo.h" #include "WebAssemblyTargetObjectFile.h" #include "WebAssemblyTargetTransformInfo.h" +#include "WebAssemblyUtilities.h" #include "llvm/CodeGen/MIRParser/MIParser.h" #include "llvm/CodeGen/MachineFunctionPass.h" #include "llvm/CodeGen/Passes.h" @@ -48,6 +48,12 @@ static cl::opt<bool> WasmDisableExplicitLocals( " instruction output for test purposes only."), cl::init(false)); +static cl::opt<bool> WasmDisableFixIrreducibleControlFlowPass( + "wasm-disable-fix-irreducible-control-flow-pass", cl::Hidden, + cl::desc("webassembly: disables the fix " + " irreducible control flow optimization pass"), + cl::init(false)); + extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeWebAssemblyTarget() { // Register the target. RegisterTargetMachine<WebAssemblyTargetMachine> X( @@ -107,7 +113,7 @@ static Reloc::Model getEffectiveRelocModel(std::optional<Reloc::Model> RM, WebAssemblyTargetMachine::WebAssemblyTargetMachine( const Target &T, const Triple &TT, StringRef CPU, StringRef FS, const TargetOptions &Options, std::optional<Reloc::Model> RM, - std::optional<CodeModel::Model> CM, CodeGenOpt::Level OL, bool JIT) + std::optional<CodeModel::Model> CM, CodeGenOptLevel OL, bool JIT) : LLVMTargetMachine( T, TT.isArch64Bit() @@ -127,6 +133,7 @@ WebAssemblyTargetMachine::WebAssemblyTargetMachine( // LLVM 'unreachable' to ISD::TRAP and then lower that to WebAssembly's // 'unreachable' instructions which is meant for that case. this->Options.TrapUnreachable = true; + this->Options.NoTrapAfterNoreturn = false; // WebAssembly treats each function as an independent unit. Force // -ffunction-sections, effectively, so that we can emit them independently. @@ -368,7 +375,7 @@ static void basicCheckForEHAndSjLj(TargetMachine *TM) { // to TargetOptions and MCAsmInfo. But when clang compiles bitcode directly, // clang's LangOptions is not used and thus the exception model info is not // correctly transferred to TargetOptions and MCAsmInfo, so we make sure we - // have the correct exception model in in WebAssemblyMCAsmInfo constructor. + // have the correct exception model in WebAssemblyMCAsmInfo constructor. // But in this case TargetOptions is still not updated, so we make sure they // are the same. TM->Options.ExceptionModel = TM->getMCAsmInfo()->getExceptionHandlingType(); @@ -426,7 +433,7 @@ void WebAssemblyPassConfig::addIRPasses() { addPass(createWebAssemblyFixFunctionBitcasts()); // Optimize "returned" function attributes. - if (getOptLevel() != CodeGenOpt::None) + if (getOptLevel() != CodeGenOptLevel::None) addPass(createWebAssemblyOptimizeReturned()); basicCheckForEHAndSjLj(TM); @@ -503,7 +510,7 @@ void WebAssemblyPassConfig::addOptimizedRegAlloc() { // usually not used for production builds. // TODO Investigate why RegisterCoalesce degrades debug info quality and fix // it properly - if (getOptLevel() == CodeGenOpt::Less) + if (getOptLevel() == CodeGenOptLevel::Less) disablePass(&RegisterCoalescerID); TargetPassConfig::addOptimizedRegAlloc(); } @@ -537,7 +544,8 @@ void WebAssemblyPassConfig::addPreEmitPass() { addPass(createWebAssemblyNullifyDebugValueLists()); // Eliminate multiple-entry loops. - addPass(createWebAssemblyFixIrreducibleControlFlow()); + if (!WasmDisableFixIrreducibleControlFlowPass) + addPass(createWebAssemblyFixIrreducibleControlFlow()); // Do various transformations for exception handling. // Every CFG-changing optimizations should come before this. @@ -550,7 +558,7 @@ void WebAssemblyPassConfig::addPreEmitPass() { addPass(createWebAssemblyReplacePhysRegs()); // Preparations and optimizations related to register stackification. - if (getOptLevel() != CodeGenOpt::None) { + if (getOptLevel() != CodeGenOptLevel::None) { // Depend on LiveIntervals and perform some optimizations on it. addPass(createWebAssemblyOptimizeLiveIntervals()); @@ -585,7 +593,7 @@ void WebAssemblyPassConfig::addPreEmitPass() { addPass(createWebAssemblyLowerBrUnless()); // Perform the very last peephole optimizations on the code. - if (getOptLevel() != CodeGenOpt::None) + if (getOptLevel() != CodeGenOptLevel::None) addPass(createWebAssemblyPeephole()); // Create a mapping from LLVM CodeGen virtual registers to wasm registers. |
