From 1de12eab7496fe7a8a03e83efbbf6dd6318c3aa0 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Mon, 10 May 2010 20:28:03 +0200 Subject: [PATCH] re PR debug/44028 (-fcompare-debug failure (length) with -O3 -fsched-pressure -fschedule-insns) PR debug/44028 * haifa-sched.c (schedule_insn): When clearing INSN_VAR_LOCATION_LOC, clear also INSN_REG_USE_LIST. * gcc.dg/pr44028.c: New test. From-SVN: r159240 --- gcc/ChangeLog | 6 ++++++ gcc/haifa-sched.c | 9 +++++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/pr44028.c | 22 ++++++++++++++++++++++ 4 files changed, 42 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/pr44028.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 07f66dcc061..cd9b3749390 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2010-05-10 Jakub Jelinek + + PR debug/44028 + * haifa-sched.c (schedule_insn): When clearing INSN_VAR_LOCATION_LOC, + clear also INSN_REG_USE_LIST. + 2010-05-10 Rainer Orth * config/mips/mips.c (TARGET_SMALL_REGISTER_CLASSES_FOR_MODE_P): Undef. diff --git a/gcc/haifa-sched.c b/gcc/haifa-sched.c index b7f0cfce359..0dd220d7302 100644 --- a/gcc/haifa-sched.c +++ b/gcc/haifa-sched.c @@ -1695,6 +1695,7 @@ schedule_insn (rtx insn) sd_iterator_cond (&sd_it, &dep);) { rtx dbg = DEP_PRO (dep); + struct reg_use_data *use, *next; gcc_assert (DEBUG_INSN_P (dbg)); @@ -1716,6 +1717,14 @@ schedule_insn (rtx insn) INSN_VAR_LOCATION_LOC (dbg) = gen_rtx_UNKNOWN_VAR_LOC (); df_insn_rescan (dbg); + /* Unknown location doesn't use any registers. */ + for (use = INSN_REG_USE_LIST (dbg); use != NULL; use = next) + { + next = use->next_insn_use; + free (use); + } + INSN_REG_USE_LIST (dbg) = NULL; + /* We delete rather than resolve these deps, otherwise we crash in sched_free_deps(), because forward deps are expected to be released before backward deps. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f54d9c4a898..824920b4135 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-05-10 Jakub Jelinek + + PR debug/44028 + * gcc.dg/pr44028.c: New test. + 2010-05-08 Daniel Franke PR fortran/27866 diff --git a/gcc/testsuite/gcc.dg/pr44028.c b/gcc/testsuite/gcc.dg/pr44028.c new file mode 100644 index 00000000000..33452172bd7 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr44028.c @@ -0,0 +1,22 @@ +/* PR debug/44028 */ +/* { dg-do compile } */ +/* { dg-options "-O3 -fcompare-debug" } */ +/* { dg-options "-O3 -fsched-pressure -fschedule-insns -fcompare-debug" { target i?86-*-* x86_64-*-* } } */ + +struct S { int val[16]; }; + +static inline int +bar (struct S x) +{ + long double pc = 0; + int i; + for (i = 0; i < 16; i++) + pc += x.val[i]; + return pc; +} + +int +foo (struct S x) +{ + return bar (x); +} -- 2.30.2