Author: Stephen Tozer Date: 2025-04-17T16:37:42+01:00 New Revision: a9dff35ad251cd20376ab25b26d1e5394e18ff4c
URL: https://github.com/llvm/llvm-project/commit/a9dff35ad251cd20376ab25b26d1e5394e18ff4c DIFF: https://github.com/llvm/llvm-project/commit/a9dff35ad251cd20376ab25b26d1e5394e18ff4c.diff LOG: [Clang] Enable -fextend-lifetimes at -Og (#118026) Recently, a new flag -fextend-variable-liveness was added that prevents optimizations from removing the values of source variables in some cases, improving the quality of debugging for optimized builds where it is enabled. Following the inclusion of the flag, this patch enables it by default when `-Og` is set. Currently, `-Og` is equivalent to `-O1` - it is effectively just an alias. By enabling `-fextend-lifetimes`, this patch changes the code generated by Clang with `-Og` to have reduced optimization and greater debuggability than `-O1`, differentiating the two according to their respective purposes. This idea was discussed previously on Discourse where there was general agreement with the principle of this change: https://discourse.llvm.org/t/rfc-redefine-og-o1-and-add-a-new-level-of-og Added: Modified: clang/docs/CommandGuide/clang.rst clang/docs/ReleaseNotes.rst clang/lib/Driver/ToolChains/Clang.cpp clang/test/Driver/extend-variable-liveness.c Removed: ################################################################################ diff --git a/clang/docs/CommandGuide/clang.rst b/clang/docs/CommandGuide/clang.rst index 42aac7b25d93c..a1e738f1afec8 100644 --- a/clang/docs/CommandGuide/clang.rst +++ b/clang/docs/CommandGuide/clang.rst @@ -443,8 +443,11 @@ Code Generation Options :option:`-Oz` Like :option:`-Os` (and thus :option:`-O2`), but reduces code size further. - :option:`-Og` Like :option:`-O1`. In future versions, this option might - disable diff erent optimizations in order to improve debuggability. + :option:`-Og` Similar to :option:`-O1`, but with slightly reduced + optimization and better variable visibility. The same optimizations are run + as at :option:`-O1`, but the ``-fextend-variable-liveness`` flag is + also set, which tries to prevent optimizations from reducing the liveness of + user variables, improving their availability when debugging. :option:`-O` Equivalent to :option:`-O1`. diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 0a46bbea96f6c..c75d83a6d1a7a 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -221,6 +221,10 @@ Modified Compiler Flags - The ``-mexecute-only`` and ``-mpure-code`` flags are now accepted for AArch64 targets. (#GH125688) +- The ``-Og`` optimization flag now sets ``-fextend-variable-liveness``, + reducing performance slightly while reducing the number of optimized-out + variables. + Removed Compiler Flags ------------------------- diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 8506a5c00e7bc..b2dd4b3b54869 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -7681,7 +7681,13 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, if (Args.hasArg(options::OPT_fretain_comments_from_system_headers)) CmdArgs.push_back("-fretain-comments-from-system-headers"); - Args.AddLastArg(CmdArgs, options::OPT_fextend_variable_liveness_EQ); + if (Arg *A = Args.getLastArg(options::OPT_fextend_variable_liveness_EQ)) { + A->render(Args, CmdArgs); + } else if (Arg *A = Args.getLastArg(options::OPT_O_Group); + A && A->containsValue("g")) { + // Set -fextend-variable-liveness=all by default at -Og. + CmdArgs.push_back("-fextend-variable-liveness=all"); + } // Forward -fcomment-block-commands to -cc1. Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands); diff --git a/clang/test/Driver/extend-variable-liveness.c b/clang/test/Driver/extend-variable-liveness.c index bbfb2ece6f297..99a5409ceccea 100644 --- a/clang/test/Driver/extend-variable-liveness.c +++ b/clang/test/Driver/extend-variable-liveness.c @@ -1,7 +1,8 @@ // Tests that -fextend-variable-liveness and its aliases are correctly passed -// by the driver. +// by the driver, and are set by default at -Og. // RUN: %clang -### -c %s 2>&1 | FileCheck %s --check-prefixes=CHECK,DEFAULT +// RUN: %clang -### -Og -c %s 2>&1 | FileCheck %s --check-prefixes=CHECK,ALL // RUN: %clang -fextend-variable-liveness=none -### -c %s 2>&1 | FileCheck %s --check-prefixes=CHECK,NONE // RUN: %clang -fextend-variable-liveness=this -### -c %s 2>&1 | FileCheck %s --check-prefixes=CHECK,THIS // RUN: %clang -fextend-variable-liveness=all -### -c %s 2>&1 | FileCheck %s --check-prefixes=CHECK,ALL _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits