Append target/optimize attr to the current cmdline.
gcc/c-family/ChangeLog: * c-common.c (parse_optimize_options): Combine optimize options with what was provided on the command line. gcc/ChangeLog: * toplev.c (toplev::main): Save decoded optimization options. * toplev.h (save_opt_decoded_options): New. * doc/extend.texi: Be more clear about optimize and target attributes. gcc/testsuite/ChangeLog: * gcc.target/i386/avx512er-vrsqrt28ps-3.c: Disable fast math. * gcc.target/i386/avx512er-vrsqrt28ps-5.c: Likewise. * gcc.target/i386/attr-optimize.c: New test.
This commit is contained in:
parent
97909f80fd
commit
6de9f0c13b
7 changed files with 56 additions and 6 deletions
|
@ -5904,9 +5904,22 @@ parse_optimize_options (tree args, bool attr_p)
|
|||
j++;
|
||||
}
|
||||
decoded_options_count = j;
|
||||
/* And apply them. */
|
||||
|
||||
/* Merge the decoded options with save_decoded_options. */
|
||||
unsigned save_opt_count = save_opt_decoded_options.length ();
|
||||
unsigned merged_decoded_options_count
|
||||
= save_opt_count + decoded_options_count;
|
||||
cl_decoded_option *merged_decoded_options
|
||||
= XNEWVEC (cl_decoded_option, merged_decoded_options_count);
|
||||
|
||||
for (unsigned i = 0; i < save_opt_count; ++i)
|
||||
merged_decoded_options[i] = save_opt_decoded_options[i];
|
||||
for (unsigned i = 0; i < decoded_options_count; ++i)
|
||||
merged_decoded_options[save_opt_count + i] = decoded_options[i];
|
||||
|
||||
/* And apply them. */
|
||||
decode_options (&global_options, &global_options_set,
|
||||
decoded_options, decoded_options_count,
|
||||
merged_decoded_options, merged_decoded_options_count,
|
||||
input_location, global_dc, NULL);
|
||||
free (decoded_options);
|
||||
|
||||
|
|
|
@ -3663,7 +3663,10 @@ take function pointer arguments.
|
|||
@cindex @code{optimize} function attribute
|
||||
The @code{optimize} attribute is used to specify that a function is to
|
||||
be compiled with different optimization options than specified on the
|
||||
command line. Valid arguments are constant non-negative integers and
|
||||
command line. The optimize attribute arguments of a function behave
|
||||
behave as if appended to the command-line.
|
||||
|
||||
Valid arguments are constant non-negative integers and
|
||||
strings. Each numeric argument specifies an optimization @var{level}.
|
||||
Each @var{string} argument consists of one or more comma-separated
|
||||
substrings. Each substring that begins with the letter @code{O} refers
|
||||
|
@ -3867,7 +3870,8 @@ This attribute prevents stack protection code for the function.
|
|||
Multiple target back ends implement the @code{target} attribute
|
||||
to specify that a function is to
|
||||
be compiled with different target options than specified on the
|
||||
command line. One or more strings can be provided as arguments.
|
||||
command line. The original target command-line options are ignored.
|
||||
One or more strings can be provided as arguments.
|
||||
Each string consists of one or more comma-separated suffixes to
|
||||
the @code{-m} prefix jointly forming the name of a machine-dependent
|
||||
option. @xref{Submodel Options,,Machine-Dependent Options}.
|
||||
|
|
24
gcc/testsuite/gcc.target/i386/attr-optimize.c
Normal file
24
gcc/testsuite/gcc.target/i386/attr-optimize.c
Normal file
|
@ -0,0 +1,24 @@
|
|||
/* { dg-do compile } */
|
||||
/* { dg-additional-options "-O1 -ftree-slp-vectorize -march=znver1 -fdump-tree-optimized" } */
|
||||
|
||||
/* Use -O2, but -ftree-slp-vectorize option should be preserved and used. */
|
||||
#pragma GCC optimize "-O2"
|
||||
|
||||
typedef struct {
|
||||
long n[4];
|
||||
} secp256k1_fe;
|
||||
|
||||
void *a;
|
||||
int c;
|
||||
static void
|
||||
fn1(secp256k1_fe *p1, int p2)
|
||||
{
|
||||
p1->n[0] = p1->n[1] = p2;
|
||||
}
|
||||
void
|
||||
fn2()
|
||||
{
|
||||
fn1(a, !c);
|
||||
}
|
||||
|
||||
/* { dg-final { scan-tree-dump { MEM <vector\(2\) long int> \[[^]]*\] = } "optimized" } } */
|
|
@ -8,7 +8,7 @@
|
|||
#define MAX 1000
|
||||
#define EPS 0.00001
|
||||
|
||||
__attribute__ ((noinline, optimize (1)))
|
||||
__attribute__ ((noinline, optimize (1, "-fno-fast-math")))
|
||||
void static
|
||||
compute_rsqrt_ref (float *a, float *r)
|
||||
{
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
#define MAX 1000
|
||||
#define EPS 0.00001
|
||||
|
||||
__attribute__ ((noinline, optimize (1)))
|
||||
__attribute__ ((noinline, optimize (1, "-fno-fast-math")))
|
||||
void static
|
||||
compute_sqrt_ref (float *a, float *r)
|
||||
{
|
||||
|
|
|
@ -121,6 +121,9 @@ static bool no_backend;
|
|||
struct cl_decoded_option *save_decoded_options;
|
||||
unsigned int save_decoded_options_count;
|
||||
|
||||
/* Vector of saved Optimization decoded command line options. */
|
||||
auto_vec<cl_decoded_option> save_opt_decoded_options;
|
||||
|
||||
/* Used to enable -fvar-tracking, -fweb and -frename-registers according
|
||||
to optimize in process_options (). */
|
||||
#define AUTODETECT_VALUE 2
|
||||
|
@ -2334,6 +2337,11 @@ toplev::main (int argc, char **argv)
|
|||
&save_decoded_options,
|
||||
&save_decoded_options_count);
|
||||
|
||||
/* Save Optimization decoded options. */
|
||||
for (unsigned i = 0; i < save_decoded_options_count; ++i)
|
||||
if (cl_options[save_decoded_options[i].opt_index].flags & CL_OPTIMIZATION)
|
||||
save_opt_decoded_options.safe_push (save_decoded_options[i]);
|
||||
|
||||
/* Perform language-specific options initialization. */
|
||||
lang_hooks.init_options (save_decoded_options_count, save_decoded_options);
|
||||
|
||||
|
|
|
@ -23,6 +23,7 @@ along with GCC; see the file COPYING3. If not see
|
|||
/* Decoded options, and number of such options. */
|
||||
extern struct cl_decoded_option *save_decoded_options;
|
||||
extern unsigned int save_decoded_options_count;
|
||||
extern auto_vec<cl_decoded_option> save_opt_decoded_options;
|
||||
|
||||
class timer;
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue