public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH] rs6000: Fix restored rs6000_long_double_type_size.
@ 2021-06-23 13:22 Martin Liška
  2021-06-23 22:46 ` Segher Boessenkool
  0 siblings, 1 reply; 16+ messages in thread
From: Martin Liška @ 2021-06-23 13:22 UTC (permalink / raw)
  To: gcc-patches; +Cc: Segher Boessenkool

Hello.

As mentioned in the "Fallout: save/restore target options in handle_optimize_attribute"
thread, we need to support target option restore of rs6000_long_double_type_size == FLOAT_PRECISION_TFmode.

Patch can bootstrap on ppc64le-linux-gnu and survives regression tests.

Ready to be installed?
Thanks,
Martin

gcc/ChangeLog:

	* config/rs6000/rs6000.c (rs6000_option_override_internal): When
	a target option is restored, it can have
	rs6000_long_double_type_size set to FLOAT_PRECISION_TFmode.

gcc/testsuite/ChangeLog:

	* gcc.target/powerpc/pragma-optimize.c: New test.
---
  gcc/config/rs6000/rs6000.c                         |  2 ++
  gcc/testsuite/gcc.target/powerpc/pragma-optimize.c | 14 ++++++++++++++
  2 files changed, 16 insertions(+)
  create mode 100644 gcc/testsuite/gcc.target/powerpc/pragma-optimize.c

diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index 835af7708f9..2c811480db9 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -4185,6 +4185,8 @@ rs6000_option_override_internal (bool global_init_p)
        else
  	rs6000_long_double_type_size = default_long_double_size;
      }
+  else if (rs6000_long_double_type_size == FLOAT_PRECISION_TFmode)
+    ; /* The option can be restored a TREE_TARGET_OPTION.  */
    else if (rs6000_long_double_type_size == 128)
      rs6000_long_double_type_size = FLOAT_PRECISION_TFmode;
    else if (global_options_set.x_rs6000_ieeequad)
diff --git a/gcc/testsuite/gcc.target/powerpc/pragma-optimize.c b/gcc/testsuite/gcc.target/powerpc/pragma-optimize.c
new file mode 100644
index 00000000000..629bfcee0ec
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/pragma-optimize.c
@@ -0,0 +1,14 @@
+/* { dg-do compile { target { powerpc*-*-linux* } } } */
+/* { dg-options "-O2 -mlong-double-128 -mabi=ibmlongdouble" } */
+
+extern unsigned long int x;
+extern float f (float);
+extern __typeof (f) f_power8;
+extern __typeof (f) f_power9;
+extern __typeof (f) f __attribute__ ((ifunc ("f_ifunc")));
+static __attribute__ ((optimize ("-fno-stack-protector"))) __typeof (f) *
+f_ifunc (void)
+{
+  __typeof (f) *res = x ? f_power9 : f_power8;
+  return res;
+}
-- 
2.32.0


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH] rs6000: Fix restored rs6000_long_double_type_size.
  2021-06-23 13:22 [PATCH] rs6000: Fix restored rs6000_long_double_type_size Martin Liška
@ 2021-06-23 22:46 ` Segher Boessenkool
  2021-06-28 12:19   ` Martin Liška
  0 siblings, 1 reply; 16+ messages in thread
From: Segher Boessenkool @ 2021-06-23 22:46 UTC (permalink / raw)
  To: Martin Liška; +Cc: gcc-patches

Hi!

On Wed, Jun 23, 2021 at 03:22:34PM +0200, Martin Liška wrote:
> As mentioned in the "Fallout: save/restore target options in 
> handle_optimize_attribute"
> thread, we need to support target option restore of 
> rs6000_long_double_type_size == FLOAT_PRECISION_TFmode.

I have no idea?  Could you explain please?

> --- a/gcc/config/rs6000/rs6000.c
> +++ b/gcc/config/rs6000/rs6000.c
> @@ -4185,6 +4185,8 @@ rs6000_option_override_internal (bool global_init_p)
>        else
>  	rs6000_long_double_type_size = default_long_double_size;
>      }
> +  else if (rs6000_long_double_type_size == FLOAT_PRECISION_TFmode)
> +    ; /* The option can be restored a TREE_TARGET_OPTION.  */

What does that mean?  It is not grammatical, and not obvious what it
should mean.

> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/pragma-optimize.c
> @@ -0,0 +1,14 @@
> +/* { dg-do compile { target { powerpc*-*-linux* } } } */

Why on Linux only?  That doesn't sound right.  Do you need some other
selector(s)?

> +/* { dg-options "-O2 -mlong-double-128 -mabi=ibmlongdouble" } */
> +
> +extern unsigned long int x;
> +extern float f (float);
> +extern __typeof (f) f_power8;
> +extern __typeof (f) f_power9;
> +extern __typeof (f) f __attribute__ ((ifunc ("f_ifunc")));
> +static __attribute__ ((optimize ("-fno-stack-protector"))) __typeof (f) *

-fno-stack-protector is default.

> +f_ifunc (void)
> +{
> +  __typeof (f) *res = x ? f_power9 : f_power8;
> +  return res;
> +}

The testcase should say what it is testing for, it is not obvious?


Segher

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH] rs6000: Fix restored rs6000_long_double_type_size.
  2021-06-23 22:46 ` Segher Boessenkool
