diff options
author | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-05-10 18:28:03 +0000 |
---|---|---|
committer | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-05-10 18:28:03 +0000 |
commit | f145fac4afd9586470a3337fe49279ad4a289b33 (patch) | |
tree | d86819bbb461712b2745a75881652b0b4f22b6e0 | |
parent | 2ad972c5ac43a624aa71b28791ae54ffacff57cf (diff) | |
download | gcc-f145fac4afd9586470a3337fe49279ad4a289b33.tar.gz |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@159240 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/haifa-sched.c | 9 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr44028.c | 22 |
4 files changed, 42 insertions, 0 deletions
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 <jakub@redhat.com> + + 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 <ro@CeBiTec.Uni-Bielefeld.DE> * 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 <jakub@redhat.com> + + PR debug/44028 + * gcc.dg/pr44028.c: New test. + 2010-05-08 Daniel Franke <franke.daniel@gmail.com> 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); +} |