[SH] RFA: Use new rtl iterators in shmedia_cleanup_truncate
diff mbox

Message ID 87y4s4v552.fsf@googlemail.com
State New
Headers show

Commit Message

Richard Sandiford Oct. 25, 2014, 10:02 a.m. UTC
This is part of a series to remove uses of for_each_rtx from the ports.
There are some some small rearrangements to cope with the 80-character limit.

Tested by making sure there were no code changes for gcc.dg, gcc.c-torture
and g++.dg for sh-elf.  OK to install?

Thanks,
Richard


gcc/
	* config/sh/sh-protos.h (shmedia_cleanup_truncate): Take an
	rtx as argument and return the number of changes.
	* config/sh/sh.c: Include rtl-iter.h.
	(shmedia_cleanup_truncate): Take an rtx as argument and iterate
	over all subrtxes.  Return the number of changes made.
	* config/sh/sh.md: Update caller accordingly.

Comments

Oleg Endo Oct. 25, 2014, 5:54 p.m. UTC | #1
On Oct 25, 2014, at 12:02 PM, Richard Sandiford <rdsandiford@googlemail.com> wrote:

> This is part of a series to remove uses of for_each_rtx from the ports.
> There are some some small rearrangements to cope with the 80-character limit.
> 
> Tested by making sure there were no code changes for gcc.dg, gcc.c-torture
> and g++.dg for sh-elf.  OK to install?

OK with me.

Cheers,
Oleg