@ 2021-06-28 12:19   ` Martin Liška
  2021-07-12  4:19     ` Martin Liška
  2021-07-12 17:20     ` Segher Boessenkool
  0 siblings, 2 replies; 16+ messages in thread
From: Martin Liška @ 2021-06-28 12:19 UTC (permalink / raw)
  To: Segher Boessenkool; +Cc: gcc-patches

[-- Attachment #1: Type: text/plain, Size: 2147 bytes --]

On 6/24/21 12:46 AM, Segher Boessenkool wrote:
> Hi!
> 
> On Wed, Jun 23, 2021 at 03:22:34PM +0200, Martin Liška wrote:
>> As mentioned in the "Fallout: save/restore target options in
>> handle_optimize_attribute"
>> thread, we need to support target option restore of
>> rs6000_long_double_type_size == FLOAT_PRECISION_TFmode.
> 
> I have no idea?  Could you explain please?

Sure. Few weeks ago, we started using cl_target_option_{save,restore} calls
even for optimize attributes (and pragma). Motivation was that optimize options
can influence target options (and vice versa).

Doing that, FLOAT_PRECISION_TFmode must be accepted as a valid option value
for rs6000_long_double_type_size.

> 
>> --- a/gcc/config/rs6000/rs6000.c
>> +++ b/gcc/config/rs6000/rs6000.c
>> @@ -4185,6 +4185,8 @@ rs6000_option_override_internal (bool global_init_p)
>>         else
>>   	rs6000_long_double_type_size = default_long_double_size;
>>       }
>> +  else if (rs6000_long_double_type_size == FLOAT_PRECISION_TFmode)
>> +    ; /* The option can be restored a TREE_TARGET_OPTION.  */
> 
> What does that mean?  It is not grammatical, and not obvious what it
> should mean.

Updated.

> 
>> --- /dev/null
>> +++ b/gcc/testsuite/gcc.target/powerpc/pragma-optimize.c
>> @@ -0,0 +1,14 @@
>> +/* { dg-do compile { target { powerpc*-*-linux* } } } */
> 
> Why on Linux only?  That doesn't sound right.  Do you need some other
> selector(s)?

Sorry, I copied the test-case.

> 
>> +/* { dg-options "-O2 -mlong-double-128 -mabi=ibmlongdouble" } */
>> +
>> +extern unsigned long int x;
>> +extern float f (float);
>> +extern __typeof (f) f_power8;
>> +extern __typeof (f) f_power9;
>> +extern __typeof (f) f __attribute__ ((ifunc ("f_ifunc")));
>> +static __attribute__ ((optimize ("-fno-stack-protector"))) __typeof (f) *
> 
> -fno-stack-protector is default.

Yes, but one needs an optimize attribute in order to trigger cl_target_option_save/restore
mechanism.

Martin

> 
>> +f_ifunc (void)
>> +{
>> +  __typeof (f) *res = x ? f_power9 : f_power8;
>> +  return res;
>> +}
> 
> The testcase should say what it is testing for, it is not obvious?
> 
> 
> Segher
> 


[-- Attachment #2: 0001-rs6000-Fix-restored-rs6000_long_double_type_size.patch --]
[-- Type: text/x-patch, Size: 2070 bytes --]

From 1632939853fbf193f72ace3d1024a137d549fef4 Mon Sep 17 00:00:00 2001
From: Martin Liska <mliska@suse.cz>
Date: Tue, 1 Jun 2021 15:39:14 +0200
Subject: [PATCH] rs6000: Fix restored rs6000_long_double_type_size.

gcc/ChangeLog:

	* config/rs6000/rs6000.c (rs6000_option_override_internal): When
	a target option is restored, it can have
	rs6000_long_double_type_size set to FLOAT_PRECISION_TFmode.

gcc/testsuite/ChangeLog:

	* gcc.target/powerpc/pragma-optimize.c: New test.
---
 gcc/config/rs6000/rs6000.c                         |  2 ++
 gcc/testsuite/gcc.target/powerpc/pragma-optimize.c | 14 ++++++++++++++
 2 files changed, 16 insertions(+)
 create mode 100644 gcc/testsuite/gcc.target/powerpc/pragma-optimize.c

diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index 2c249e186e1..fa4aa864c00 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -4185,6 +4185,8 @@ rs6000_option_override_internal (bool global_init_p)
       else
 	rs6000_long_double_type_size = default_long_double_size;
     }
+  else if (rs6000_long_double_type_size == FLOAT_PRECISION_TFmode)
+    ; /* The option can be restored with cl_target_option_restore.  */
   else if (rs6000_long_double_type_size == 128)
     rs6000_long_double_type_size = FLOAT_PRECISION_TFmode;
   else if (global_options_set.x_rs6000_ieeequad)
diff --git a/gcc/testsuite/gcc.target/powerpc/pragma-optimize.c b/gcc/testsuite/gcc.target/powerpc/pragma-optimize.c
new file mode 100644
index 00000000000..2455fb57138
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/pragma-optimize.c
@@ -0,0 +1,14 @@
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-options "-O2 -mlong-double-128 -mabi=ibmlongdouble" } */
+
+extern unsigned long int x;
+extern float f (float);
+extern __typeof (f) f_power8;
+extern __typeof (f) f_power9;
+extern __typeof (f) f __attribute__ ((ifunc ("f_ifunc")));
+static __attribute__ ((optimize ("-fno-stack-protector"))) __typeof (f) *
+f_ifunc (void)
+{
+  __typeof (f) *res = x ? f_power9 : f_power8;
+  return res;
+}
-- 
2.32.0


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH] rs6000: Fix restored rs6000_long_double_type_size.
  2021-06-28 12:19   ` Martin Liška
