public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: <naveenh@marvell.com>
To: <gcc-patches@gcc.gnu.org>
Cc: <apinski@marvell.com>, Naveen H S <naveenh@marvell.com>
Subject: [PATCH] Implement Bit-field lowering
Date: Fri, 14 Jul 2023 11:19:08 +0530	[thread overview]
Message-ID: <20230714054908.1071907-1-naveenh@marvell.com> (raw)

From: Naveen H S <naveenh@marvell.com>

This patch adds lowering bit-field and opposite endian accesses pass.
The patch addresses many issues in:-
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=19466

2023-07-14  Andrew Pinski   <apinski@marvell.com>
Co-authored-by: Naveen H S <naveenh@marvell.com>

gcc/ChangeLog:

	* Makefile.in (OBJS): Add gimple-lower-accesses.o.
	* gimple-lower-accesses.cc: New file.
	* passes.def (pass_lower_accesses): Add.
	* tree-pass.h (make_pass_lower_accesses): Define.

gcc/testsuite/ChangeLog:

* gcc.dg/store_merging_14.c: Modify the pattern found as per new code.
* gcc.dg/store_merging_16.c: Likewise.
* gcc.dg/store_merging_20.c: Likewise.
* gcc.dg/store_merging_21.c: Likewise.
* gcc.dg/store_merging_24.c: Likewise.
* gcc.dg/store_merging_25.c: Likewise.
* gcc.dg/store_merging_6.c: Likewise.
* gcc.dg/tree-ssa/20030729-1.c: Likewise.
* gcc.dg/tree-ssa/20030814-6.c: Likewise.
* gcc.dg/tree-ssa/loop-interchange-14.c: Likewise.
* gcc.dg/tree-ssa/20030714-1.c: Remove.
---
 gcc/Makefile.in                               |   1 +
 gcc/gimple-lower-accesses.cc                  | 463 ++++++++++++++++++
 gcc/passes.def                                |   4 +
 gcc/testsuite/gcc.dg/store_merging_10.c       |   2 +-
 gcc/testsuite/gcc.dg/store_merging_14.c       |   2 +-
 gcc/testsuite/gcc.dg/store_merging_16.c       |   4 +-
 gcc/testsuite/gcc.dg/store_merging_20.c       |   2 +-
 gcc/testsuite/gcc.dg/store_merging_21.c       |   2 +-
 gcc/testsuite/gcc.dg/store_merging_24.c       |   4 +-
 gcc/testsuite/gcc.dg/store_merging_25.c       |   4 +-
 gcc/testsuite/gcc.dg/store_merging_6.c        |   2 +-
 gcc/testsuite/gcc.dg/tree-ssa/20030714-1.c    |  45 --
 gcc/testsuite/gcc.dg/tree-ssa/20030729-1.c    |   5 +-
 gcc/testsuite/gcc.dg/tree-ssa/20030814-6.c    |   5 +-
 .../gcc.dg/tree-ssa/loop-interchange-14.c     |   2 +-
 gcc/tree-pass.h                               |   1 +
 16 files changed, 485 insertions(+), 63 deletions(-)
 create mode 100644 gcc/gimple-lower-accesses.cc
 delete mode 100644 gcc/testsuite/gcc.dg/tree-ssa/20030714-1.c

diff --git a/gcc/Makefile.in b/gcc/Makefile.in
index c478ec85201..50bd28f4d04 100644
--- a/gcc/Makefile.in
+++ b/gcc/Makefile.in
@@ -1338,6 +1338,7 @@ OBJS = \
 	$(GIMPLE_MATCH_PD_SEQ_O) \
 	gimple-match-exports.o \
 	$(GENERIC_MATCH_PD_SEQ_O) \
+	gimple-lower-accesses.o \
 	insn-attrtab.o \
 	insn-automata.o \
 	insn-dfatab.o \
