mirror of git://gcc.gnu.org/git/gcc.git
Fix for powerpc/c4x problem with missed loop optimizations.
* loop.c (get_condition): Allow combine when either compare is VOIDmode. From-SVN: r22922
This commit is contained in:
parent
1636b950f9
commit
12f289ac32
|
|
@ -1,3 +1,8 @@
|
||||||
|
Thu Oct 8 12:50:47 1998 Jim Wilson <wilson@cygnus.com>
|
||||||
|
|
||||||
|
* loop.c (get_condition): Allow combine when either compare is
|
||||||
|
VOIDmode.
|
||||||
|
|
||||||
Thu Oct 8 11:31:01 PDT 1998 Jeff Law (law@cygnus.com)
|
Thu Oct 8 11:31:01 PDT 1998 Jeff Law (law@cygnus.com)
|
||||||
|
|
||||||
* version.c: Bump for snapshot.
|
* version.c: Bump for snapshot.
|
||||||
|
|
|
||||||
20
gcc/loop.c
20
gcc/loop.c
|
|
@ -7765,7 +7765,14 @@ get_condition (jump, earliest)
|
||||||
like Alpha that have an IEEE compliant EQ instruction, and
|
like Alpha that have an IEEE compliant EQ instruction, and
|
||||||
a non-IEEE compliant BEQ instruction. The use of CCmode is
|
a non-IEEE compliant BEQ instruction. The use of CCmode is
|
||||||
actually artificial, simply to prevent the combination, but
|
actually artificial, simply to prevent the combination, but
|
||||||
should not affect other platforms. */
|
should not affect other platforms.
|
||||||
|
|
||||||
|
However, we must allow VOIDmode comparisons to match either
|
||||||
|
CCmode or non-CCmode comparison, because some ports have
|
||||||
|
modeless comparisons inside branch patterns.
|
||||||
|
|
||||||
|
??? This mode check should perhaps look more like the mode check
|
||||||
|
in simplify_comparison in combine. */
|
||||||
|
|
||||||
if ((GET_CODE (SET_SRC (set)) == COMPARE
|
if ((GET_CODE (SET_SRC (set)) == COMPARE
|
||||||
|| (((code == NE
|
|| (((code == NE
|
||||||
|
|
@ -7783,8 +7790,9 @@ get_condition (jump, earliest)
|
||||||
#endif
|
#endif
|
||||||
))
|
))
|
||||||
&& GET_RTX_CLASS (GET_CODE (SET_SRC (set))) == '<'))
|
&& GET_RTX_CLASS (GET_CODE (SET_SRC (set))) == '<'))
|
||||||
&& ((GET_MODE_CLASS (mode) == MODE_CC)
|
&& (((GET_MODE_CLASS (mode) == MODE_CC)
|
||||||
== (GET_MODE_CLASS (inner_mode) == MODE_CC)))
|
== (GET_MODE_CLASS (inner_mode) == MODE_CC))
|
||||||
|
|| mode == VOIDmode || inner_mode == VOIDmode))
|
||||||
x = SET_SRC (set);
|
x = SET_SRC (set);
|
||||||
else if (((code == EQ
|
else if (((code == EQ
|
||||||
|| (code == GE
|
|| (code == GE
|
||||||
|
|
@ -7801,8 +7809,10 @@ get_condition (jump, earliest)
|
||||||
#endif
|
#endif
|
||||||
))
|
))
|
||||||
&& GET_RTX_CLASS (GET_CODE (SET_SRC (set))) == '<'
|
&& GET_RTX_CLASS (GET_CODE (SET_SRC (set))) == '<'
|
||||||
&& ((GET_MODE_CLASS (mode) == MODE_CC)
|
&& (((GET_MODE_CLASS (mode) == MODE_CC)
|
||||||
== (GET_MODE_CLASS (inner_mode) == MODE_CC)))
|
== (GET_MODE_CLASS (inner_mode) == MODE_CC))
|
||||||
|
|| mode == VOIDmode || inner_mode == VOIDmode))
|
||||||
|
|
||||||
{
|
{
|
||||||
/* We might have reversed a LT to get a GE here. But this wasn't
|
/* We might have reversed a LT to get a GE here. But this wasn't
|
||||||
actually the comparison of data, so we don't flag that we
|
actually the comparison of data, so we don't flag that we
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue