[gcc(refs/users/aoliva/heads/testme)] strub: drop volatile from wrapper args

Alexandre Oliva aoliva@gcc.gnu.org
Mon Dec 11 19:44:15 GMT 2023


https://gcc.gnu.org/g:7bd63d94b2df3bb2a86ddb15b361f1c8488e8647

commit 7bd63d94b2df3bb2a86ddb15b361f1c8488e8647
Author: Alexandre Oliva <oliva@gnu.org>
Date:   Mon Dec 11 16:16:45 2023 -0300

    strub: drop volatile from wrapper args

Diff:
---
 gcc/ipa-strub.cc                                     | 14 +++++++++++---
 gcc/testsuite/c-c++-common/strub-internal-volatile.c |  5 +++++
 2 files changed, 16 insertions(+), 3 deletions(-)

diff --git a/gcc/ipa-strub.cc b/gcc/ipa-strub.cc
index 45294b0b46b..bab20c386bb 100644
--- a/gcc/ipa-strub.cc
+++ b/gcc/ipa-strub.cc
@@ -2922,6 +2922,16 @@ pass_ipa_strub::execute (function *)
 	  if (nparmt)
 	    adjust_ftype++;
 	}
+      else if (TREE_THIS_VOLATILE (parm))
+	{
+	  /* Drop volatile from wrapper's arguments, they're just
+	     temporaries copied to the wrapped function.  ???  Should
+	     we drop TYPE_QUAL_ATOMIC as well?  */
+	  TREE_TYPE (parm) = build_qualified_type (TREE_TYPE (parm),
+						   TYPE_QUALS (TREE_TYPE (parm))
+						   & ~TYPE_QUAL_VOLATILE);
+	  TREE_THIS_VOLATILE (parm) = 0;
+	}
 
     /* Also adjust the wrapped function type, if needed.  */
     if (adjust_ftype)
@@ -3224,9 +3234,7 @@ pass_ipa_strub::execute (function *)
 		    {
 		      tree tmp = arg;
 		      /* If ARG is e.g. volatile, we must copy and
-			 convert in separate statements.  ???  Should
-			 we drop volatile from the wrapper
-			 instead?  */
+			 convert in separate statements.  */
 		      if (!is_gimple_val (arg))
 			{
 			  tmp = create_tmp_reg (TYPE_MAIN_VARIANT
diff --git a/gcc/testsuite/c-c++-common/strub-internal-volatile.c b/gcc/testsuite/c-c++-common/strub-internal-volatile.c
index cdfca67616b..0ffa98d799d 100644
--- a/gcc/testsuite/c-c++-common/strub-internal-volatile.c
+++ b/gcc/testsuite/c-c++-common/strub-internal-volatile.c
@@ -1,4 +1,5 @@
 /* { dg-do compile } */
+/* { dg-options "-fdump-ipa-strub" } */
 /* { dg-require-effective-target strub } */
 
 void __attribute__ ((strub("internal")))
@@ -8,3 +9,7 @@ f(volatile short) {
 void g(void) {
   f(0);
 }
+
+/* We drop volatile from the wrapper, and keep it in the wrapped f, so
+   the count remains 1.  */
+/* { dg-final { scan-ipa-dump-times "volatile" 1 "strub" } } */


More information about the Gcc-cvs mailing list