diff options
author | Richard Sandiford <rdsandiford@googlemail.com> | 2014-01-25 20:03:16 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2014-01-25 20:03:16 +0000 |
commit | 2c8798a2258d21f1a5baec46fbf98a959397cb49 (patch) | |
tree | 48c5d2f211d3cdf032dcde076acbd7b6b5fae7c7 | |
parent | 746cd71961feb948a9fb9ce819d2e3f6bc87a96f (diff) | |
download | gcc-2c8798a2258d21f1a5baec46fbf98a959397cb49.zip gcc-2c8798a2258d21f1a5baec46fbf98a959397cb49.tar.gz gcc-2c8798a2258d21f1a5baec46fbf98a959397cb49.tar.bz2 |
rtlanal.c (canonicalize_condition): Split out duplicated mode check.
gcc/
* rtlanal.c (canonicalize_condition): Split out duplicated mode check.
Handle XOR.
gcc/testsuite/
* gcc.dg/unroll_1.c: Add -fenable-rtl-loop2.
From-SVN: r207076
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/rtlanal.c | 51 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/unroll_1.c | 2 |
4 files changed, 41 insertions, 21 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ea51b3e..563642e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2014-01-25 Richard Sandiford <rdsandiford@googlemail.com> + + * rtlanal.c (canonicalize_condition): Split out duplicated mode check. + Handle XOR. + 2014-01-25 Jakub Jelinek <jakub@redhat.com> * print-rtl.c (in_call_function_usage): New var. diff --git a/gcc/rtlanal.c b/gcc/rtlanal.c index aff8f53..7a9efecd 100644 --- a/gcc/rtlanal.c +++ b/gcc/rtlanal.c @@ -5051,23 +5051,24 @@ canonicalize_condition (rtx insn, rtx cond, int reverse, rtx *earliest, ??? This mode check should perhaps look more like the mode check in simplify_comparison in combine. */ - - if ((GET_CODE (SET_SRC (set)) == COMPARE - || (((code == NE - || (code == LT - && val_signbit_known_set_p (inner_mode, - STORE_FLAG_VALUE)) + if (((GET_MODE_CLASS (mode) == MODE_CC) + != (GET_MODE_CLASS (inner_mode) == MODE_CC)) + && mode != VOIDmode + && inner_mode != VOIDmode) + break; + if (GET_CODE (SET_SRC (set)) == COMPARE + || (((code == NE + || (code == LT + && val_signbit_known_set_p (inner_mode, + STORE_FLAG_VALUE)) #ifdef FLOAT_STORE_FLAG_VALUE - || (code == LT - && SCALAR_FLOAT_MODE_P (inner_mode) - && (fsfv = FLOAT_STORE_FLAG_VALUE (inner_mode), - REAL_VALUE_NEGATIVE (fsfv))) + || (code == LT + && SCALAR_FLOAT_MODE_P (inner_mode) + && (fsfv = FLOAT_STORE_FLAG_VALUE (inner_mode), + REAL_VALUE_NEGATIVE (fsfv))) #endif - )) - && COMPARISON_P (SET_SRC (set)))) - && (((GET_MODE_CLASS (mode) == MODE_CC) - == (GET_MODE_CLASS (inner_mode) == MODE_CC)) - || mode == VOIDmode || inner_mode == VOIDmode)) + )) + && COMPARISON_P (SET_SRC (set)))) x = SET_SRC (set); else if (((code == EQ || (code == GE @@ -5080,15 +5081,25 @@ canonicalize_condition (rtx insn, rtx cond, int reverse, rtx *earliest, REAL_VALUE_NEGATIVE (fsfv))) #endif )) - && COMPARISON_P (SET_SRC (set)) - && (((GET_MODE_CLASS (mode) == MODE_CC) - == (GET_MODE_CLASS (inner_mode) == MODE_CC)) - || mode == VOIDmode || inner_mode == VOIDmode)) - + && COMPARISON_P (SET_SRC (set))) { reverse_code = 1; x = SET_SRC (set); } + else if ((code == EQ || code == NE) + && GET_CODE (SET_SRC (set)) == XOR) + /* Handle sequences like: + + (set op0 (xor X Y)) + ...(eq|ne op0 (const_int 0))... + + in which case: + + (eq op0 (const_int 0)) reduces to (eq X Y) + (ne op0 (const_int 0)) reduces to (ne X Y) + + This is the form used by MIPS16, for example. */ + x = SET_SRC (set); else break; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 899211b..9579219 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2014-01-25 Richard Sandiford <rdsandiford@googlemail.com> + + * gcc.dg/unroll_1.c: Add -fenable-rtl-loop2. + 2014-01-25 Bernd Edlinger <bernd.edlinger@hotmail.de> * gcc.dg/vect/vect-nop-move.c (main): Check for vect runtime. diff --git a/gcc/testsuite/gcc.dg/unroll_1.c b/gcc/testsuite/gcc.dg/unroll_1.c index 378f819..b1d3e7c 100644 --- a/gcc/testsuite/gcc.dg/unroll_1.c +++ b/gcc/testsuite/gcc.dg/unroll_1.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fdump-rtl-loop2_unroll=stderr -fno-peel-loops -fno-tree-vrp -fdisable-tree-cunroll -fdisable-tree-cunrolli -fenable-rtl-loop2_unroll" } */ +/* { dg-options "-O2 -fdump-rtl-loop2_unroll=stderr -fno-peel-loops -fno-tree-vrp -fdisable-tree-cunroll -fdisable-tree-cunrolli -fenable-rtl-loop2 -fenable-rtl-loop2_unroll" } */ unsigned a[100], b[100]; inline void bar() |