Message ID | 20151016223803.GA25108@intel.com |
---|---|
State | New |
Headers | show |
On Sat, Oct 17, 2015 at 12:38 AM, H.J. Lu <hongjiu.lu@intel.com> wrote: > When processing __attribute__ ((target("arch=XXX"))), we should clear > the ISA bits in x_ix86_isa_flags first to avoid leaking ISA from > command line. > > Tested on x86-64. OK for trunk? OK. Thanks, Uros. > Thanks. > > H.J. > --- > gcc/ > > PR target/67995 > * config/i386/i386.c (ix86_valid_target_attribute_tree): If > arch= is set, clear all bits in x_ix86_isa_flags, except for > ISA_64BIT, ABI_64, ABI_X32, and CODE16. > > gcc/testsuite/ > > PR target/67995 > * gcc.target/i386/pr67995-1.c: New test. > * gcc.target/i386/pr67995-2.c: Likewise. > * gcc.target/i386/pr67995-3.c: Likewise. > --- > gcc/config/i386/i386.c | 13 ++++++++++++- > gcc/testsuite/gcc.target/i386/pr67995-1.c | 16 ++++++++++++++++ > gcc/testsuite/gcc.target/i386/pr67995-2.c | 16 ++++++++++++++++ > gcc/testsuite/gcc.target/i386/pr67995-3.c | 16 ++++++++++++++++ > 4 files changed, 60 insertions(+), 1 deletion(-) > create mode 100644 gcc/testsuite/gcc.target/i386/pr67995-1.c > create mode 100644 gcc/testsuite/gcc.target/i386/pr67995-2.c > create mode 100644 gcc/testsuite/gcc.target/i386/pr67995-3.c > > diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c > index d0e1f4c..b0281c9 100644 > --- a/gcc/config/i386/i386.c > +++ b/gcc/config/i386/i386.c > @@ -6145,7 +6145,18 @@ ix86_valid_target_attribute_tree (tree args, > /* If we are using the default tune= or arch=, undo the string assigned, > and use the default. */ > if (option_strings[IX86_FUNCTION_SPECIFIC_ARCH]) > - opts->x_ix86_arch_string = option_strings[IX86_FUNCTION_SPECIFIC_ARCH]; > + { > + opts->x_ix86_arch_string > + = option_strings[IX86_FUNCTION_SPECIFIC_ARCH]; > + > + /* If arch= is set, clear all bits in x_ix86_isa_flags, > + except for ISA_64BIT, ABI_64, ABI_X32, and CODE16. */ > + opts->x_ix86_isa_flags &= (OPTION_MASK_ISA_64BIT > + | OPTION_MASK_ABI_64 > + | OPTION_MASK_ABI_X32 > + | OPTION_MASK_CODE16); > + > + } > else if (!orig_arch_specified) > opts->x_ix86_arch_string = NULL; > > diff --git a/gcc/testsuite/gcc.target/i386/pr67995-1.c b/gcc/testsuite/gcc.target/i386/pr67995-1.c > new file mode 100644 > index 0000000..072b1fe > --- /dev/null > +++ b/gcc/testsuite/gcc.target/i386/pr67995-1.c > @@ -0,0 +1,16 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O2 -march=haswell" } */ > + > +unsigned int > +__attribute__ ((target("arch=core2"))) > +__x86_rdrand(void) > +{ > + unsigned int retries = 100; > + unsigned int val; > + > + while (__builtin_ia32_rdrand32_step(&val) == 0) /* { dg-error "needs isa option" } */ > + if (--retries == 0) > + return 0; > + > + return val; > +} > diff --git a/gcc/testsuite/gcc.target/i386/pr67995-2.c b/gcc/testsuite/gcc.target/i386/pr67995-2.c > new file mode 100644 > index 0000000..632bb63 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/i386/pr67995-2.c > @@ -0,0 +1,16 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O2 -march=core2" } */ > + > +unsigned int > +__attribute__ ((target("arch=haswell"))) > +__x86_rdrand(void) > +{ > + unsigned int retries = 100; > + unsigned int val; > + > + while (__builtin_ia32_rdrand32_step(&val) == 0) > + if (--retries == 0) > + return 0; > + > + return val; > +} > diff --git a/gcc/testsuite/gcc.target/i386/pr67995-3.c b/gcc/testsuite/gcc.target/i386/pr67995-3.c > new file mode 100644 > index 0000000..11993b7 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/i386/pr67995-3.c > @@ -0,0 +1,16 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O2 -march=core2" } */ > + > +unsigned int > +__attribute__ ((target("rdrnd"))) > +__x86_rdrand(void) > +{ > + unsigned int retries = 100; > + unsigned int val; > + > + while (__builtin_ia32_rdrand32_step(&val) == 0) > + if (--retries == 0) > + return 0; > + > + return val; > +} > -- > 2.4.3 >
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index d0e1f4c..b0281c9 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -6145,7 +6145,18 @@ ix86_valid_target_attribute_tree (tree args, /* If we are using the default tune= or arch=, undo the string assigned, and use the default. */ if (option_strings[IX86_FUNCTION_SPECIFIC_ARCH]) - opts->x_ix86_arch_string = option_strings[IX86_FUNCTION_SPECIFIC_ARCH]; + { + opts->x_ix86_arch_string + = option_strings[IX86_FUNCTION_SPECIFIC_ARCH]; + + /* If arch= is set, clear all bits in x_ix86_isa_flags, + except for ISA_64BIT, ABI_64, ABI_X32, and CODE16. */ + opts->x_ix86_isa_flags &= (OPTION_MASK_ISA_64BIT + | OPTION_MASK_ABI_64 + | OPTION_MASK_ABI_X32 + | OPTION_MASK_CODE16); + + } else if (!orig_arch_specified) opts->x_ix86_arch_string = NULL; diff --git a/gcc/testsuite/gcc.target/i386/pr67995-1.c b/gcc/testsuite/gcc.target/i386/pr67995-1.c new file mode 100644 index 0000000..072b1fe --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr67995-1.c @@ -0,0 +1,16 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -march=haswell" } */ + +unsigned int +__attribute__ ((target("arch=core2"))) +__x86_rdrand(void) +{ + unsigned int retries = 100; + unsigned int val; + + while (__builtin_ia32_rdrand32_step(&val) == 0) /* { dg-error "needs isa option" } */ + if (--retries == 0) + return 0; + + return val; +} diff --git a/gcc/testsuite/gcc.target/i386/pr67995-2.c b/gcc/testsuite/gcc.target/i386/pr67995-2.c new file mode 100644 index 0000000..632bb63 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr67995-2.c @@ -0,0 +1,16 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -march=core2" } */ + +unsigned int +__attribute__ ((target("arch=haswell"))) +__x86_rdrand(void) +{ + unsigned int retries = 100; + unsigned int val; + + while (__builtin_ia32_rdrand32_step(&val) == 0) + if (--retries == 0) + return 0; + + return val; +} diff --git a/gcc/testsuite/gcc.target/i386/pr67995-3.c b/gcc/testsuite/gcc.target/i386/pr67995-3.c new file mode 100644 index 0000000..11993b7 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr67995-3.c @@ -0,0 +1,16 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -march=core2" } */ + +unsigned int +__attribute__ ((target("rdrnd"))) +__x86_rdrand(void) +{ + unsigned int retries = 100; + unsigned int val; + + while (__builtin_ia32_rdrand32_step(&val) == 0) + if (--retries == 0) + return 0; + + return val; +}