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

Backport from mainline(4.5) to fix a regression bug.

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: r155945
This commit is contained in:
Jing Yu 2010-01-15 19:08:53 +00:00 committed by Jing Yu
parent e3aaa97199
commit 083a78158f
4 changed files with 57 additions and 3 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 Richard Guenther <rguenther@suse.de>
* tree-ssa-loop-im.c (gen_lsm_tmp_name): Fix bogus fallthru.

View File

@ -2445,10 +2445,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;
}
}
@ -2820,8 +2826,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. */
@ -13040,4 +13044,3 @@ struct rtl_opt_pass pass_combine =
TODO_ggc_collect, /* todo_flags_finish */
}
};

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-14 Jakub Jelinek <jakub@redhat.com>
PR middle-end/42674

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;
}