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).