https://gcc.gnu.org/g:a59c4e496fa916cb9a484a649aa1b4cebd6550f2

commit r15-2430-ga59c4e496fa916cb9a484a649aa1b4cebd6550f2
Author: Hongyu Wang <hongyu.w...@intel.com>
Date:   Fri Jul 26 08:27:01 2024 +0800

    i386: Mark target option with optimization when enabled with opt level 
[PR116065]
    
    When introducing munroll-only-small-loops, the option was marked as
    Target Save and added to -O2 default which makes attribute(optimize)
    resets target option and causing error when cmdline has O1 and
    funciton attribute has O2 and other target options. Mark this option
    as Optimization to fix.
    
    gcc/ChangeLog
    
            PR target/116065
            * config/i386/i386.opt (munroll-only-small-loops): Mark as
            Optimization instead of Save.
    
    gcc/testsuite/ChangeLog
    
            PR target/116065
            * gcc.target/i386/pr116065.c: New test.

Diff:
---
 gcc/config/i386/i386.opt                 |  2 +-
 gcc/testsuite/gcc.target/i386/pr116065.c | 24 ++++++++++++++++++++++++
 2 files changed, 25 insertions(+), 1 deletion(-)

diff --git a/gcc/config/i386/i386.opt b/gcc/config/i386/i386.opt
index 353fffb23430..52054bc018ad 100644
--- a/gcc/config/i386/i386.opt
+++ b/gcc/config/i386/i386.opt
@@ -1259,7 +1259,7 @@ Target Mask(ISA2_RAOINT) Var(ix86_isa_flags2) Save
 Support RAOINT built-in functions and code generation.
 
 munroll-only-small-loops
-Target Var(ix86_unroll_only_small_loops) Init(0) Save
+Target Var(ix86_unroll_only_small_loops) Init(0) Optimization
 Enable conservative small loop unrolling.
 
 mlam=
diff --git a/gcc/testsuite/gcc.target/i386/pr116065.c 
b/gcc/testsuite/gcc.target/i386/pr116065.c
new file mode 100644
index 000000000000..083e70f2413f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr116065.c
@@ -0,0 +1,24 @@
+/* PR target/116065  */
+/* { dg-do compile } */
+/* { dg-options "-O1 -mno-avx" } */
+
+#ifndef __AVX__
+#pragma GCC push_options
+#pragma GCC target("avx")
+#define __DISABLE_AVX__
+#endif /* __AVX__ */
+
+extern inline double __attribute__((__gnu_inline__,__always_inline__))
+     foo (double x) { return x; }
+
+#ifdef __DISABLE_AVX__
+#undef __DISABLE_AVX__
+#pragma GCC pop_options
+#endif /* __DISABLE_AVX__ */
+
+void __attribute__((target ("avx"), optimize(3)))
+bar (double *p)
+{
+  *p = foo (*p);
+}
+

Reply via email to