diff --git a/gcc/gimple-lower-accesses.cc b/gcc/gimple-lower-accesses.cc
new file mode 100644
index 00000000000..9d87acfba56
--- /dev/null
+++ b/gcc/gimple-lower-accesses.cc
@@ -0,0 +1,463 @@
+/* GIMPLE lowering bit-field and opposite endian accesses pass.
+
+   Copyright (C) 2017-2023 Free Software Foundation, Inc.
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 3, or (at your option) any later
+version.
+
+GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
+
+#include "config.h"
+#include "system.h"
+#include "coretypes.h"
+#include "backend.h"
+#include "rtl.h"
+#include "tree.h"
+#include "gimple.h"
+#include "cfghooks.h"
+#include "tree-pass.h"
+#include "ssa.h"
+#include "fold-const.h"
+#include "stor-layout.h"
+#include "tree-eh.h"
+#include "gimplify.h"
+#include "gimple-iterator.h"
+#include "gimplify-me.h"
+#include "tree-cfg.h"
+#include "tree-dfa.h"
+#include "tree-ssa.h"
+#include "tree-ssa-propagate.h"
+#include "tree-hasher.h"
+#include "cfgloop.h"
+#include "cfganal.h"
+#include "alias.h"
+#include "expr.h"
+#include "tree-pretty-print.h"
+
+namespace {
+
+class lower_accesses
+{
+  function *fn;
+public:
+  lower_accesses (function *f) : fn(f) {}
+  unsigned int execute (void);
+};
+
+
+/* Handle reference to a bitfield EXPR.
+   If BITPOS_P is non-null assume that reference is LHS and set *BITPOS_P
+   to bit position of the field.
+   If REF_P is non-null set it to the memory reference for the encompassing
+   allocation unit.
+   Note *BITPOS_P is suitable only for BIT_FIELD_REF/BIT_FIELD_INSERT.  */
+
+tree
+extract_bitfield (tree expr, tree *bitpos_p, tree *bitsize_p,
+		  bool *preversep)
+{
+  tree base, addr, ref;
+  tree base_type;
+  tree bytepos;
+  machine_mode mode1;
+  int unsignedp = false, volatilep = false, reversep = false;
+
+  poly_int64 bitsize, bitpos;
+  HOST_WIDE_INT ibitsize = 0, ibitpos = 0;
+
+  poly_uint64 bitregion_start = 0;
+  poly_uint64 bitregion_end = 0;
+
+  if (dump_file && (dump_flags & TDF_DETAILS))
+    {
+      fprintf (dump_file, "Trying to expand bitfield reference: \n");
+      print_generic_expr (dump_file, expr);
+      fprintf (dump_file, "\n");
+    }
+
+  base = get_inner_reference (expr, &bitsize, &bitpos, &bytepos, &mode1,
+			      &unsignedp, &reversep, &volatilep);
+
+  if (!bitsize.is_constant (&ibitsize)
+      || !bitpos.is_constant (&ibitpos))
+    {
+      if (dump_file && (dump_flags & TDF_DETAILS))
+	fprintf (dump_file, "failed, bitsize or bitnum are non-constants.\n");
+      return NULL;
+    }
+
+  if (volatilep)
+    {
+      if (dump_file && (dump_flags & TDF_DETAILS))
+	fprintf (dump_file, "failed, volatile.\n\n");
+      return NULL;
+    }
+
+  /* Make sure bitpos is not negative, it can wreak havoc later.  */
+  if (ibitpos < 0)
+    {
+      gcc_assert (bytepos == NULL_TREE);
+      bytepos = size_int (ibitpos >> (BITS_PER_UNIT == 8
+			  ? 3 : exact_log2 (BITS_PER_UNIT)));
+      ibitpos &= BITS_PER_UNIT - 1;
+      bitpos = ibitpos;
+    }
+
+  if (!bytepos)
+    bytepos = size_int (0);
+
+  if (dump_file && (dump_flags & TDF_DETAILS))
+    {
+      fprintf (dump_file, "base: ");
+      print_generic_expr (dump_file, base);
+      fprintf (dump_file, " orig bitpos: ");
+      print_dec (bitpos, dump_file);
+      fprintf (dump_file, " bytepos: ");
+      print_generic_expr (dump_file, bytepos);
+      fprintf (dump_file, "\n");
+    }
+
+  get_bit_range (&bitregion_start, &bitregion_end, expr, &bitpos, &bytepos);
+
+  if (!bitpos.is_constant (&ibitpos))
+    {
+      if (dump_file && (dump_flags & TDF_DETAILS))
+	fprintf (dump_file, "failed, bitpos after get_bit_range is non-constant.\n");
+      return NULL;
+    }
+
+  int align = TYPE_ALIGN (TREE_TYPE (base));
+
+  if (dump_file && (dump_flags & TDF_DETAILS))
+    {
+      fprintf (dump_file, "after bit_range bitpos: ");
+      print_dec (bitpos, dump_file);
+      fprintf (dump_file, " bytepos: ");
+      print_generic_expr (dump_file, bytepos);
+      fprintf (dump_file, " bitregion_start: ");
+      print_dec (bitregion_start, dump_file);
+      fprintf (dump_file, " bitregion_end: ");
+      print_dec (bitregion_end, dump_file);
+      fprintf (dump_file, " align: %d word_size: %d.\n", align,
+	       BITS_PER_WORD);
+    }
+
+  scalar_int_mode typemode;
+  int modebitsize;
+
+  /* If the base was a non-addressable/non-global decl and have a scalar integer
+     mode, then use base instead of finding the best mode.  This allows for
+     structs that are done as register not needing to do a double insert. */
+  if (DECL_P (base) && !TREE_ADDRESSABLE (base)
+      && !is_global_var (base)
+      && TREE_CODE (bytepos) == INTEGER_CST
+      && compare_tree_int (bytepos, 0) == 0
+      && DECL_MODE (base) != BLKmode
+      && is_a <scalar_int_mode> (DECL_MODE (base), &typemode))
+    {
+      base_type = build_nonstandard_integer_type (GET_MODE_PRECISION (typemode),
+						  UNSIGNED);
+      if (reversep)
+	ibitpos = TYPE_PRECISION (base_type) - ibitpos - ibitsize;
+
+      *bitpos_p = bitsize_int (ibitpos);
+      *bitsize_p = bitsize_int (ibitsize);
+      *preversep = reversep;
+      ref = build1 (VIEW_CONVERT_EXPR, base_type, base);
+      return ref;
+    }
+
+  if (!get_best_mode (ibitsize, ibitpos, bitregion_start, bitregion_end,
+		      align,
+		      BITS_PER_WORD, false, &typemode))
+    {
+      if (dump_file && (dump_flags & TDF_DETAILS))
+	fprintf (dump_file, "failed, get_best_mode return false.\n");
+      return NULL;
+    }
+
+  if (typemode == VOIDmode)
+    {
+      if (dump_file && (dump_flags & TDF_DETAILS))
+	fprintf (dump_file, "failed, best mode was VOIDmode.\n");
+      return NULL;
+    }
+
+  modebitsize = GET_MODE_BITSIZE (typemode);
+
+  if (dump_file && (dump_flags & TDF_DETAILS))
+    fprintf (dump_file, "best mode: %smode.\n", GET_MODE_NAME (typemode));
+
+  addr = build_fold_addr_expr (unshare_expr (base));
+  addr = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (addr),
+		      addr,
+		      bytepos);
+
+  base_type = build_nonstandard_integer_type (GET_MODE_PRECISION (typemode),
+					      UNSIGNED);
+  bytepos = size_int ((ibitpos / modebitsize) * GET_MODE_SIZE (typemode));
+  ibitpos = ibitpos % modebitsize;
+
+  /* Handle the case where the field spans two units. */
+  /* FIXME: Handle this case. */
+  if ((ibitpos / modebitsize)
+      != ((ibitpos + ibitsize - 1)) / modebitsize)
+    {
+      if (dump_file && (dump_flags & TDF_DETAILS))
+	fprintf (dump_file, "failed, Spans two units.\n\n");
+      return NULL;
+    }
+
+  if (reversep)
+    ibitpos = TYPE_PRECISION (base_type) - ibitpos - ibitsize;
+
+  /* Fetch full unit containing the bitfield.  */
+  addr = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (addr),
+		      addr,
+		      bytepos);
+  ref = build2 (MEM_REF, base_type, addr,
+		build_int_cst (reference_alias_ptr_type (expr), 0));
+
+  /* Tell upstream where the bitfield is located.  */
+  *bitpos_p = bitsize_int (ibitpos);
+  *bitsize_p = bitsize_int (ibitsize);
+  *preversep = reversep;
+  if (dump_file && (dump_flags & TDF_DETAILS))
+    {
+      fprintf (dump_file, "base memory unit : ");
+      print_generic_expr (dump_file, ref);
+      fprintf (dump_file, " %s endian ", reversep ? "opposite" : "native" );
+      fprintf (dump_file, " bit pos: ");
+      print_generic_expr (dump_file, *bitpos_p);
+      fprintf (dump_file, " bit size: ");
+      print_generic_expr (dump_file, *bitsize_p);
+      fprintf (dump_file, "\n");
+    }
+  return ref;
+}
+
+/* Create a function call to byteswap with RHS as the argument if possible.
+   Returns NULL if it is not possible.  */
+tree
+create_bswap (tree rhs)
+{
+  tree fndecl;
+  switch (TYPE_PRECISION (TREE_TYPE (rhs)))
+    {
+    case 8:
+	return rhs;
+    case 16:
+      fndecl = builtin_decl_explicit (BUILT_IN_BSWAP16);
+      break;
+    case 32:
+      fndecl = builtin_decl_explicit (BUILT_IN_BSWAP32);
+      break;
+    case 64:
+      fndecl = builtin_decl_explicit (BUILT_IN_BSWAP64);
+      break;
+    default:
+      return NULL;
+    }
+
+  if (fndecl == NULL)
+    return NULL;
+
+  tree inner_type = TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (fndecl)));
+  rhs = fold_convert (inner_type, rhs);
+  return build_call_expr (fndecl, 1, rhs);
+}
+
+/* Expand the left hand side (LHS) of STMT, placing the new statements
+  at GSI. */
+bool
+maybe_expand_lhs (gimple_stmt_iterator *gsi, gimple *stmt, tree lhs)
+{
+  if (TREE_CODE (lhs) != COMPONENT_REF
+      || !DECL_BIT_FIELD_TYPE (TREE_OPERAND (lhs, 1)))
+    return false;
+
+  tree var, bitpos, bitsize;
+  tree rhs, newrhs, rhs1;
+  bool reversep = false;
+  gimple_seq seq = NULL;
+
+  var = extract_bitfield (lhs, &bitpos, &bitsize, &reversep);
+  if (!var)
+    return false;
+
+  rhs = gimple_assign_rhs1 (stmt);
+
+  push_gimplify_context (true);
+
+  if (reversep)
+    {
+      rhs1 = create_bswap (unshare_expr (var));
+      /* We cannot create the bswap so don't do the lowering. */
+      if (!rhs1)
+	return false;
+    }
+  else
+    rhs1 = var;
+
+  newrhs = make_ssa_name (TREE_TYPE (rhs1));
+  gimplify_assign (newrhs, unshare_expr (rhs1), &seq);
+
+  newrhs = fold_build3 (BIT_INSERT_EXPR, TREE_TYPE (newrhs), newrhs, rhs, bitpos);
+  if (dump_file && (dump_flags & TDF_DETAILS))
+    {
+      fprintf (dump_file, "Created bit_insert: ");
+      print_generic_expr (dump_file, newrhs);
+      fprintf (dump_file, "\n");
+    }
+
+  if (reversep)
+    {
+      newrhs = create_bswap (newrhs);
+      gcc_assert (newrhs);
+    }
+
+  gimplify_assign (unshare_expr (var), newrhs, &seq);
+
+  pop_gimplify_context (NULL);
+  gsi_insert_seq_after (gsi, seq, GSI_SAME_STMT);
+
+  unlink_stmt_vdef (stmt);
+  gsi_remove (gsi, true);
+
+  return true;
+}
+
+/* Expand the right hand side (LHS) of STMT, placing the new statements
+   at GSI. */
+bool
+maybe_expand_rhs (gimple_stmt_iterator *gsi, gimple *stmt, tree rhs)
+{
+  if (TREE_CODE (rhs) != COMPONENT_REF
+      || !DECL_BIT_FIELD_TYPE (TREE_OPERAND (rhs, 1)))
+    return false;
+
+  tree var, bitpos, bitsize;
+  tree type = TREE_TYPE (rhs);
+  bool reversep = false;
+  gimple_seq seq = NULL;
+
+  tree lhs = gimple_assign_lhs (stmt);
+
+  var = extract_bitfield (rhs, &bitpos, &bitsize, &reversep);
+
+  if (!var)
+    return false;
+
+  if (reversep)
+    {
+      var = create_bswap (var);
+      /* We cannot create the bswap so don't do the lowering. */
+      if (!var)
+	return false;
+    }
+
+  push_gimplify_context (true);
+
+  tree newrhs = make_ssa_name (TREE_TYPE (var));
+  gimplify_assign (newrhs, var, &seq);
+  var = newrhs;
+
+  var = fold_build3 (BIT_FIELD_REF, type, var, bitsize, bitpos);
+
+  gimplify_assign (lhs, var, &seq);
+  pop_gimplify_context (NULL);
+  gsi_insert_seq_after (gsi, seq, GSI_SAME_STMT);
+
+  unlink_stmt_vdef (stmt);
+  gsi_remove (gsi, true);
+
+  return true;
+}
+
+/* Execute the lowering, lower all bit-field accesses that is possible.
+   FIXME: packed bit-fields are not handled.
+   FIXME: Reversed bit-fields that have more than 64bit underlying types are
+   not handled.   */
+unsigned int
+lower_accesses::execute (void)
+{
+  basic_block bb;
+  bool updated = false;
+
+  FOR_EACH_BB_FN (bb, cfun)
+    {
+      for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
+	   gsi_next (&gsi))
+	{
+	  gimple *stmt = gsi_stmt (gsi);
+
+	  /* Don't lower accesses which can throw. */
+	  if (stmt_could_throw_p (cfun, stmt))
+	    continue;
+
+	  if (gimple_code (stmt) != GIMPLE_ASSIGN)
+	    continue;
+
+	  tree lhs = gimple_assign_lhs (stmt);
+	  if (gimple_store_p (stmt))
+	    updated |= maybe_expand_lhs (&gsi, stmt, lhs);
+	  else if (gimple_assign_load_p (stmt))
+	    updated |= maybe_expand_rhs (&gsi, stmt, gimple_assign_rhs1 (stmt));
+	}
+    }
+
+
+  return updated ? TODO_update_ssa | TODO_rebuild_alias : 0;
+}
+
+const pass_data pass_data_lower_accesses =
+{
+  GIMPLE_PASS, /* type */
+  "lower_accesses", /* name */
+  OPTGROUP_NONE, /* optinfo_flags */
+  TV_NONE, /* tv_id */
+  ( PROP_cfg | PROP_ssa ), /* properties_required */
+  0, /* properties_provided */
+  0, /* properties_destroyed */
+  0, /* todo_flags_start */
+  0, /* todo_flags_finish */
+};
+
+class pass_lower_accesses : public gimple_opt_pass
+{
+public:
+  pass_lower_accesses (gcc::context *ctxt)
+    : gimple_opt_pass (pass_data_lower_accesses, ctxt)
+  {}
+
+  /* opt_pass methods: */
+  opt_pass * clone () { return new pass_lower_accesses (m_ctxt); }
+  virtual bool gate (function *) { return true; }
+  virtual unsigned int execute (function *);
+
+}; // class pass_lower_accesses
+
+unsigned int
+pass_lower_accesses::execute (function *fn)
+{
+  return lower_accesses (fn).execute ();
+}
+
+} // anonymous namepsace
+
+gimple_opt_pass *
+make_pass_lower_accesses (gcc::context *ctxt)
+{
+  return new pass_lower_accesses (ctxt);
+}
diff --git a/gcc/passes.def b/gcc/passes.def
index faa5208b26b..fb1f17b3d9a 100644
--- a/gcc/passes.def
+++ b/gcc/passes.def
@@ -234,6 +234,10 @@ along with GCC; see the file COPYING3.  If not see
       NEXT_PASS (pass_ch);
       NEXT_PASS (pass_lower_complex);
       NEXT_PASS (pass_sra);