@ 2021-07-12  4:19     ` Martin Liška
  2021-07-12 17:00       ` Segher Boessenkool
  2021-07-12 17:20     ` Segher Boessenkool
  1 sibling, 1 reply; 16+ messages in thread
From: Martin Liška @ 2021-07-12  4:19 UTC (permalink / raw)
  To: Segher Boessenkool; +Cc: gcc-patches

PING^1

On 6/28/21 2:19 PM, Martin Liška wrote:
> On 6/24/21 12:46 AM, Segher Boessenkool wrote:
>> Hi!
>>
>> On Wed, Jun 23, 2021 at 03:22:34PM +0200, Martin Liška wrote:
>>> As mentioned in the "Fallout: save/restore target options in
>>> handle_optimize_attribute"
>>> thread, we need to support target option restore of
>>> rs6000_long_double_type_size == FLOAT_PRECISION_TFmode.
>>
>> I have no idea?  Could you explain please?
> 
> Sure. Few weeks ago, we started using cl_target_option_{save,restore} calls
> even for optimize attributes (and pragma). Motivation was that optimize options
> can influence target options (and vice versa).
> 
> Doing that, FLOAT_PRECISION_TFmode must be accepted as a valid option value
> for rs6000_long_double_type_size.
> 
>>
>>> --- a/gcc/config/rs6000/rs6000.c
>>> +++ b/gcc/config/rs6000/rs6000.c
>>> @@ -4185,6 +4185,8 @@ rs6000_option_override_internal (bool global_init_p)
>>>         else
>>>       rs6000_long_double_type_size = default_long_double_size;
>>>       }
>>> +  else if (rs6000_long_double_type_size == FLOAT_PRECISION_TFmode)
>>> +    ; /* The option can be restored a TREE_TARGET_OPTION.  */
>>
>> What does that mean?  It is not grammatical, and not obvious what it
>> should mean.
> 
> Updated.
> 
>>
>>> --- /dev/null
>>> +++ b/gcc/testsuite/gcc.target/powerpc/pragma-optimize.c
>>> @@ -0,0 +1,14 @@
>>> +/* { dg-do compile { target { powerpc*-*-linux* } } } */
>>
>> Why on Linux only?  That doesn't sound right.  Do you need some other
>> selector(s)?
> 
> Sorry, I copied the test-case.
> 
>>
>>> +/* { dg-options "-O2 -mlong-double-128 -mabi=ibmlongdouble" } */
>>> +
>>> +extern unsigned long int x;
>>> +extern float f (float);
>>> +extern __typeof (f) f_power8;
>>> +extern __typeof (f) f_power9;
>>> +extern __typeof (f) f __attribute__ ((ifunc ("f_ifunc")));
>>> +static __attribute__ ((optimize ("-fno-stack-protector"))) __typeof (f) *
>>
>> -fno-stack-protector is default.
> 
> Yes, but one needs an optimize attribute in order to trigger cl_target_option_save/restore
> mechanism.
> 
> Martin
> 
>>
>>> +f_ifunc (void)
>>> +{
>>> +  __typeof (f) *res = x ? f_power9 : f_power8;
>>> +  return res;
>>> +}
>>
>> The testcase should say what it is testing for, it is not obvious?
>>
>>
>> Segher
>>
> 


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH] rs6000: Fix restored rs6000_long_double_type_size.
  2021-07-12  4:19     ` Martin Liška
@ 2021-07-12 17:00       ` Segher Boessenkool
  0 siblings, 0 replies; 16+ messages in thread
From: Segher Boessenkool @ 2021-07-12 17:00 UTC (permalink / raw)
  To: Martin Liška; +Cc: gcc-patches

On Mon, Jul 12, 2021 at 06:19:28AM +0200, Martin Liška wrote:
> PING^1

I did not notice you attached a new patch.  It works a lot better if
every patch series is a new thread.


Segher

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH] rs6000: Fix restored rs6000_long_double_type_size.
  2021-06-28 12:19   ` Martin Liška
  2021-07-12  4:19     ` Martin Liška
@ 2021-07-12 17:20     ` Segher Boessenkool
  2021-07-23  5:45       ` Martin Liska
                         ` (4 more replies)
  1 sibling, 5 replies; 16+ messages in thread
From: Segher Boessenkool @ 2021-07-12 17:20 UTC (permalink / raw)
  To: Martin Liška; +Cc: gcc-patches

On Mon, Jun 28, 2021 at 02:19:03PM +0200, Martin Liška wrote:
> On 6/24/21 12:46 AM, Segher Boessenkool wrote:
> >>As mentioned in the "Fallout: save/restore target options in
> >>handle_optimize_attribute"
> >>thread, we need to support target option restore of
> >>rs6000_long_double_type_size == FLOAT_PRECISION_TFmode.
> >
> >I have no idea?  Could you explain please?
> 
> Sure. Few weeks ago, we started using cl_target_option_{save,restore} calls
> even for optimize attributes (and pragma). Motivation was that optimize 
> options
> can influence target options (and vice versa).
> 
> Doing that, FLOAT_PRECISION_TFmode must be accepted as a valid option value
> for rs6000_long_double_type_size.


> >>--- /dev/null
> >>+++ b/gcc/testsuite/gcc.target/powerpc/pragma-optimize.c
> >>@@ -0,0 +1,14 @@
> >>+/* { dg-do compile { target { powerpc*-*-linux* } } } */
> >
> >Why on Linux only?  That doesn't sound right.  Do you need some other
> >selector(s)?
> 
> Sorry, I copied the test-case.

Ugh.  Yes, the status quo is no good either :-(

> >>+/* { dg-options "-O2 -mlong-double-128 -mabi=ibmlongdouble" } */
> >>+
> >>+extern unsigned long int x;
> >>+extern float f (float);
> >>+extern __typeof (f) f_power8;
> >>+extern __typeof (f) f_power9;
> >>+extern __typeof (f) f __attribute__ ((ifunc ("f_ifunc")));
> >>+static __attribute__ ((optimize ("-fno-stack-protector"))) __typeof (f) *
> >
> >-fno-stack-protector is default.
> 
> Yes, but one needs an optimize attribute in order to trigger 
> cl_target_option_save/restore
> mechanism.

So it behaves differently if you select the default than if you do not
select anything?  That is wrong, no?

> >From 1632939853fbf193f72ace3d1024a137d549fef4 Mon Sep 17 00:00:00 2001
> From: Martin Liska <mliska@suse.cz>
> Date: Tue, 1 Jun 2021 15:39:14 +0200
> Subject: [PATCH] rs6000: Fix restored rs6000_long_double_type_size.

(No full stop at end of subject please)

Missing patch description here.  This should be suitable as commit
message when you eventually commit the patch.

Please send with that, as a separate mail, not as attachment to another
thread.

> gcc/ChangeLog:
> 
> 	* config/rs6000/rs6000.c (rs6000_option_override_internal): When
> 	a target option is restored, it can have
> 	rs6000_long_double_type_size set to FLOAT_PRECISION_TFmode.

That does not say what changed?

> --- a/gcc/config/rs6000/rs6000.c
> +++ b/gcc/config/rs6000/rs6000.c
> @@ -4185,6 +4185,8 @@ rs6000_option_override_internal (bool global_init_p)
>        else
>  	rs6000_long_double_type_size = default_long_double_size;
>      }
> +  else if (rs6000_long_double_type_size == FLOAT_PRECISION_TFmode)
> +    ; /* The option can be restored with cl_target_option_restore.  */
>    else if (rs6000_long_double_type_size == 128)
>      rs6000_long_double_type_size = FLOAT_PRECISION_TFmode;
>    else if (global_options_set.x_rs6000_ieeequad)

