[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:
parent
4404c2826c
commit
8632824e9c
|
@ -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
|
||||
|
|
|
@ -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))).
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
}
|
Loading…
Reference in New Issue