re PR middle-end/33181 (Revision 127766 generates bad cmov)

gcc/

2007-08-26  H.J. Lu  <hongjiu.lu@intel.com>

	PR middle-end/33181
	* ifcvt.c (noce_get_alt_condition): Make sure that the previous
	non NOTE insn doesn't cross basic block.
	(noce_try_abs): Likewise.
	(noce_process_if_block): Likewise.

gcc/testsuite/

2007-08-26  H.J. Lu  <hongjiu.lu@intel.com>

	PR middle-end/33181
	* gcc.dg/ifelse-2.c: New.

From-SVN: r127810
This commit is contained in:
H.J. Lu 2007-08-26 18:24:19 +00:00 committed by H.J. Lu
parent 75be5dc0a1
commit 6d46783956
4 changed files with 50 additions and 0 deletions

View File

@ -1,3 +1,11 @@
2007-08-26 H.J. Lu <hongjiu.lu@intel.com>
PR middle-end/33181
* ifcvt.c (noce_get_alt_condition): Make sure that the previous
non NOTE insn doesn't cross basic block.
(noce_try_abs): Likewise.
(noce_process_if_block): Likewise.
2007-08-26 David Edelsohn <edelsohn@gnu.org>
PR target/33151

View File

@ -1534,6 +1534,7 @@ noce_get_alt_condition (struct noce_if_info *if_info, rtx target,
/* First, look to see if we put a constant in a register. */
prev_insn = prev_nonnote_insn (if_info->cond_earliest);
if (prev_insn
&& BLOCK_NUM (prev_insn) == BLOCK_NUM (if_info->cond_earliest)
&& INSN_P (prev_insn)
&& GET_CODE (PATTERN (prev_insn)) == SET)
{
@ -1772,6 +1773,7 @@ noce_try_abs (struct noce_if_info *if_info)
{
rtx set, insn = prev_nonnote_insn (earliest);
if (insn
&& BLOCK_NUM (insn) == BLOCK_NUM (earliest)
&& (set = single_set (insn))
&& rtx_equal_p (SET_DEST (set), c))
{
@ -2198,6 +2200,7 @@ noce_process_if_block (struct noce_if_info *if_info)
COND_EARLIEST to JUMP. Make sure the relevant data is still
intact. */
if (! insn_b
|| BLOCK_NUM (insn_b) != BLOCK_NUM (if_info->cond_earliest)
|| !NONJUMP_INSN_P (insn_b)
|| (set_b = single_set (insn_b)) == NULL_RTX
|| ! rtx_equal_p (x, SET_DEST (set_b))

View File

@ -1,3 +1,8 @@
2007-08-26 H.J. Lu <hongjiu.lu@intel.com>
PR middle-end/33181
* gcc.dg/ifelse-2.c: New.
2007-08-26 Tobias Burnus <burnus@net-b.de>
PR fortran/32980

View File

@ -0,0 +1,34 @@
/*
{ dg-do run }
{ dg-options "-O2" }
*/
extern void abort (void);
enum Status
{
P_ON_LOWER = -4,
P_ON_UPPER = -2,
P_FREE = -1
};
void
foo (enum Status *stat, double newUpper, double lower, double max)
{
if (newUpper >= max)
*stat = P_FREE;
else if (newUpper == lower)
*stat = P_ON_LOWER;
}
int
main ()
{
enum Status stat = P_ON_UPPER;
foo (&stat, 5.0, -10.0, 10.0);
if (stat != P_ON_UPPER)
abort ();
return 0;
}