"The option can be restored" is more confusing than helpful.  *Will* be
restored by it, maybe?  Not that I understand what that means :-/

Does it make more sense to merge the 128 and FLOAT_PRECISION_TFmode
cases?

> diff --git a/gcc/testsuite/gcc.target/powerpc/pragma-optimize.c b/gcc/testsuite/gcc.target/powerpc/pragma-optimize.c
> new file mode 100644
> index 00000000000..2455fb57138
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/powerpc/pragma-optimize.c
> @@ -0,0 +1,14 @@
> +/* { dg-do compile { target { powerpc*-*-* } } } */

No target powerpc*-*-* in gcc.target/powerpc please.  This is enforced
for everything in there by powerpc.exp already.

Thanks,


Segher

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH] rs6000: Fix restored rs6000_long_double_type_size
  2021-07-12 17:20     ` Segher Boessenkool
@ 2021-07-23  5:45       ` Martin Liska
  2021-07-23  5:45       ` Martin Liska
                         ` (3 subsequent siblings)
  4 siblings, 0 replies; 16+ messages in thread
From: Martin Liska @ 2021-07-23  5:45 UTC (permalink / raw)
  To: gcc-patches; +Cc: segher

As mentioned in the "Fallout: save/restore target options in handle_optimize_attribute"
thread, we need to support target option restore
of rs6000_long_double_type_size == FLOAT_PRECISION_TFmode.

gcc/ChangeLog:

	* config/rs6000/rs6000.c (rs6000_option_override_internal): When
	a target option is restored, it can have
	rs6000_long_double_type_size set to FLOAT_PRECISION_TFmode
	and error should not be emitted.

gcc/testsuite/ChangeLog:

	* gcc.target/powerpc/pragma-optimize.c: New test.
---
 gcc/config/rs6000/rs6000.c                         |  2 ++
 gcc/testsuite/gcc.target/powerpc/pragma-optimize.c | 13 +++++++++++++
 2 files changed, 15 insertions(+)
 create mode 100644 gcc/testsuite/gcc.target/powerpc/pragma-optimize.c

diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index 279f00cc648..510936a9948 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -4186,6 +4186,8 @@ rs6000_option_override_internal (bool global_init_p)
       else
 	rs6000_long_double_type_size = default_long_double_size;
     }
+  else if (rs6000_long_double_type_size == FLOAT_PRECISION_TFmode)
+    ; /* The option value can be seen when cl_target_option_restore is called.  */
   else if (rs6000_long_double_type_size == 128)
     rs6000_long_double_type_size = FLOAT_PRECISION_TFmode;
   else if (global_options_set.x_rs6000_ieeequad)
diff --git a/gcc/testsuite/gcc.target/powerpc/pragma-optimize.c b/gcc/testsuite/gcc.target/powerpc/pragma-optimize.c
new file mode 100644
index 00000000000..4a86b58f27c
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/pragma-optimize.c
@@ -0,0 +1,13 @@
+/* { dg-options "-O2 -mlong-double-128 -mabi=ibmlongdouble" } */
+
+extern unsigned long int x;
+extern float f (float);
+extern __typeof (f) f_power8;
+extern __typeof (f) f_power9;
+extern __typeof (f) f __attribute__ ((ifunc ("f_ifunc")));
+static __attribute__ ((optimize ("-fno-stack-protector"))) __typeof (f) *
+f_ifunc (void)
+{
+  __typeof (f) *res = x ? f_power9 : f_power8;
+  return res;
+}
-- 
2.32.0


^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH] rs6000: Fix restored rs6000_long_double_type_size
  2021-07-12 17:20     ` Segher Boessenkool
  2021-07-23  5:45       ` Martin Liska
@ 2021-07-23  5:45       ` Martin Liska
  2021-07-23  5:45       ` Martin Liska
                         ` (2 subsequent siblings)
  4 siblings, 0 replies; 16+ messages in thread
From: Martin Liska @ 2021-07-23  5:45 UTC (permalink / raw)
  To: gcc-patches; +Cc: segher

As mentioned in the "Fallout: save/restore target options in handle_optimize_attribute"
thread, we need to support target option restore
of rs6000_long_double_type_size == FLOAT_PRECISION_TFmode.

gcc/ChangeLog:

	* config/rs6000/rs6000.c (rs6000_option_override_internal): When
	a target option is restored, it can have
	rs6000_long_double_type_size set to FLOAT_PRECISION_TFmode
	and error should not be emitted.

gcc/testsuite/ChangeLog:

	* gcc.target/powerpc/pragma-optimize.c: New test.
---
 gcc/config/rs6000/rs6000.c                         |  2 ++
 gcc/testsuite/gcc.target/powerpc/pragma-optimize.c | 13 +++++++++++++
 2 files changed, 15 insertions(+)
 create mode 100644 gcc/testsuite/gcc.target/powerpc/pragma-optimize.c

diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index 279f00cc648..510936a9948 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -4186,6 +4186,8 @@ rs6000_option_override_internal (bool global_init_p)
       else
 	rs6000_long_double_type_size = default_long_double_size;
     }
+  else if (rs6000_long_double_type_size == FLOAT_PRECISION_TFmode)
+    ; /* The option value can be seen when cl_target_option_restore is called.  */
   else if (rs6000_long_double_type_size == 128)
     rs6000_long_double_type_size = FLOAT_PRECISION_TFmode;
   else if (global_options_set.x_rs6000_ieeequad)
diff --git a/gcc/testsuite/gcc.target/powerpc/pragma-optimize.c b/gcc/testsuite/gcc.target/powerpc/pragma-optimize.c
new file mode 100644
index 00000000000..4a86b58f27c
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/pragma-optimize.c
@@ -0,0 +1,13 @@
+/* { dg-options "-O2 -mlong-double-128 -mabi=ibmlongdouble" } */
+
+extern unsigned long int x;
+extern float f (float);
+extern __typeof (f) f_power8;
+extern __typeof (f) f_power9;
+extern __typeof (f) f __attribute__ ((ifunc ("f_ifunc")));
+static __attribute__ ((optimize ("-fno-stack-protector"))) __typeof (f) *
+f_ifunc (void)
+{
+  __typeof (f) *res = x ? f_power9 : f_power8;
+  return res;
+}
-- 
2.32.0


^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH] rs6000: Fix restored rs6000_long_double_type_size
  2021-07-12 17:20     ` Segher Boessenkool
  2021-07-23  5:45       ` Martin Liska
  2021-07-23  5:45       ` Martin Liska
@ 2021-07-23  5:45       ` Martin Liska
  2021-07-23  5:47       ` Martin Liška
       [not found]       ` <202107230545.16N5jkeY006982@gate.crashing.org>
  4 siblings, 0 replies; 16+ messages in thread
From: Martin Liska @ 2021-07-23  5:45 UTC (permalink / raw)
  To: gcc-patches; +Cc: segher

As mentioned in the "Fallout: save/restore target options in handle_optimize_attribute"
thread, we need to support target option restore
of rs6000_long_double_type_size == FLOAT_PRECISION_TFmode.

gcc/ChangeLog:

	* config/rs6000/rs6000.c (rs6000_option_override_internal): When
	a target option is restored, it can have
	rs6000_long_double_type_size set to FLOAT_PRECISION_TFmode
	and error should not be emitted.

gcc/testsuite/ChangeLog:

	* gcc.target/powerpc/pragma-optimize.c: New test.
---
 gcc/config/rs6000/rs6000.c                         |  2 ++
 gcc/testsuite/gcc.target/powerpc/pragma-optimize.c | 13 +++++++++++++
 2 files changed, 15 insertions(+)
 create mode 100644 gcc/testsuite/gcc.target/powerpc/pragma-optimize.c

diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index 279f00cc648..510936a9948 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -4186,6 +4186,8 @@ rs6000_option_override_internal (bool global_init_p)
       else
 	rs6000_long_double_type_size = default_long_double_size;
     }
+  else if (rs6000_long_double_type_size == FLOAT_PRECISION_TFmode)
+    ; /* The option value can be seen when cl_target_option_restore is called.  */
   else if (rs6000_long_double_type_size == 128)
     rs6000_long_double_type_size = FLOAT_PRECISION_TFmode;
   else if (global_options_set.x_rs6000_ieeequad)
diff --git a/gcc/testsuite/gcc.target/powerpc/pragma-optimize.c b/gcc/testsuite/gcc.target/powerpc/pragma-optimize.c
new file mode 100644
index 00000000000..4a86b58f27c
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/pragma-optimize.c
@@ -0,0 +1,13 @@
+/* { dg-options "-O2 -mlong-double-128 -mabi=ibmlongdouble" } */
+
+extern unsigned long int x;
+extern float f (float);
+extern __typeof (f) f_power8;
+extern __typeof (f) f_power9;
+extern __typeof (f) f __attribute__ ((ifunc ("f_ifunc")));
+static __attribute__ ((optimize ("-fno-stack-protector"))) __typeof (f) *
+f_ifunc (void)
+{
+  __typeof (f) *res = x ? f_power9 : f_power8;
+  return res;
+}
-- 
2.32.0


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH] rs6000: Fix restored rs6000_long_double_type_size.
  2021-07-12 17:20     ` Segher Boessenkool
                         ` (2 preceding siblings ...)
  2021-07-23  5:45       ` Martin Liska