+      /* Lower accesses including bit-field access.  Note this should be after
+         the last SRA as SRA has better information with bit-field accesses
+         not lowered. */
+      NEXT_PASS (pass_lower_accesses);
       /* The dom pass will also resolve all __builtin_constant_p calls
          that are still there to 0.  This has to be done after some
 	 propagations have already run, but before some more dead code
diff --git a/gcc/testsuite/gcc.dg/store_merging_10.c b/gcc/testsuite/gcc.dg/store_merging_10.c
index 53a6a74c56f..350acf361c9 100644
--- a/gcc/testsuite/gcc.dg/store_merging_10.c
+++ b/gcc/testsuite/gcc.dg/store_merging_10.c
@@ -53,4 +53,4 @@ main ()
   return 0;
 }
 
-/* { dg-final { scan-tree-dump-times "Merging successful" 2 "store-merging" } } */
+/* { dg-final { scan-tree-dump-times "Merging successful" 0 "store-merging" } } */
diff --git a/gcc/testsuite/gcc.dg/store_merging_14.c b/gcc/testsuite/gcc.dg/store_merging_14.c
index 9310aaf3489..a930c3b7057 100644
--- a/gcc/testsuite/gcc.dg/store_merging_14.c
+++ b/gcc/testsuite/gcc.dg/store_merging_14.c
@@ -214,4 +214,4 @@ main ()
   return 0;
 }
 
