From 316bdb2e8970a461f2ae1a7183262d18a72adab3 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Tue, 25 May 2021 10:21:41 +0200 Subject: [PATCH] middle-end/100727 - fix call expansion with WITH_SIZE_EXPR arg 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. 2021-05-25 Richard Biener 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 f3da183..dd8ff2a 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 b8c732b..c321179 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.7.4