@ 2021-07-23  5:47       ` Martin Liška
  2021-07-23 17:57         ` Segher Boessenkool
       [not found]       ` <202107230545.16N5jkeY006982@gate.crashing.org>
  4 siblings, 1 reply; 16+ messages in thread
From: Martin Liška @ 2021-07-23  5:47 UTC (permalink / raw)
  To: Segher Boessenkool; +Cc: gcc-patches

On 7/12/21 7:20 PM, Segher Boessenkool wrote:
> On Mon, Jun 28, 2021 at 02:19:03PM +0200, Martin Liška wrote:
>> On 6/24/21 12:46 AM, Segher Boessenkool wrote:
>>>> As mentioned in the "Fallout: save/restore target options in
>>>> handle_optimize_attribute"
>>>> thread, we need to support target option restore of
>>>> rs6000_long_double_type_size == FLOAT_PRECISION_TFmode.
>>>
>>> I have no idea?  Could you explain please?
>>
>> Sure. Few weeks ago, we started using cl_target_option_{save,restore} calls
>> even for optimize attributes (and pragma). Motivation was that optimize
>> options
>> can influence target options (and vice versa).
>>
>> Doing that, FLOAT_PRECISION_TFmode must be accepted as a valid option value
>> for rs6000_long_double_type_size.
> 
> 
>>>> --- /dev/null
>>>> +++ b/gcc/testsuite/gcc.target/powerpc/pragma-optimize.c
>>>> @@ -0,0 +1,14 @@
>>>> +/* { dg-do compile { target { powerpc*-*-linux* } } } */
>>>
>>> Why on Linux only?  That doesn't sound right.  Do you need some other
>>> selector(s)?
>>
>> Sorry, I copied the test-case.
> 
> Ugh.  Yes, the status quo is no good either :-(
> 
>>>> +/* { dg-options "-O2 -mlong-double-128 -mabi=ibmlongdouble" } */
>>>> +
>>>> +extern unsigned long int x;
>>>> +extern float f (float);
>>>> +extern __typeof (f) f_power8;
>>>> +extern __typeof (f) f_power9;
>>>> +extern __typeof (f) f __attribute__ ((ifunc ("f_ifunc")));
>>>> +static __attribute__ ((optimize ("-fno-stack-protector"))) __typeof (f) *
>>>
>>> -fno-stack-protector is default.
>>
>> Yes, but one needs an optimize attribute in order to trigger
>> cl_target_option_save/restore
>> mechanism.
> 
> So it behaves differently if you select the default than if you do not
> select anything?  That is wrong, no?

Sorry, I don't get your example, please explain it.

> 
>> >From 1632939853fbf193f72ace3d1024a137d549fef4 Mon Sep 17 00:00:00 2001
>> From: Martin Liska <mliska@suse.cz>
>> Date: Tue, 1 Jun 2021 15:39:14 +0200
>> Subject: [PATCH] rs6000: Fix restored rs6000_long_double_type_size.
> 
> (No full stop at end of subject please)

Done.

> 
> Missing patch description here.  This should be suitable as commit
> message when you eventually commit the patch.
> 
> Please send with that, as a separate mail, not as attachment to another
> thread.

Done.

> 
>> gcc/ChangeLog:
>>
>> 	* config/rs6000/rs6000.c (rs6000_option_override_internal): When
>> 	a target option is restored, it can have
>> 	rs6000_long_double_type_size set to FLOAT_PRECISION_TFmode.
> 
> That does not say what changed?

Updated.

> 
>> --- a/gcc/config/rs6000/rs6000.c
>> +++ b/gcc/config/rs6000/rs6000.c
>> @@ -4185,6 +4185,8 @@ rs6000_option_override_internal (bool global_init_p)
>>         else
>>   	rs6000_long_double_type_size = default_long_double_size;
>>       }
>> +  else if (rs6000_long_double_type_size == FLOAT_PRECISION_TFmode)
>> +    ; /* The option can be restored with cl_target_option_restore.  */
>>     else if (rs6000_long_double_type_size == 128)
>>       rs6000_long_double_type_size = FLOAT_PRECISION_TFmode;
>>     else if (global_options_set.x_rs6000_ieeequad)
> 
> "The option can be restored" is more confusing than helpful.  *Will* be
> restored by it, maybe?  Not that I understand what that means :-/

I updated the wording a bit.

> 
> Does it make more sense to merge the 128 and FLOAT_PRECISION_TFmode
> cases?

Likely not, it's important to assign a reasonable comment to the 128 option value.

> 
>> diff --git a/gcc/testsuite/gcc.target/powerpc/pragma-optimize.c b/gcc/testsuite/gcc.target/powerpc/pragma-optimize.c
>> new file mode 100644
>> index 00000000000..2455fb57138
>> --- /dev/null
>> +++ b/gcc/testsuite/gcc.target/powerpc/pragma-optimize.c
>> @@ -0,0 +1,14 @@
>> +/* { dg-do compile { target { powerpc*-*-* } } } */
> 
> No target powerpc*-*-* in gcc.target/powerpc please.  This is enforced
> for everything in there by powerpc.exp already.

Fixed.

Martin

> 
> Thanks,
> 
> 
> Segher
> 


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH] rs6000: Fix restored rs6000_long_double_type_size.
  2021-07-23  5:47       ` Martin Liška
@ 2021-07-23 17:57         ` Segher Boessenkool
  2021-08-05 12:05           ` Martin Liška
  0 siblings, 1 reply; 16+ messages in thread
From: Segher Boessenkool @ 2021-07-23 17:57 UTC (permalink / raw)
  To: Martin Liška; +Cc: gcc-patches

Hi!

On Fri, Jul 23, 2021 at 07:47:54AM +0200, Martin Liška wrote:
> On 7/12/21 7:20 PM, Segher Boessenkool wrote:
> >>>>+static __attribute__ ((optimize ("-fno-stack-protector"))) __typeof 
> >>>>(f) *
> >>>
> >>>-fno-stack-protector is default.
> >>
> >>Yes, but one needs an optimize attribute in order to trigger
> >>cl_target_option_save/restore
> >>mechanism.
> >
> >So it behaves differently if you select the default than if you do not
> >select anything?  That is wrong, no?
> 
> Sorry, I don't get your example, please explain it.

If -mbork is the default, the coompiler whould behave the same if you
invoke it with -mbork as when you do not.  And the optimize attribute
should work exactly the same as command line options.

Or perhaps you are saying you have this in the testcase only to exercise
the option save/restore code paths?  Please document that then, in the
testcase.


Segher

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH] rs6000: Fix restored rs6000_long_double_type_size
       [not found]       ` <202107230545.16N5jkeY006982@gate.crashing.org>
@ 2021-07-23 18:00         ` Segher Boessenkool
  0 siblings, 0 replies; 16+ messages in thread
From: Segher Boessenkool @ 2021-07-23 18:00 UTC (permalink / raw)
  To: Martin Liska; +Cc: gcc-patches

Hi!

On Tue, Jun 01, 2021 at 03:39:14PM +0200, Martin Liska wrote:
> 	* config/rs6000/rs6000.c (rs6000_option_override_internal): When
> 	a target option is restored, it can have
> 	rs6000_long_double_type_size set to FLOAT_PRECISION_TFmode
> 	and error should not be emitted.

