diff --git a/driver/cl_options-llvm.cpp b/driver/cl_options-llvm.cpp index 90d5592fea..90b9e1c8fd 100644 --- a/driver/cl_options-llvm.cpp +++ b/driver/cl_options-llvm.cpp @@ -35,7 +35,11 @@ Reloc::Model getRelocModel() { return ::RelocModel; } CodeModel::Model getCodeModel() { return ::CMModel; } -bool disableFPElim() { return ::DisableFPElim; } +cl::boolOrDefault disableFPElim() { + return ::DisableFPElim.getNumOccurrences() == 0 + ? cl::BOU_UNSET + : ::DisableFPElim ? cl::BOU_TRUE : cl::BOU_FALSE; +} bool disableRedZone() { return ::DisableRedZone; } diff --git a/driver/cl_options-llvm.h b/driver/cl_options-llvm.h index b249cbfc29..d17101c2b3 100644 --- a/driver/cl_options-llvm.h +++ b/driver/cl_options-llvm.h @@ -24,7 +24,7 @@ llvm::Optional getRelocModel(); llvm::Reloc::Model getRelocModel(); #endif llvm::CodeModel::Model getCodeModel(); -bool disableFPElim(); +llvm::cl::boolOrDefault disableFPElim(); bool disableRedZone(); bool printTargetFeaturesHelp(); diff --git a/gen/functions.cpp b/gen/functions.cpp index c5bc20c5a3..b63da8cdbf 100644 --- a/gen/functions.cpp +++ b/gen/functions.cpp @@ -459,9 +459,8 @@ void applyTargetMachineAttributes(llvm::Function &func, func.addFnAttr("no-infs-fp-math", TO.NoInfsFPMath ? "true" : "false"); func.addFnAttr("no-nans-fp-math", TO.NoNaNsFPMath ? "true" : "false"); - // Frame pointer elimination func.addFnAttr("no-frame-pointer-elim", - opts::disableFPElim() ? "true" : "false"); + willEliminateFramePointer() ? "false" : "true"); } } // anonymous namespace diff --git a/gen/optimizer.cpp b/gen/optimizer.cpp index f0a2495c5e..400dd7ce7d 100644 --- a/gen/optimizer.cpp +++ b/gen/optimizer.cpp @@ -120,6 +120,12 @@ bool willCrossModuleInline() { return enableCrossModuleInlining == llvm::cl::BOU_TRUE; } +bool willEliminateFramePointer() { + const llvm::cl::boolOrDefault disableFPElimEnum = opts::disableFPElim(); + return disableFPElimEnum == llvm::cl::BOU_FALSE || + (disableFPElimEnum == llvm::cl::BOU_UNSET && isOptimizationEnabled()); +} + bool isOptimizationEnabled() { return optimizeLevel != 0; } llvm::CodeGenOpt::Level codeGenOptLevel() { diff --git a/gen/optimizer.h b/gen/optimizer.h index 982b928371..73e203a1b7 100644 --- a/gen/optimizer.h +++ b/gen/optimizer.h @@ -35,6 +35,8 @@ bool willInline(); bool willCrossModuleInline(); +bool willEliminateFramePointer(); + unsigned optLevel(); bool isOptimizationEnabled(); diff --git a/tests/codegen/attr_targetoptions.d b/tests/codegen/attr_targetoptions.d index 0538cea26a..6e5244f351 100644 --- a/tests/codegen/attr_targetoptions.d +++ b/tests/codegen/attr_targetoptions.d @@ -1,26 +1,27 @@ // Tests that our TargetMachine options are added as function attributes -// RUN: %ldc -c -output-ll -of=%t.ll %s && FileCheck %s --check-prefix=DEFAULT < %t.ll -// RUN: %ldc -c -output-ll -of=%t.ll %s -disable-fp-elim && FileCheck %s --check-prefix=FRAMEPTR < %t.ll -// RUN: %ldc -c -output-ll -of=%t.ll %s -mattr=test && FileCheck %s --check-prefix=ATTR < %t.ll +// RUN: %ldc -c -output-ll -of=%t.ll %s +// RUN: FileCheck %s --check-prefix=COMMON --check-prefix=WITH_FP < %t.ll +// RUN: %ldc -c -output-ll -of=%t.ll %s -O2 +// RUN: FileCheck %s --check-prefix=COMMON --check-prefix=NO_FP < %t.ll +// RUN: %ldc -c -output-ll -of=%t.ll %s -O2 -disable-fp-elim +// RUN: FileCheck %s --check-prefix=COMMON --check-prefix=WITH_FP < %t.ll +// RUN: %ldc -c -output-ll -of=%t.ll %s -disable-fp-elim=false -mattr=test +// RUN: FileCheck %s --check-prefix=COMMON --check-prefix=NO_FP --check-prefix=ATTR < %t.ll -// DEFAULT: define{{.*}} @{{.*}}3fooFZv{{.*}} #[[KEYVALUE:[0-9]+]] -// FRAMEPTR: define{{.*}} @{{.*}}3fooFZv{{.*}} #[[KEYVALUE:[0-9]+]] -// ATTR: define{{.*}} @{{.*}}3fooFZv{{.*}} #[[KEYVALUE:[0-9]+]] +// COMMON: define{{.*}} @{{.*}}3fooFZv{{.*}} #[[KEYVALUE:[0-9]+]] void foo() { } -// DEFAULT: attributes #[[KEYVALUE]] -// DEFAULT-DAG: "target-cpu"= -// DEFAULT-DAG: "no-frame-pointer-elim"="false" -// DEFAULT-DAG: "unsafe-fp-math"="false" -// DEFAULT-DAG: "less-precise-fpmad"="false" -// DEFAULT-DAG: "no-infs-fp-math"="false" -// DEFAULT-DAG: "no-nans-fp-math"="false" +// COMMON: attributes #[[KEYVALUE]] +// COMMON-DAG: "target-cpu"= +// COMMON-DAG: "unsafe-fp-math"="false" +// COMMON-DAG: "less-precise-fpmad"="false" +// COMMON-DAG: "no-infs-fp-math"="false" +// COMMON-DAG: "no-nans-fp-math"="false" -// FRAMEPTR: attributes #[[KEYVALUE]] -// FRAMEPTR-DAG: "no-frame-pointer-elim"="true" +// WITH_FP-DAG: "no-frame-pointer-elim"="true" +// NO_FP-DAG: "no-frame-pointer-elim"="false" -// ATTR: attributes #[[KEYVALUE]] // ATTR-DAG: "target-features"="{{.*}}+test{{.*}}" diff --git a/tests/d2/dmd-testsuite b/tests/d2/dmd-testsuite index 5e9ab8e37b..9e3d6271d7 160000 --- a/tests/d2/dmd-testsuite +++ b/tests/d2/dmd-testsuite @@ -1 +1 @@ -Subproject commit 5e9ab8e37b6d435f6cfba4cfd87b3c6651e9e562 +Subproject commit 9e3d6271d78ac959a42c48fd9ca15e8d7a8ba531