diff options
author | Alexandre Oliva <oliva@adacore.com> | 2023-12-14 10:41:19 -0300 |
---|---|---|
committer | Alexandre Oliva <oliva@gnu.org> | 2023-12-14 10:41:19 -0300 |
commit | e1e71b4e0681974b3db41afa7fc18720a30d6848 (patch) | |
tree | 1d09edb7a9f00ed473a6afe2221f05e90dfaf713 /gcc | |
parent | 37afeec8a635153ccd4e91bd686c93217706894d (diff) | |
download | gcc-e1e71b4e0681974b3db41afa7fc18720a30d6848.zip gcc-e1e71b4e0681974b3db41afa7fc18720a30d6848.tar.gz gcc-e1e71b4e0681974b3db41afa7fc18720a30d6848.tar.bz2 |
strub: indirect volatile parms in wrappers
Arrange for strub internal wrappers to pass volatile arguments by
reference to the wrapped bodies.
for gcc/ChangeLog
PR middle-end/112938
* ipa-strub.cc (pass_ipa_strub::execute): Pass volatile args
by reference to internal strub wrapped bodies.
for gcc/testsuite/ChangeLog
PR middle-end/112938
* gcc.dg/strub-internal-volatile.c: Check indirection of
volatile args.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ipa-strub.cc | 19 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/strub-internal-volatile.c | 5 |
2 files changed, 14 insertions, 10 deletions
diff --git a/gcc/ipa-strub.cc b/gcc/ipa-strub.cc index 45294b0..943bb60 100644 --- a/gcc/ipa-strub.cc +++ b/gcc/ipa-strub.cc @@ -2881,13 +2881,14 @@ pass_ipa_strub::execute (function *) parm = DECL_CHAIN (parm), nparm = DECL_CHAIN (nparm), nparmt = nparmt ? TREE_CHAIN (nparmt) : NULL_TREE) - if (!(0 /* DECL_BY_REFERENCE (narg) */ - || is_gimple_reg_type (TREE_TYPE (nparm)) - || VECTOR_TYPE_P (TREE_TYPE (nparm)) - || TREE_CODE (TREE_TYPE (nparm)) == COMPLEX_TYPE - || (tree_fits_uhwi_p (TYPE_SIZE_UNIT (TREE_TYPE (nparm))) - && (tree_to_uhwi (TYPE_SIZE_UNIT (TREE_TYPE (nparm))) - <= 4 * UNITS_PER_WORD)))) + if (TREE_THIS_VOLATILE (parm) + || !(0 /* DECL_BY_REFERENCE (narg) */ + || is_gimple_reg_type (TREE_TYPE (nparm)) + || VECTOR_TYPE_P (TREE_TYPE (nparm)) + || TREE_CODE (TREE_TYPE (nparm)) == COMPLEX_TYPE + || (tree_fits_uhwi_p (TYPE_SIZE_UNIT (TREE_TYPE (nparm))) + && (tree_to_uhwi (TYPE_SIZE_UNIT (TREE_TYPE (nparm))) + <= 4 * UNITS_PER_WORD)))) { /* No point in indirecting pointer types. Presumably they won't ever pass the size-based test above, but check the @@ -3224,9 +3225,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/gcc.dg/strub-internal-volatile.c b/gcc/testsuite/gcc.dg/strub-internal-volatile.c index 34d4ec8..a1436dc 100644 --- a/gcc/testsuite/gcc.dg/strub-internal-volatile.c +++ b/gcc/testsuite/gcc.dg/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 s) { void g(void) { f(0); } + +/* We make volatile parms indirect in the wrapped f. */ +/* { dg-final { scan-ipa-dump-times "volatile short" 2 "strub" } } */ +/* { dg-final { scan-ipa-dump-times "volatile short int &" 1 "strub" } } */ |