> --- a/gcc/config/rs6000/rs6000.c
> +++ b/gcc/config/rs6000/rs6000.c
> @@ -4186,6 +4186,8 @@ rs6000_option_override_internal (bool global_init_p)
>        else
>  	rs6000_long_double_type_size = default_long_double_size;
>      }
> +  else if (rs6000_long_double_type_size == FLOAT_PRECISION_TFmode)
> +    ; /* The option value can be seen when cl_target_option_restore is called.  */

(line too long)

The comment is still very cryptic.  What you have in the changelog is
much better digestible.

Okay for trunk with those things fixed.  Thanks!


Segher

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH] rs6000: Fix restored rs6000_long_double_type_size.
  2021-07-23 17:57         ` Segher Boessenkool
@ 2021-08-05 12:05           ` Martin Liška
  2021-08-05 15:39             ` Segher Boessenkool
  0 siblings, 1 reply; 16+ messages in thread
From: Martin Liška @ 2021-08-05 12:05 UTC (permalink / raw)
  To: Segher Boessenkool; +Cc: gcc-patches

[-- Attachment #1: Type: text/plain, Size: 1099 bytes --]

On 7/23/21 7:57 PM, Segher Boessenkool wrote:
> Hi!
> 
> On Fri, Jul 23, 2021 at 07:47:54AM +0200, Martin Liška wrote:
>> On 7/12/21 7:20 PM, Segher Boessenkool wrote:
>>>>>> +static __attribute__ ((optimize ("-fno-stack-protector"))) __typeof
>>>>>> (f) *
>>>>>
>>>>> -fno-stack-protector is default.
>>>>
>>>> Yes, but one needs an optimize attribute in order to trigger
>>>> cl_target_option_save/restore
>>>> mechanism.
>>>
>>> So it behaves differently if you select the default than if you do not
>>> select anything?  That is wrong, no?
>>
>> Sorry, I don't get your example, please explain it.
> 
> If -mbork is the default, the coompiler whould behave the same if you
> invoke it with -mbork as when you do not.  And the optimize attribute
> should work exactly the same as command line options.

Ah, got your point. All right, let's use then 'optimize(1)'.

Is it fine with the adjustment?
Cheers,
Martin

> 
> Or perhaps you are saying you have this in the testcase only to exercise
> the option save/restore code paths?  Please document that then, in the
> testcase.
> 
> 
> Segher
> 


[-- Attachment #2: 0001-rs6000-Fix-restored-rs6000_long_double_type_size.patch --]
[-- Type: text/x-patch, Size: 2236 bytes --]

From 517e32a75aa59b4b538eda30e78de0fa925bb0f9 Mon Sep 17 00:00:00 2001
From: Martin Liska <mliska@suse.cz>
Date: Tue, 1 Jun 2021 15:39:14 +0200
Subject: [PATCH] rs6000: Fix restored rs6000_long_double_type_size

As mentioned in the "Fallout: save/restore target options in handle_optimize_attribute"
thread, we need to support target option restore
of rs6000_long_double_type_size == FLOAT_PRECISION_TFmode.

gcc/ChangeLog:

	* config/rs6000/rs6000.c (rs6000_option_override_internal): When
	a target option is restored, it can have
	rs6000_long_double_type_size set to FLOAT_PRECISION_TFmode
	and error should not be emitted.

gcc/testsuite/ChangeLog:

	* gcc.target/powerpc/pragma-optimize.c: New test.
---
 gcc/config/rs6000/rs6000.c                         |  2 ++
 gcc/testsuite/gcc.target/powerpc/pragma-optimize.c | 13 +++++++++++++
 2 files changed, 15 insertions(+)
 create mode 100644 gcc/testsuite/gcc.target/powerpc/pragma-optimize.c

diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index 2de5a96e1b6..5b1c06b09fc 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -4189,6 +4189,8 @@ rs6000_option_override_internal (bool global_init_p)
       else
 	rs6000_long_double_type_size = default_long_double_size;
     }
+  else if (rs6000_long_double_type_size == FLOAT_PRECISION_TFmode)
+    ; /* The option value can be seen when cl_target_option_restore is called.  */
   else if (rs6000_long_double_type_size == 128)
     rs6000_long_double_type_size = FLOAT_PRECISION_TFmode;
   else if (global_options_set.x_rs6000_ieeequad)
diff --git a/gcc/testsuite/gcc.target/powerpc/pragma-optimize.c b/gcc/testsuite/gcc.target/powerpc/pragma-optimize.c
new file mode 100644
index 00000000000..e8ba63a0667
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/pragma-optimize.c
@@ -0,0 +1,13 @@
+/* { dg-options "-O2 -mlong-double-128 -mabi=ibmlongdouble" } */
+
+extern unsigned long int x;
+extern float f (float);
+extern __typeof (f) f_power8;
+extern __typeof (f) f_power9;
+extern __typeof (f) f __attribute__ ((ifunc ("f_ifunc")));
+static __attribute__ ((optimize (1))) __typeof (f) *
+f_ifunc (void)
+{
+  __typeof (f) *res = x ? f_power9 : f_power8;
+  return res;
+}
-- 
2.32.0


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH] rs6000: Fix restored rs6000_long_double_type_size.
  2021-08-05 12:05           ` Martin Liška
@ 2021-08-05 15:39             ` Segher Boessenkool
  2021-08-05 16:49               ` Martin Liška
  0 siblings, 1 reply; 16+ messages in thread
From: Segher Boessenkool @ 2021-08-05 15:39 UTC (permalink / raw)
  To: Martin Liška; +Cc: gcc-patches