> gcc/
>    * config/sh/sh-protos.h (shmedia_cleanup_truncate): Take an
>    rtx as argument and return the number of changes.
>    * config/sh/sh.c: Include rtl-iter.h.
>    (shmedia_cleanup_truncate): Take an rtx as argument and iterate
>    over all subrtxes.  Return the number of changes made.
>    * config/sh/sh.md: Update caller accordingly.
> 
> Index: gcc/config/sh/sh-protos.h
> ===================================================================
> --- gcc/config/sh/sh-protos.h    2014-10-25 09:40:38.030517007 +0100
> +++ gcc/config/sh/sh-protos.h    2014-10-25 09:51:27.047897823 +0100
> @@ -215,7 +215,7 @@ extern void sh_init_cumulative_args (CUM
> extern rtx sh_dwarf_register_span (rtx);
> 
> extern rtx replace_n_hard_rtx (rtx, rtx *, int , int);
> -extern int shmedia_cleanup_truncate (rtx *, void *);
> +extern int shmedia_cleanup_truncate (rtx);
> 
> extern bool sh_contains_memref_p (rtx);
> extern bool sh_loads_bankedreg_p (rtx);
> Index: gcc/config/sh/sh.c
> ===================================================================
> --- gcc/config/sh/sh.c    2014-10-25 09:40:38.030517007 +0100
> +++ gcc/config/sh/sh.c    2014-10-25 09:51:27.049897841 +0100
> @@ -78,6 +78,7 @@ the Free Software Foundation; either ver
> #include "pass_manager.h"
> #include "context.h"
> #include "builtins.h"
> +#include "rtl-iter.h"
> 
> int code_for_indirect_jump_scratch = CODE_FOR_indirect_jump_scratch;
> 
> @@ -12940,25 +12941,30 @@ sh_gen_truncate (enum machine_mode mode,
>   return gen_rtx_fmt_e (code, mode, x);
> }
> 
> -/* Called via for_each_rtx after reload, to clean up truncates of
> -   registers that span multiple actual hard registers.  */
> +/* Look through X cleaning up truncates of registers that span multiple
> +   actual hard registers.  Return the number of changes made.  */
> int
> -shmedia_cleanup_truncate (rtx *p, void *n_changes)
> +shmedia_cleanup_truncate (rtx x)
> {
> -  rtx x = *p, reg;
> -
> -  if (GET_CODE (x) != TRUNCATE)
> -    return 0;
> -  reg = XEXP (x, 0);
> -  if (GET_MODE_SIZE (GET_MODE (reg)) > 8 && REG_P (reg))
> +  int n_changes = 0;
> +  subrtx_var_iterator::array_type array;
> +  FOR_EACH_SUBRTX_VAR (iter, array, x, NONCONST)
>     {
> -      enum machine_mode reg_mode = GET_MODE (reg);
> -      XEXP (x, 0) = simplify_subreg (DImode, reg, reg_mode,
> -                     subreg_lowpart_offset (DImode, reg_mode));
> -      *(int*) n_changes += 1;
> -      return -1;
> +      rtx x = *iter;
> +      if (GET_CODE (x) == TRUNCATE)
> +    {
> +      rtx reg = XEXP (x, 0);
> +      enum machine_mode reg_mode = GET_MODE (reg);
> +      if (REG_P (reg) && GET_MODE_SIZE (reg_mode) > 8)
> +        {
> +          int offset = subreg_lowpart_offset (DImode, reg_mode);
> +          XEXP (x, 0) = simplify_subreg (DImode, reg, reg_mode, offset);
> +          n_changes += 1;
> +          iter.skip_subrtxes ();
> +        }
> +    }
>     }
> -  return 0;
> +  return n_changes;
> }
> 
> /* Load and store depend on the highpart of the address.  However,
> Index: gcc/config/sh/sh.md
> ===================================================================
> --- gcc/config/sh/sh.md    2014-10-25 09:40:38.030517007 +0100
> +++ gcc/config/sh/sh.md    2014-10-25 09:51:27.051897858 +0100
> @@ -15803,10 +15803,7 @@ (define_split
>   "TARGET_SHMEDIA && reload_completed"
>   [(set (match_dup 0) (match_dup 1))]
> {
> -  int n_changes = 0;
> -
> -  for_each_rtx (&operands[1], shmedia_cleanup_truncate, &n_changes);
> -  if (!n_changes)
> +  if (!shmedia_cleanup_truncate (operands[1]))
>     FAIL;
> })
>

Patch
diff mbox

Index: gcc/config/sh/sh-protos.h
===================================================================
--- gcc/config/sh/sh-protos.h	2014-10-25 09:40:38.030517007 +0100
+++ gcc/config/sh/sh-protos.h	2014-10-25 09:51:27.047897823 +0100
@@ -215,7 +215,7 @@  extern void sh_init_cumulative_args (CUM
 extern rtx sh_dwarf_register_span (rtx);
 
 extern rtx replace_n_hard_rtx (rtx, rtx *, int , int);
-extern int shmedia_cleanup_truncate (rtx *, void *);
+extern int shmedia_cleanup_truncate (rtx);
 
 extern bool sh_contains_memref_p (rtx);
 extern bool sh_loads_bankedreg_p (rtx);
Index: gcc/config/sh/sh.c
===================================================================
--- gcc/config/sh/sh.c	2014-10-25 09:40:38.030517007 +0100
+++ gcc/config/sh/sh.c	2014-10-25 09:51:27.049897841 +0100
@@ -78,6 +78,7 @@  the Free Software Foundation; either ver
 #include "pass_manager.h"
 #include "context.h"
 #include "builtins.h"
+#include "rtl-iter.h"
 
 int code_for_indirect_jump_scratch = CODE_FOR_indirect_jump_scratch;
 
@@ -12940,25 +12941,30 @@  sh_gen_truncate (enum machine_mode mode,
   return gen_rtx_fmt_e (code, mode, x);
 }
 
-/* Called via for_each_rtx after reload, to clean up truncates of
-   registers that span multiple actual hard registers.  */
+/* Look through X cleaning up truncates of registers that span multiple
+   actual hard registers.  Return the number of changes made.  */
 int
-shmedia_cleanup_truncate (rtx *p, void *n_changes)
+shmedia_cleanup_truncate (rtx x)
 {
-  rtx x = *p, reg;
-
-  if (GET_CODE (x) != TRUNCATE)
-    return 0;
-  reg = XEXP (x, 0);
-  if (GET_MODE_SIZE (GET_MODE (reg)) > 8 && REG_P (reg))
+  int n_changes = 0;
+  subrtx_var_iterator::array_type array;
+  FOR_EACH_SUBRTX_VAR (iter, array, x, NONCONST)
     {
-      enum machine_mode reg_mode = GET_MODE (reg);
-      XEXP (x, 0) = simplify_subreg (DImode, reg, reg_mode,
-				     subreg_lowpart_offset (DImode, reg_mode));
-      *(int*) n_changes += 1;
-      return -1;
+      rtx x = *iter;
+      if (GET_CODE (x) == TRUNCATE)
+	{
+	  rtx reg = XEXP (x, 0);
+	  enum machine_mode reg_mode = GET_MODE (reg);
+	  if (REG_P (reg) && GET_MODE_SIZE (reg_mode) > 8)
+	    {
+	      int offset = subreg_lowpart_offset (DImode, reg_mode);
+	      XEXP (x, 0) = simplify_subreg (DImode, reg, reg_mode, offset);
+	      n_changes += 1;
+	      iter.skip_subrtxes ();
+	    }
+	}
     }
-  return 0;
+  return n_changes;
 }
 
 /* Load and store depend on the highpart of the address.  However,
Index: gcc/config/sh/sh.md
===================================================================
--- gcc/config/sh/sh.md	2014-10-25 09:40:38.030517007 +0100
+++ gcc/config/sh/sh.md	2014-10-25 09:51:27.051897858 +0100
@@ -15803,10 +15803,7 @@  (define_split
   "TARGET_SHMEDIA && reload_completed"
   [(set (match_dup 0) (match_dup 1))]
 {
-  int n_changes = 0;
-
-  for_each_rtx (&operands[1], shmedia_cleanup_truncate, &n_changes);
-  if (!n_changes)
+  if (!shmedia_cleanup_truncate (operands[1]))
     FAIL;
 })