-/* { dg-final { scan-tree-dump-times "Merging successful" 9 "store-merging" } } */
+/* { dg-final { scan-tree-dump-times "Merging successful" 0 "store-merging" } } */
diff --git a/gcc/testsuite/gcc.dg/store_merging_16.c b/gcc/testsuite/gcc.dg/store_merging_16.c
index cd83f1c0fe5..4c80c61893e 100644
--- a/gcc/testsuite/gcc.dg/store_merging_16.c
+++ b/gcc/testsuite/gcc.dg/store_merging_16.c
@@ -152,6 +152,6 @@ main ()
   return 0;
 }
 
-/* { dg-final { scan-tree-dump-times "Merging successful" 7 "store-merging" } } */
-/* { dg-final { scan-tree-dump-times "__builtin_bswap64" 2 "store-merging" } } */
+/* { dg-final { scan-tree-dump-times "Merging successful" 6 "store-merging" } } */
+/* { dg-final { scan-tree-dump-times "__builtin_bswap64" 1 "store-merging" } } */
 /* { dg-final { scan-tree-dump-times "__builtin_bswap32" 4 "store-merging" } } */
diff --git a/gcc/testsuite/gcc.dg/store_merging_20.c b/gcc/testsuite/gcc.dg/store_merging_20.c
index b15582aa162..5beda6d975e 100644
--- a/gcc/testsuite/gcc.dg/store_merging_20.c
+++ b/gcc/testsuite/gcc.dg/store_merging_20.c
@@ -65,4 +65,4 @@ int main (void)
   return 0;
 }
 
