public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc(refs/vendors/ARM/heads/morello)] Fix various other &MEM_REF folds
@ 2022-05-05 12:09 Matthew Malcomson
0 siblings, 0 replies; only message in thread
From: Matthew Malcomson @ 2022-05-05 12:09 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:69d1babe4658e807e9bb9fbafb912af9d306a642
commit 69d1babe4658e807e9bb9fbafb912af9d306a642
Author: Richard Sandiford <richard.sandiford@arm.com>
Date: Wed Apr 20 16:56:36 2022 +0100
Fix various other &MEM_REF folds
A previous patch fixed a loose &MEM_REF -> POINTER_PLUS_EXPR
fold in expand_simple_operations. This patch tries to fix
possible instances of the same problem elsewhere.
These changes are purely by inspection, so (a) I don't have any
testcases that prove that the changes are needed and (b) there
are likely to be other instances of the same problem that I missed.
But I think the changes make sense on first principles, so I'd
prefer to err on the side of having them rather than not.
I tried various ways of adding a helper function for this, but all
uses are just about different enough that the abstraction felt more
awkward than useful.
Diff:
---
gcc/tree-ssa-phiopt.c | 2 ++
gcc/tree-ssa-sccvn.c | 7 ++++++-
gcc/tree-stdarg.c | 37 +++++++++++++++++++++++++------------
3 files changed, 33 insertions(+), 13 deletions(-)
diff --git a/gcc/tree-ssa-phiopt.c b/gcc/tree-ssa-phiopt.c
index dbe935527cb..77d0a8f28ff 100644
--- a/gcc/tree-ssa-phiopt.c
+++ b/gcc/tree-ssa-phiopt.c
@@ -881,6 +881,8 @@ jump_function_from_stmt (tree *arg, gimple *stmt)
&offset);
if (tem
&& TREE_CODE (tem) == MEM_REF
+ && useless_type_conversion_p (TREE_TYPE (TREE_OPERAND (tem, 0)),
+ TREE_TYPE (*arg))
&& known_eq (mem_ref_offset (tem) + offset, 0))
{
*arg = TREE_OPERAND (tem, 0);
diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c
index 2adc2626b83..91d085b0adc 100644
--- a/gcc/tree-ssa-sccvn.c
+++ b/gcc/tree-ssa-sccvn.c
@@ -1324,9 +1324,14 @@ vn_reference_maybe_forwprop_address (vec<vn_reference_op_s> *ops,
0))))
return changed;
+ tree mem_base = TREE_OPERAND (addr_base, 0);
+ if (!useless_type_conversion_p (TREE_TYPE (mem_base),
+ TREE_TYPE (addr)))
+ return changed;
+
off += addr_offset;
off += mem_ref_offset (addr_base);
- op->op0 = TREE_OPERAND (addr_base, 0);
+ op->op0 = mem_base;
}
else
{
diff --git a/gcc/tree-stdarg.c b/gcc/tree-stdarg.c
index c05fa3b2f00..6fb68a99948 100644
--- a/gcc/tree-stdarg.c
+++ b/gcc/tree-stdarg.c
@@ -106,6 +106,25 @@ reachable_at_most_once (basic_block va_arg_bb, basic_block va_start_bb)
return ret;
}
+/* Check if EXP has the form &MEM(SSA_NAME + uhwi) and if it can be folded
+ to POINTER_PLUS_EXPR<SSA_NAME, uhwi>. Return the inner MEM_REF if so,
+ otherwise return null. */
+
+static tree
+foldable_addr_mem_expr (tree exp)
+{
+ if (ADDR_EXPR_P (exp)
+ && TREE_CODE (TREE_OPERAND (exp, 0)) == MEM_REF)
+ {
+ tree mem = TREE_OPERAND (exp, 0);
+ if (TREE_CODE (TREE_OPERAND (mem, 0)) == SSA_NAME
+ && tree_fits_uhwi_p (TREE_OPERAND (mem, 1))
+ && useless_type_conversion_p (TREE_TYPE (TREE_OPERAND (mem, 0)),
+ TREE_TYPE (exp)))
+ return mem;
+ }
+ return NULL_TREE;
+}
/* For statement COUNTER = RHS, if RHS is COUNTER + constant,
return constant, otherwise return HOST_WIDE_INT_M1U.
@@ -174,13 +193,10 @@ va_list_counter_bump (struct stdarg_info *si, tree counter, tree rhs,
continue;
}
- if (ADDR_EXPR_CODE_P (rhs_code)
- && TREE_CODE (TREE_OPERAND (rhs1, 0)) == MEM_REF
- && TREE_CODE (TREE_OPERAND (TREE_OPERAND (rhs1, 0), 0)) == SSA_NAME
- && tree_fits_uhwi_p (TREE_OPERAND (TREE_OPERAND (rhs1, 0), 1)))
+ if (tree mem = foldable_addr_mem_expr (rhs1))
{
- ret += tree_to_uhwi (TREE_OPERAND (TREE_OPERAND (rhs1, 0), 1));
- lhs = TREE_OPERAND (TREE_OPERAND (rhs1, 0), 0);
+ ret += tree_to_uhwi (TREE_OPERAND (mem, 1));
+ lhs = TREE_OPERAND (mem, 0);
continue;
}
@@ -241,13 +257,10 @@ va_list_counter_bump (struct stdarg_info *si, tree counter, tree rhs,
continue;
}
- if (ADDR_EXPR_CODE_P (rhs_code)
- && TREE_CODE (TREE_OPERAND (rhs1, 0)) == MEM_REF
- && TREE_CODE (TREE_OPERAND (TREE_OPERAND (rhs1, 0), 0)) == SSA_NAME
- && tree_fits_uhwi_p (TREE_OPERAND (TREE_OPERAND (rhs1, 0), 1)))
+ if (tree mem = foldable_addr_mem_expr (rhs1))
{
- val -= tree_to_uhwi (TREE_OPERAND (TREE_OPERAND (rhs1, 0), 1));
- lhs = TREE_OPERAND (TREE_OPERAND (rhs1, 0), 0);
+ val -= tree_to_uhwi (TREE_OPERAND (mem, 1));
+ lhs = TREE_OPERAND (mem, 0);
continue;
}
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2022-05-05 12:09 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-05-05 12:09 [gcc(refs/vendors/ARM/heads/morello)] Fix various other &MEM_REF folds Matthew Malcomson
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).