diff options
author | Kyrylo Tkachov <ktkachov@gcc.gnu.org> | 2015-11-24 09:31:57 +0000 |
---|---|---|
committer | Kyrylo Tkachov <ktkachov@gcc.gnu.org> | 2015-11-24 09:31:57 +0000 |
commit | 8632824e9c117077ef95d907ff51553b584609ba (patch) | |
tree | d047e8d586b542f770412c7b9ce466021f56bf60 /gcc | |
parent | 4404c2826c45ffb749e868b011c480a9d279f8e7 (diff) | |
download | gcc-8632824e9c117077ef95d907ff51553b584609ba.zip gcc-8632824e9c117077ef95d907ff51553b584609ba.tar.gz gcc-8632824e9c117077ef95d907ff51553b584609ba.tar.bz2 |
[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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/ree.c | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/execute/pr68185.c | 29 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/execute/pr68328.c | 44 |
5 files changed, 96 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b8e7129..323c4a8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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))). diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2114f8f..522b24b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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. diff --git a/gcc/testsuite/gcc.c-torture/execute/pr68185.c b/gcc/testsuite/gcc.c-torture/execute/pr68185.c new file mode 100644 index 0000000..826531b --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr68185.c @@ -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; +} diff --git a/gcc/testsuite/gcc.c-torture/execute/pr68328.c b/gcc/testsuite/gcc.c-torture/execute/pr68328.c new file mode 100644 index 0000000..edf244b --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr68328.c @@ -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; +} |