Message ID | 6df8cb290d8dbe75758fc6345f47ce6a6c769842.1403467286.git.segher@kernel.crashing.org |
---|---|
State | New |
Headers | show |
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
> 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 --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))