re PR rtl-optimization/42691 (problematic REG_EQUAL note added to SUBREG)

2010-01-15  Jing Yu  <jingyu@google.com>

	PR rtl-optimization/42691
	* combine.c (try_combine): Set changed_i3_dest to 1 when I2 and I3 set
	a pseudo to a constant and are merged, and adjust comments.

2010-01-15  Jing Yu  <jingyu@google.com>

	PR rtl-optimization/42691
	* gcc.c-torture/execute/pr42691.c: New.

From-SVN: r155944
This commit is contained in:
Jing Yu 2010-01-15 18:47:45 +00:00 committed by Jing Yu
parent a1b5171bd8
commit 1018d41ac2
4 changed files with 57 additions and 2 deletions

View File

@ -1,3 +1,9 @@
2010-01-15 Jing Yu <jingyu@google.com>
PR rtl-optimization/42691
* combine.c (try_combine): Set changed_i3_dest to 1 when I2 and I3 set
a pseudo to a constant and are merged, and adjust comments.
2010-01-15 Eric Botcazou <ebotcazou@adacore.com>
* config/i386/sse.md (avx_vperm2f128<mode>3): Fix typo.

View File

@ -2663,10 +2663,16 @@ try_combine (rtx i3, rtx i2, rtx i1, int *new_direct_jump_p)
i2dest = SET_DEST (temp);
i2dest_killed = dead_or_set_p (i2, i2dest);
/* Replace the source in I2 with the new constant and make the
resulting insn the new pattern for I3. Then skip to where we
validate the pattern. Everything was set up above. */
SUBST (SET_SRC (temp),
immed_double_const (olo, ohi, GET_MODE (SET_DEST (temp))));
newpat = PATTERN (i2);
/* The dest of I3 has been replaced with the dest of I2. */
changed_i3_dest = 1;
goto validate_replacement;
}
}
@ -3038,8 +3044,6 @@ try_combine (rtx i3, rtx i2, rtx i1, int *new_direct_jump_p)
}
}
/* We come here when we are replacing a destination in I2 with the
destination of I3. */
validate_replacement:
/* Note which hard regs this insn has as inputs. */

View File

@ -1,3 +1,8 @@
2010-01-15 Jing Yu <jingyu@google.com>
PR rtl-optimization/42691
* gcc.c-torture/execute/pr42691.c: New.
2010-01-15 Richard Guenther <rguenther@suse.de>
PR middle-end/42739

View File

@ -0,0 +1,40 @@
extern void abort (void);
union _D_rep
{
unsigned short rep[4];
double val;
};
int add(double* key, double* table)
{
unsigned i = 0;
double* deletedEntry = 0;
while (1) {
double* entry = table + i;
if (*entry == *key)
break;
union _D_rep _D_inf = {{ 0, 0, 0, 0x7ff0 }};
if (*entry != _D_inf.val)
abort ();
union _D_rep _D_inf2 = {{ 0, 0, 0, 0x7ff0 }};
if (!_D_inf2.val)
deletedEntry = entry;
i++;
}
*deletedEntry = 0.0;
return 0;
}
int main ()
{
union _D_rep infinit = {{ 0, 0, 0, 0x7ff0 }};
double table[2] = { infinit.val, 23 };
double key = 23;
int ret = add (&key, table);
return ret;
}