diff --git a/driver/cl_options-llvm.cpp b/driver/cl_options-llvm.cpp index 88e70981c0..bf9caa655d 100644 --- a/driver/cl_options-llvm.cpp +++ b/driver/cl_options-llvm.cpp @@ -23,6 +23,12 @@ static cl::opt DisableRedZone("disable-red-zone", cl::ZeroOrMore, cl::desc("Do not emit code that uses the red zone.")); +#if LDC_LLVM_VER >= 800 +static cl::opt + disableFPElim("disable-fp-elim", cl::ZeroOrMore, + cl::desc("Disable frame pointer elimination optimization")); +#endif + // Now expose the helper functions (with static linkage) via external wrappers // in the opts namespace, including some additional helper functions. namespace opts { @@ -39,10 +45,11 @@ CodeModel::Model getCodeModel() { return ::CMModel; } #if LDC_LLVM_VER >= 800 llvm::Optional framePointerUsage() { - if (::FramePointerUsage.getNumOccurrences() == 0) - return llvm::None; - else + if (::FramePointerUsage.getNumOccurrences() > 0) return ::FramePointerUsage.getValue(); + if (disableFPElim.getNumOccurrences() > 0) + return disableFPElim ? llvm::FramePointer::All : llvm::FramePointer::None; + return llvm::None; } #else cl::boolOrDefault disableFPElim() { diff --git a/gen/optimizer.cpp b/gen/optimizer.cpp index a7d850be4d..3d330dd4b0 100644 --- a/gen/optimizer.cpp +++ b/gen/optimizer.cpp @@ -128,11 +128,10 @@ bool willCrossModuleInline() { #if LDC_LLVM_VER >= 800 llvm::FramePointer::FP whichFramePointersToEmit() { - auto option = opts::framePointerUsage(); - if (option) + if (auto option = opts::framePointerUsage()) return *option; - else - return isOptimizationEnabled() ? llvm::FramePointer::None : llvm::FramePointer::All; + return isOptimizationEnabled() ? llvm::FramePointer::None + : llvm::FramePointer::All; } #else bool willEliminateFramePointer() {