[RTL-ree] PR rtl-optimization/68194: Restrict copy instruction in presence of conditional moves

PR rtl-optimization/68194
	PR rtl-optimization/68328
	PR rtl-optimization/68185
	* ree.c (combine_reaching_defs): Reject copy_needed case if
	copies_list is not empty.

	* gcc.c-torture/execute/pr68185.c: New test.
	* gcc.c-torture/execute/pr68328.c: Likewise.

From-SVN: r230795
This commit is contained in:
Kyrylo Tkachov 2015-11-24 09:31:57 +00:00
parent 4404c2826c
commit 8632824e9c
5 changed files with 96 additions and 0 deletions

View File

@ -1,3 +1,12 @@
2015-11-24 Bernd Schmidt <bschmidt@redhat.com>
Kyrylo Tkachov <kyrylo.tkachov@arm.com>
PR rtl-optimization/68194
PR rtl-optimization/68328
PR rtl-optimization/68185
* ree.c (combine_reaching_defs): Reject copy_needed case if
copies_list is not empty.
2015-11-24 Richard Biener <rguenther@suse.de>
PR middle-end/68221

View File

@ -760,6 +760,12 @@ combine_reaching_defs (ext_cand *cand, const_rtx set_pat, ext_state *state)
if (state->defs_list.length () != 1)
return false;
/* We don't have the structure described above if there are
conditional moves in between the def and the candidate,
and we will not handle them correctly. See PR68194. */
if (state->copies_list.length () > 0)
return false;
/* We require the candidate not already be modified. It may,
for example have been changed from a (sign_extend (reg))
into (zero_extend (sign_extend (reg))).

View File

@ -1,3 +1,11 @@
2015-11-24 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
PR rtl-optimization/68194
PR rtl-optimization/68328
PR rtl-optimization/68185
* gcc.c-torture/execute/pr68185.c: New test.
* gcc.c-torture/execute/pr68328.c: Likewise.
2015-11-23 Jan Hubicka <hubicka@ucw.cz>
* gcc.c-torture/execute/lto-tbaa-1.c: New testcase.

View File

@ -0,0 +1,29 @@
int a, b, d = 1, e, f, o, u, w = 1, z;
short c, q, t;
int
main ()
{
char g;
for (; d; d--)
{
while (o)
for (; e;)
{
c = b;
int h = o = z;
for (; u;)
for (; a;)
;
}
if (t < 1)
g = w;
f = g;
g && (q = 1);
}
if (q != 1)
__builtin_abort ();
return 0;
}

View File

@ -0,0 +1,44 @@
int a, b, c = 1, d = 1, e;
__attribute__ ((noinline, noclone))
int foo (void)
{
asm volatile ("":::"memory");
return 4195552;
}
__attribute__ ((noinline, noclone))
void bar (int x, int y)
{
asm volatile (""::"g" (x), "g" (y):"memory");
if (y == 0)
__builtin_abort ();
}
int
baz (int x)
{
char g, h;
int i, j;
foo ();
for (;;)
{
if (c)
h = d;
g = h < x ? h : 0;
i = (signed char) ((unsigned char) (g - 120) ^ 1);
j = i > 97;
if (a - j)
bar (0x123456, 0);
if (!b)
return e;
}
}
int
main ()
{
baz (2);
return 0;
}