From e561a4d3628eedc50e20ce55a790a1677d202c04 Mon Sep 17 00:00:00 2001 From: jakub Date: Tue, 26 Nov 2013 20:54:37 +0000 Subject: [PATCH] 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@205413 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 5 +++++ gcc/ira.c | 6 +++--- gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/gcc.dg/torture/pr59166.c | 37 ++++++++++++++++++++++++++++++++++ 4 files changed, 48 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr59166.c 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 + 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 diff --git a/gcc/ira.c b/gcc/ira.c index 2902ebe..cb2d947 100644 --- a/gcc/ira.c +++ b/gcc/ira.c @@ -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 + 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; +} -- 2.7.4