-/* { dg-final { scan-tree-dump-times "Merging successful" 3 "store-merging" } } */
+/* { dg-final { scan-tree-dump-times "Merging successful" 0 "store-merging" } } */
diff --git a/gcc/testsuite/gcc.dg/store_merging_21.c b/gcc/testsuite/gcc.dg/store_merging_21.c
index ec0c8e240b7..302dc244056 100644
--- a/gcc/testsuite/gcc.dg/store_merging_21.c
+++ b/gcc/testsuite/gcc.dg/store_merging_21.c
@@ -38,4 +38,4 @@ void bar2 (struct S2 *s, struct S2 *m, _Bool flag)
   s->size = m->size;
 }
 
-/* { dg-final { scan-tree-dump-times "Merging successful" 4 "store-merging" } } */
+/* { dg-final { scan-tree-dump-times "Merging successful" 0 "store-merging" } } */
diff --git a/gcc/testsuite/gcc.dg/store_merging_24.c b/gcc/testsuite/gcc.dg/store_merging_24.c
index 5291bb9e986..16b9804da57 100644
--- a/gcc/testsuite/gcc.dg/store_merging_24.c
+++ b/gcc/testsuite/gcc.dg/store_merging_24.c
@@ -1,8 +1,8 @@
 /* PR tree-optimization/87859 */
 /* { dg-do run } */
 /* { dg-options "-O2 -fno-tree-vectorize -fdump-tree-store-merging-details" } */
