From ad70d9683ea7e3d8a67f3e779197ab7a906aa4d7 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Tue, 27 Aug 2013 16:58:15 +0000 Subject: [PATCH] Warn that -O4 is the same as -O3. We error on -O5 and higher. While it is tempting to do the same for -O4, I agree with Jordan Rose: we should warn for a release at least first. llvm-svn: 189369 --- clang/include/clang/Basic/DiagnosticDriverKinds.td | 1 + clang/include/clang/Driver/Options.td | 2 +- clang/lib/Driver/Tools.cpp | 14 +++++++++++--- clang/test/Driver/clang_f_opts.c | 1 + 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td b/clang/include/clang/Basic/DiagnosticDriverKinds.td index 26d39149e6b0..d6187e84687e 100644 --- a/clang/include/clang/Basic/DiagnosticDriverKinds.td +++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td @@ -112,6 +112,7 @@ def err_drv_unknown_objc_runtime : Error< def err_drv_emit_llvm_link : Error< "-emit-llvm cannot be used when linking">; +def warn_O4_is_O3 : Warning<"-O4 is equivalent to -O3">, InGroup; def warn_c_kext : Warning< "ignoring -fapple-kext which is valid for C++ and Objective-C++ only">; def warn_drv_input_file_unused : Warning< diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index b6ecdcd6a908..a9e2f53d2a21 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -214,13 +214,13 @@ def MT : JoinedOrSeparate<["-"], "MT">, Group, Flags<[CC1Option]>, def Mach : Flag<["-"], "Mach">; def M : Flag<["-"], "M">, Group; def O0 : Flag<["-"], "O0">, Group, Flags<[CC1Option]>; +def O4 : Flag<["-"], "O4">, Group, Flags<[CC1Option]>; def ObjCXX : Flag<["-"], "ObjC++">, Flags<[DriverOption]>, HelpText<"Treat source input files as Objective-C++ inputs">; def ObjC : Flag<["-"], "ObjC">, Flags<[DriverOption]>, HelpText<"Treat source input files as Objective-C inputs">; def O : Joined<["-"], "O">, Group, Flags<[CC1Option]>; def O_flag : Flag<["-"], "O">, Flags<[CC1Option]>, Alias, AliasArgs<["2"]>; -def O4 : Flag<["-"], "O4">, Alias, AliasArgs<["3"]>; def Ofast : Joined<["-"], "Ofast">, Group, Flags<[CC1Option]>; def P : Flag<["-"], "P">, Flags<[CC1Option]>, HelpText<"Disable linemarker output in -E mode">; diff --git a/clang/lib/Driver/Tools.cpp b/clang/lib/Driver/Tools.cpp index 49deb26e6a59..645011d10f08 100644 --- a/clang/lib/Driver/Tools.cpp +++ b/clang/lib/Driver/Tools.cpp @@ -1863,7 +1863,8 @@ static bool isOptimizationLevelFast(const ArgList &Args) { /// \brief Vectorize at all optimization levels greater than 1 except for -Oz. static bool shouldEnableVectorizerAtOLevel(const ArgList &Args) { if (Arg *A = Args.getLastArg(options::OPT_O_Group)) { - if (A->getOption().matches(options::OPT_Ofast)) + if (A->getOption().matches(options::OPT_O4) || + A->getOption().matches(options::OPT_Ofast)) return true; if (A->getOption().matches(options::OPT_O0)) @@ -2622,8 +2623,15 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, // preprocessed inputs and configure concludes that -fPIC is not supported. Args.ClaimAllArgs(options::OPT_D); - if (Arg *A = Args.getLastArg(options::OPT_O_Group)) - A->render(Args, CmdArgs); + // Manually translate -O4 to -O3; let clang reject others. + if (Arg *A = Args.getLastArg(options::OPT_O_Group)) { + if (A->getOption().matches(options::OPT_O4)) { + CmdArgs.push_back("-O3"); + D.Diag(diag::warn_O4_is_O3); + } else { + A->render(Args, CmdArgs); + } + } // Don't warn about unused -flto. This can happen when we're preprocessing or // precompiling. diff --git a/clang/test/Driver/clang_f_opts.c b/clang/test/Driver/clang_f_opts.c index 52db4a2d20df..0cf4cc910b2c 100644 --- a/clang/test/Driver/clang_f_opts.c +++ b/clang/test/Driver/clang_f_opts.c @@ -97,4 +97,5 @@ // CHECK-NO-M-PASCAL-STRINGS-NOT: "-fpascal-strings" // RUN: %clang -### -S -O4 %s 2>&1 | FileCheck -check-prefix=CHECK-MAX-O %s +// CHECK-MAX-O: warning: -O4 is equivalent to -O3 // CHECK-MAX-O: -O3 -- GitLab