diff mbox

Only transform rotate to rotatert and v.v. if target has both

Message ID 6df8cb290d8dbe75758fc6345f47ce6a6c769842.1403467286.git.segher@kernel.crashing.org
State New
Headers show

Commit Message

Segher Boessenkool June 22, 2014, 8:58 p.m. UTC
Many targets do not have both rotate and rotatert.  Of the 47 targets
in the tree, 17 have both, 9 have only rotate, 2 have only rotatert, and
19 have neither (this is based on "grep -wil" so it can be slightly off).

rs6000 has only rotate, and mips has only rotatert.  For such targets
simplifying rotate to rotatert and vice versa is not simplifying things
at all.  rs6000 has already way too many rotate patterns (some days it
seems like two thousand, but it is somewhat less in reality still); I
would prefer not to double that again.

So, this patch makes genrecog define HAVE_rotate and HAVE_rotatert if
those RTL codes are mentioned anywhere in the machine description, and
then does the transformation in simplify-rtx.c only if both these flags
are set.

Bootstrapped and tested on powerpc64-linux.  Okay to apply?


Segher


2014-06-22  Segher Boessenkool  <segher@kernel.crashing.org>

gcc/
	* genconfig.c (have_rotate_flag, have_rotatert_flag): New
	variables.
	(walk_insn_part) <ROTATE, ROTATERT>: New cases.
	(main): Conditionally write HAVE_rotate c.q. HAVE_rotatert.
	* simplify-rtx.c (simplify_binary_operation_1) <ROTATE, ROTATERT>:
	Only do the transformation if both HAVE_rotate and HAVE_rotatert.

---
 gcc/genconfig.c    | 18 ++++++++++++++++++
 gcc/simplify-rtx.c |  2 ++
 2 files changed, 20 insertions(+)

Comments

Jeff Law June 23, 2014, 6:56 p.m. UTC | #1
On 06/22/14 14:58, Segher Boessenkool wrote:
> Many targets do not have both rotate and rotatert.  Of the 47 targets
> in the tree, 17 have both, 9 have only rotate, 2 have only rotatert, and
> 19 have neither (this is based on "grep -wil" so it can be slightly off).
>
> rs6000 has only rotate, and mips has only rotatert.  For such targets
> simplifying rotate to rotatert and vice versa is not simplifying things
> at all.  rs6000 has already way too many rotate patterns (some days it
> seems like two thousand, but it is somewhat less in reality still); I
> would prefer not to double that again.
>
> So, this patch makes genrecog define HAVE_rotate and HAVE_rotatert if
> those RTL codes are mentioned anywhere in the machine description, and
> then does the transformation in simplify-rtx.c only if both these flags
> are set.
>
> Bootstrapped and tested on powerpc64-linux.  Okay to apply?
>
>
> Segher
>
>
> 2014-06-22  Segher Boessenkool  <segher@kernel.crashing.org>
>
> gcc/
> 	* genconfig.c (have_rotate_flag, have_rotatert_flag): New
> 	variables.
> 	(walk_insn_part) <ROTATE, ROTATERT>: New cases.
> 	(main): Conditionally write HAVE_rotate c.q. HAVE_rotatert.
> 	* simplify-rtx.c (simplify_binary_operation_1) <ROTATE, ROTATERT>:
> 	Only do the transformation if both HAVE_rotate and HAVE_rotatert.
OK.  It would be useful if you could add one or more tests to the 
testsuite to confirm proper behaviour when only one of ROTATE/ROTATERT 
is defined.

jeff
Segher Boessenkool July 2, 2014, 8:21 p.m. UTC | #2
> OK.

Thanks, committed.

> It would be useful if you could add one or more tests to the 
> testsuite to confirm proper behaviour when only one of ROTATE/ROTATERT 
> is defined.

I'll send a patch in a minute that tests this (as well as some other
things) for rs6000.


Segher
diff mbox

Patch

diff --git a/gcc/genconfig.c b/gcc/genconfig.c
index cafa8d3..d1996c3 100644
--- a/gcc/genconfig.c
+++ b/gcc/genconfig.c
@@ -36,6 +36,8 @@  static int have_cc0_flag;
 static int have_cmove_flag;
 static int have_cond_exec_flag;
 static int have_lo_sum_flag;
+static int have_rotate_flag;
+static int have_rotatert_flag;
 static int have_peephole_flag;
 static int have_peephole2_flag;
 
@@ -117,6 +119,16 @@  walk_insn_part (rtx part, int recog_p, int non_pc_set_src)
 	have_lo_sum_flag = 1;
       return;
 
+    case ROTATE:
+      if (recog_p)
+	have_rotate_flag = 1;
+      return;
+
+    case ROTATERT:
+      if (recog_p)
+	have_rotatert_flag = 1;
+      return;
+
     case SET:
       walk_insn_part (SET_DEST (part), 0, recog_p);
       walk_insn_part (SET_SRC (part), recog_p,
@@ -346,6 +358,12 @@  main (int argc, char **argv)
   if (have_lo_sum_flag)
     printf ("#define HAVE_lo_sum 1\n");
 
+  if (have_rotate_flag)
+    printf ("#define HAVE_rotate 1\n");
+
+  if (have_rotatert_flag)
+    printf ("#define HAVE_rotatert 1\n");
+
   if (have_peephole_flag)
     printf ("#define HAVE_peephole 1\n");
 
diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c
index 181b56f..07b9353 100644
--- a/gcc/simplify-rtx.c
+++ b/gcc/simplify-rtx.c
@@ -3076,6 +3076,7 @@  simplify_binary_operation_1 (enum rtx_code code, enum machine_mode mode,
 	 prefer left rotation, if op1 is from bitsize / 2 + 1 to
 	 bitsize - 1, use other direction of rotate with 1 .. bitsize / 2 - 1
 	 amount instead.  */
+#if defined(HAVE_rotate) && defined(HAVE_rotatert)
       if (CONST_INT_P (trueop1)
 	  && IN_RANGE (INTVAL (trueop1),
 		       GET_MODE_BITSIZE (mode) / 2 + (code == ROTATE),
@@ -3083,6 +3084,7 @@  simplify_binary_operation_1 (enum rtx_code code, enum machine_mode mode,
 	return simplify_gen_binary (code == ROTATE ? ROTATERT : ROTATE,
 				    mode, op0, GEN_INT (GET_MODE_BITSIZE (mode)
 							- INTVAL (trueop1)));
+#endif
       /* FALLTHRU */
     case ASHIFTRT:
       if (trueop1 == CONST0_RTX (mode))