From 7ec7a88e8e1f3fa1d8934a3e4e0516f0196495e6 Mon Sep 17 00:00:00 2001 From: hjl Date: Mon, 10 May 2010 14:02:43 +0000 Subject: [PATCH] Nullify regno_allocno_map of the removed allocno. gcc/ 2010-05-10 H.J. Lu Vladimir Makarov PR rtl-optimization/44012 * ira-build.c (remove_unnecessary_allocnos): Nullify regno_allocno_map of the removed allocno. gcc/testsuite/ 2010-05-10 H.J. Lu PR rtl-optimization/44012 * gcc.dg/pr44012.c: New. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@159223 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 7 ++++ gcc/ira-build.c | 4 +++ gcc/testsuite/ChangeLog | 5 +++ gcc/testsuite/gcc.dg/pr44012.c | 58 ++++++++++++++++++++++++++++++++++ 4 files changed, 74 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/pr44012.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7a03e1517470..86156f70d83e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2010-05-10 H.J. Lu + Vladimir Makarov + + PR rtl-optimization/44012 + * ira-build.c (remove_unnecessary_allocnos): Nullify + regno_allocno_map of the removed allocno. + 2010-05-10 Rainer Orth * configure.ac (gcc_cv_ld_eh_gc_sections): Redirect objdump errors diff --git a/gcc/ira-build.c b/gcc/ira-build.c index 16909a9a42a7..c879efa9db2e 100644 --- a/gcc/ira-build.c +++ b/gcc/ira-build.c @@ -1978,6 +1978,10 @@ remove_unnecessary_allocnos (void) merged_p = true; ALLOCNO_LIVE_RANGES (a) = NULL; propagate_some_info_from_allocno (parent_a, a); + /* Remove it from the corresponding regno allocno + map to avoid info propagation of subsequent + allocno into this already removed allocno. */ + a_node->regno_allocno_map[regno] = NULL; finish_allocno (a); } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b15c23fbf1f2..3208c84b3968 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-05-10 H.J. Lu + + PR rtl-optimization/44012 + * gcc.dg/pr44012.c: New. + 2010-05-10 Rainer Orth * lib/lto.exp (lto_prune_vis_warns): Renamed to lto_prune_warns. diff --git a/gcc/testsuite/gcc.dg/pr44012.c b/gcc/testsuite/gcc.dg/pr44012.c new file mode 100644 index 000000000000..bd255ba08fb5 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr44012.c @@ -0,0 +1,58 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fgcse" } */ + +extern void fe (); + +extern int i; + +static inline void +FX (void (*f) ()) +{ + fe (); + (*f) (); +} + +static inline void +f4 () +{ + for (;;) + switch (i) + { + case 306: + FX (&fe); + break; + default: + return; + } +} + +static inline void +f3 () +{ + f4 (); + for (;;) + switch (i) + { + case 267: + FX (&f4); + break; + default: + return; + } +} + +static inline void +f2 () +{ + f3 (); + while (i) + FX (&f3); +} + +void +f1 () +{ + f2 (); + while (1) + FX (&f2); +} -- 2.47.2