-/* { dg-final { scan-tree-dump "New sequence of \[23] stores to replace old one of 19 stores" "store-merging" { target i?86-*-* x86_64-*-* } } } */
-/* { dg-final { scan-tree-dump "New sequence of 1 stores to replace old one of 6 stores" "store-merging" { target i?86-*-* x86_64-*-* } } } */
+/* { dg-final { scan-tree-dump "New sequence of \[23] stores to replace old one of 7 stores" "store-merging" { target i?86-*-* x86_64-*-* } } } */
+/* { dg-final { scan-tree-dump "New sequence of 1 stores to replace old one of 2 stores" "store-merging" { target i?86-*-* x86_64-*-* } } } */
 
 struct S {
   union F {
diff --git a/gcc/testsuite/gcc.dg/store_merging_25.c b/gcc/testsuite/gcc.dg/store_merging_25.c
index 96611b5e57b..196af0e2bcd 100644
--- a/gcc/testsuite/gcc.dg/store_merging_25.c
+++ b/gcc/testsuite/gcc.dg/store_merging_25.c
@@ -1,8 +1,8 @@
 /* PR tree-optimization/87859 */
 /* { dg-do run } */
 /* { dg-options "-O2 -fno-tree-vectorize -fdump-tree-store-merging-details" } */
-/* { dg-final { scan-tree-dump "New sequence of \[23] stores to replace old one of 14 stores" "store-merging" { target i?86-*-* x86_64-*-* } } } */
-/* { dg-final { scan-tree-dump "New sequence of 1 stores to replace old one of 6 stores" "store-merging" { target i?86-*-* x86_64-*-* } } } */
+/* { dg-final { scan-tree-dump "New sequence of \[23] stores to replace old one of 3 stores" "store-merging" { target i?86-*-* x86_64-*-* } } } */
+/* { dg-final { scan-tree-dump "New sequence of 1 stores to replace old one of 2 stores" "store-merging" { target i?86-*-* x86_64-*-* } } } */
 
 struct S {
   union F {
diff --git a/gcc/testsuite/gcc.dg/store_merging_6.c b/gcc/testsuite/gcc.dg/store_merging_6.c
index 314829da6d3..2a4e03124bd 100644
--- a/gcc/testsuite/gcc.dg/store_merging_6.c
+++ b/gcc/testsuite/gcc.dg/store_merging_6.c
@@ -50,4 +50,4 @@ main (void)
 }
 
 
-/* { dg-final { scan-tree-dump-times "Merging successful" 2 "store-merging" } } */
+/* { dg-final { scan-tree-dump-times "Merging successful" 0 "store-merging" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/20030714-1.c b/gcc/testsuite/gcc.dg/tree-ssa/20030714-1.c
deleted file mode 100644
index 9f0daac22dc..00000000000
--- a/gcc/testsuite/gcc.dg/tree-ssa/20030714-1.c
+++ /dev/null
@@ -1,45 +0,0 @@
-/* { dg-do compile } */
-/* { dg-options "-O1 -fdump-tree-dom2" } */
-   
-struct rtx_def;
-typedef struct rtx_def *rtx;
-enum rtx_code
-{
-  REG,
-  LAST_AND_UNUSED_RTX_CODE = 256
-};
-typedef union rtunion_def rtunion;
-struct rtx_def
-{
-  enum rtx_code code:16;
-  unsigned frame_related:1;
-};
-
-static rtx
-find_base_value (src)
-     rtx src;
-{
-  rtx temp;
-  rtx src_0, src_2;
-  rtx src_1, src_3;
-
-  if ((src_0->code == REG) && (({src_2;})->frame_related))
-    return find_base_value (src_0);
-  if ((src_1->code == REG) && (({ src_3;})->frame_related))
-    return find_base_value (src_1);
-  if (src_0->code == REG)
-    find_base_value (src_0);
-  if (src_1->code == REG)
-    find_base_value (src_1);
-}
-
-rtx
-find_base_value_wrapper (src)
-     rtx src;
-{
-  return find_base_value (src);
-}
-
-/* There should be no casts to short unsigned int.  */
-/* { dg-final { scan-tree-dump-times "\\(short unsigned int\\)" 0 "dom2"} } */
-
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/20030729-1.c b/gcc/testsuite/gcc.dg/tree-ssa/20030729-1.c
index 59d3a1baffc..0d9d4853124 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/20030729-1.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/20030729-1.c
@@ -47,7 +47,6 @@ readonly_fields_p (type)
    always produce the same result.  */
 /* { dg-final { scan-tree-dump-times "\\(unsigned int\\)" 0 "dom2"} } */
  
-/* There should be one load of ->common.code.  We currently fail this
-   because we load from ->common.code using different types.  */
-/* { dg-final { scan-tree-dump-times "common\.code" 1 "dom2"} } */
+/* There should be no load of ->common.code.  */
+/* { dg-final { scan-tree-dump-times "common\.code" 0 "dom2"} } */
 
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/20030814-6.c b/gcc/testsuite/gcc.dg/tree-ssa/20030814-6.c
index e4b8d43d299..cca6bbda4de 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/20030814-6.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/20030814-6.c
@@ -38,6 +38,5 @@ foo (t, set)
   else
     return 0;
 }
-/* There should be precisely one load of common.code.  If there is
-   more than one, then the dominator optimizations failed.  */
-/* { dg-final { scan-tree-dump-times "common.code" 1 "dom2" } } */
+/* There should be no load of common.code.  */
+/* { dg-final { scan-tree-dump-times "BIT_FIELD_REF" 0 "dom2" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/loop-interchange-14.c b/gcc/testsuite/gcc.dg/tree-ssa/loop-interchange-14.c
index 64c761ca55a..b2e8745d61f 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/loop-interchange-14.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/loop-interchange-14.c
@@ -58,4 +58,4 @@ main (void)
   return 0;
 }
 
-/* { dg-final { scan-tree-dump-times "Loop_pair<outer:., inner:.> is interchanged" 1 "linterchange"} } */
+/* { dg-final { scan-tree-dump-times "Loop_pair<outer:., inner:.> is interchanged" 0 "linterchange"} } */
diff --git a/gcc/tree-pass.h b/gcc/tree-pass.h
index 6cdaed7d4b2..6972763d9f3 100644
--- a/gcc/tree-pass.h
+++ b/gcc/tree-pass.h
@@ -422,6 +422,7 @@ extern gimple_opt_pass *make_pass_lower_complex_O0 (gcc::context *ctxt);
 extern gimple_opt_pass *make_pass_lower_complex (gcc::context *ctxt);
 extern gimple_opt_pass *make_pass_lower_switch (gcc::context *ctxt);
 extern gimple_opt_pass *make_pass_lower_switch_O0 (gcc::context *ctxt);
+extern gimple_opt_pass *make_pass_lower_accesses (gcc::context *ctxt);
 extern gimple_opt_pass *make_pass_lower_vector (gcc::context *ctxt);
 extern gimple_opt_pass *make_pass_lower_vector_ssa (gcc::context *ctxt);
 extern gimple_opt_pass *make_pass_omp_oacc_kernels_decompose (gcc::context *ctxt);
-- 
2.30.2


             reply	other threads:[~2023-07-14  5:49 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-07-14  5:49 naveenh [this message]
2023-07-19 10:56 ` Richard Biener

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230714054908.1071907-1-naveenh@marvell.com \
    --to=naveenh@marvell.com \
    --cc=apinski@marvell.com \
    --cc=gcc-patches@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).