call expansion used the result of get_base_address to switch between
ABIs - with get_base_address now never returning NULL we have to
re-instantiate the check in a more explicit way.  This also adjusts
mark_addressable to skip WITH_SIZE_EXPRs, consistent with how
build_fold_addr_expr handles it.

Bootstrap & regtest running on x86_64-unknown-linux-gnu.

Richard.

2021-05-25  Richard Biener  <rguent...@suse.de>

        PR middle-end/100727
        * calls.c (initialize_argument_information): Explicitely test
        for WITH_SIZE_EXPR.
        * gimple-expr.c (mark_addressable): Skip outer WITH_SIZE_EXPR.
---
 gcc/calls.c       | 3 ++-
 gcc/gimple-expr.c | 2 ++
 2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/gcc/calls.c b/gcc/calls.c
index f3da1839dc5..dd8ff2aa7cb 100644
--- a/gcc/calls.c
+++ b/gcc/calls.c
@@ -2397,7 +2397,8 @@ initialize_argument_information (int num_actuals 
ATTRIBUTE_UNUSED,
             already in memory, instead of making a copy.  Likewise if we want
             to make the copy in the callee instead of the caller.  */
          if ((call_from_thunk_p || callee_copies)
-             && (base = get_base_address (args[i].tree_value))
+             && TREE_CODE (args[i].tree_value) != WITH_SIZE_EXPR
+             && ((base = get_base_address (args[i].tree_value)), true)
              && TREE_CODE (base) != SSA_NAME
              && (!DECL_P (base) || MEM_P (DECL_RTL (base))))
            {
diff --git a/gcc/gimple-expr.c b/gcc/gimple-expr.c
index b8c732b632a..c3211795d33 100644
--- a/gcc/gimple-expr.c
+++ b/gcc/gimple-expr.c
@@ -900,6 +900,8 @@ flush_mark_addressable_queue ()
 void
 mark_addressable (tree x)
 {
+  if (TREE_CODE (x) == WITH_SIZE_EXPR)
+    x = TREE_OPERAND (x, 0);
   while (handled_component_p (x))
     x = TREE_OPERAND (x, 0);
   if (TREE_CODE (x) == MEM_REF
-- 
2.26.2

Reply via email to