diff options
author | Jakub Jelinek <jakub@redhat.com> | 2013-11-26 21:54:37 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2013-11-26 21:54:37 +0100 |
commit | 9e3de74cdf7b5c6f3b762299a6492889429931c1 (patch) | |
tree | 24e0beaf45dda2fa9d828f649cefe0700c0a2ca9 /gcc | |
parent | 5999f07fba49a339bed42319b2a304f521872931 (diff) | |
download | gcc-9e3de74cdf7b5c6f3b762299a6492889429931c1.zip gcc-9e3de74cdf7b5c6f3b762299a6492889429931c1.tar.gz gcc-9e3de74cdf7b5c6f3b762299a6492889429931c1.tar.bz2 |
re PR rtl-optimization/59166 (ICE in simplify_subreg, at simplify-rtx.c:5901 on valid code (at -O1 and above with -g enabled))
PR rtl-optimization/59166
* ira.c (find_moveable_pseudos): Use DF_REF_REAL_LOC instead of
DF_REF_LOC in validate_change call.
(split_live_ranges_for_shrink_wrap): Likewise.
* gcc.dg/torture/pr59166.c: New test.
From-SVN: r205413
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/ira.c | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr59166.c | 37 |
4 files changed, 48 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0d97d2e..c2d977e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,10 @@ 2013-11-26 Jakub Jelinek <jakub@redhat.com> + PR rtl-optimization/59166 + * ira.c (find_moveable_pseudos): Use DF_REF_REAL_LOC instead of + DF_REF_LOC in validate_change call. + (split_live_ranges_for_shrink_wrap): Likewise. + PR middle-end/59150 * omp-low.c (lower_rec_input_clause): For reduction with placeholder of references to constant size types in simd loops, defer emitting @@ -4812,7 +4812,7 @@ find_moveable_pseudos (void) { rtx def_reg = DF_REF_REG (def); rtx newreg = ira_create_new_reg (def_reg); - if (validate_change (def_insn, DF_REF_LOC (def), newreg, 0)) + if (validate_change (def_insn, DF_REF_REAL_LOC (def), newreg, 0)) { unsigned nregno = REGNO (newreg); emit_insn_before (gen_move_insn (def_reg, newreg), use_insn); @@ -5034,7 +5034,7 @@ split_live_ranges_for_shrink_wrap (void) rtx newreg = NULL_RTX; df_ref use, next; - for (use = DF_REG_USE_CHAIN (REGNO(dest)); use; use = next) + for (use = DF_REG_USE_CHAIN (REGNO (dest)); use; use = next) { rtx uin = DF_REF_INSN (use); next = DF_REF_NEXT_REG (use); @@ -5045,7 +5045,7 @@ split_live_ranges_for_shrink_wrap (void) { if (!newreg) newreg = ira_create_new_reg (dest); - validate_change (uin, DF_REF_LOC (use), newreg, true); + validate_change (uin, DF_REF_REAL_LOC (use), newreg, true); } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a00cd97..fc50a05 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2013-11-26 Jakub Jelinek <jakub@redhat.com> + PR rtl-optimization/59166 + * gcc.dg/torture/pr59166.c: New test. + PR c++/58874 * g++.dg/gomp/pr58874.C: New test. diff --git a/gcc/testsuite/gcc.dg/torture/pr59166.c b/gcc/testsuite/gcc.dg/torture/pr59166.c new file mode 100644 index 0000000..d29ec33 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr59166.c @@ -0,0 +1,37 @@ +/* PR rtl-optimization/59166 */ +/* { dg-additional-options "-fcompare-debug" } */ + +int a, b, c, f, g; + +void +foo () +{ + for (; b; b++) + for (; f; f = g) + for (; a;) + ; +} + +static int +bar (int p) +{ + short d; + if (c) + { + for (; f; f = g); + foo (); + d = p; + char e = d; + if (p) + return 1; + } + return p; +} + +int +main () +{ + bar (0); + bar (g); + return 0; +} |