On Thu, Aug 05, 2021 at 02:05:24PM +0200, Martin Liška wrote:
> On 7/23/21 7:57 PM, Segher Boessenkool wrote:
> >Hi!
> >
> >On Fri, Jul 23, 2021 at 07:47:54AM +0200, Martin Liška wrote:
> >>On 7/12/21 7:20 PM, Segher Boessenkool wrote:
> >>>>>>+static __attribute__ ((optimize ("-fno-stack-protector"))) __typeof
> >>>>>>(f) *
> >>>>>
> >>>>>-fno-stack-protector is default.
> >>>>
> >>>>Yes, but one needs an optimize attribute in order to trigger
> >>>>cl_target_option_save/restore
> >>>>mechanism.
> >>>
> >>>So it behaves differently if you select the default than if you do not
> >>>select anything?  That is wrong, no?
> >>
> >>Sorry, I don't get your example, please explain it.
> >
> >If -mbork is the default, the coompiler whould behave the same if you
> >invoke it with -mbork as when you do not.  And the optimize attribute
> >should work exactly the same as command line options.
> 
> Ah, got your point. All right, let's use then 'optimize(1)'.
> 
> Is it fine with the adjustment?

You are saying the compiler's behaviour is broken, but are changing the
testcase to avoid exhibiting that behaviour?  No, this is not fine.

If a flag is the default the compiler should do the same thing with and
without any attribute setting that flag, directly or indirectly.


Segher

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH] rs6000: Fix restored rs6000_long_double_type_size.
  2021-08-05 15:39             ` Segher Boessenkool
@ 2021-08-05 16:49               ` Martin Liška
  2021-08-05 20:06                 ` Segher Boessenkool
  0 siblings, 1 reply; 16+ messages in thread
From: Martin Liška @ 2021-08-05 16:49 UTC (permalink / raw)
  To: Segher Boessenkool; +Cc: gcc-patches

On 8/5/21 5:39 PM, Segher Boessenkool wrote:
> On Thu, Aug 05, 2021 at 02:05:24PM +0200, Martin Liška wrote:
>> On 7/23/21 7:57 PM, Segher Boessenkool wrote:
>>> Hi!
>>>
>>> On Fri, Jul 23, 2021 at 07:47:54AM +0200, Martin Liška wrote:
>>>> On 7/12/21 7:20 PM, Segher Boessenkool wrote:
>>>>>>>> +static __attribute__ ((optimize ("-fno-stack-protector"))) __typeof
>>>>>>>> (f) *
>>>>>>>
>>>>>>> -fno-stack-protector is default.
>>>>>>
>>>>>> Yes, but one needs an optimize attribute in order to trigger
>>>>>> cl_target_option_save/restore
>>>>>> mechanism.
>>>>>
>>>>> So it behaves differently if you select the default than if you do not
>>>>> select anything?  That is wrong, no?
>>>>
>>>> Sorry, I don't get your example, please explain it.
>>>
>>> If -mbork is the default, the coompiler whould behave the same if you
>>> invoke it with -mbork as when you do not.  And the optimize attribute
>>> should work exactly the same as command line options.
>>
>> Ah, got your point. All right, let's use then 'optimize(1)'.
>>
>> Is it fine with the adjustment?
> 
> You are saying the compiler's behaviour is broken, but are changing the
> testcase to avoid exhibiting that behaviour?

No, both selections of the 'optimize' attribute trigger the ICE. The reason
is that any optimize attribute triggers eventually cl_target_option_save/restore
mechanism which is what the patch addresses.

> No, this is not fine.
> 
> If a flag is the default the compiler should do the same thing with and
> without any attribute setting that flag, directly or indirectly.

Yes, but should not crash. And that's what is my patch dealing with.

Cheers,
Martin

> 
> 
> Segher
> 


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH] rs6000: Fix restored rs6000_long_double_type_size.
  2021-08-05 16:49               ` Martin Liška
@ 2021-08-05 20:06                 ` Segher Boessenkool
  0 siblings, 0 replies; 16+ messages in thread
From: Segher Boessenkool @ 2021-08-05 20:06 UTC (permalink / raw)
  To: Martin Liška; +Cc: gcc-patches

On Thu, Aug 05, 2021 at 06:49:21PM +0200, Martin Liška wrote:
> On 8/5/21 5:39 PM, Segher Boessenkool wrote:
> >>>If -mbork is the default, the coompiler whould behave the same if you
> >>>invoke it with -mbork as when you do not.  And the optimize attribute
> >>>should work exactly the same as command line options.
> >>
> >>Ah, got your point. All right, let's use then 'optimize(1)'.
> >>
> >>Is it fine with the adjustment?
> >
> >You are saying the compiler's behaviour is broken, but are changing the
> >testcase to avoid exhibiting that behaviour?
> 
> No, both selections of the 'optimize' attribute trigger the ICE. The reason
> is that any optimize attribute triggers eventually 
> cl_target_option_save/restore
> mechanism which is what the patch addresses.

Aha.  So say that in the test case!  That the test case is to check if
the bug fixed in XXXXXXXXXXXX has been reintroduced (or describe the bug
more precisely if needed).

Okay for trunk with that fixed.  Thanks!


Segher

^ permalink raw reply	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2021-08-05 20:07 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-06-23 13:22 [PATCH] rs6000: Fix restored rs6000_long_double_type_size Martin Liška
2021-06-23 22:46 ` Segher Boessenkool
2021-06-28 12:19   ` Martin Liška
2021-07-12  4:19     ` Martin Liška
2021-07-12 17:00       ` Segher Boessenkool
2021-07-12 17:20     ` Segher Boessenkool
2021-07-23  5:45       ` Martin Liska
2021-07-23  5:45       ` Martin Liska
2021-07-23  5:45       ` Martin Liska
2021-07-23  5:47       ` Martin Liška
2021-07-23 17:57         ` Segher Boessenkool
2021-08-05 12:05           ` Martin Liška
2021-08-05 15:39             ` Segher Boessenkool
2021-08-05 16:49               ` Martin Liška
2021-08-05 20:06                 ` Segher Boessenkool
     [not found]       ` <202107230545.16N5jkeY006982@gate.crashing.org>
2021-07-23 18:00         ` Segher Boessenkool

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).