From: Jakub Jelinek Date: Thu, 1 Jan 2004 13:19:41 +0000 (+0100) Subject: re PR rtl-optimization/13521 ([3.3 only] Endless loop in calculate_global_regs_live) X-Git-Tag: releases/gcc-3.3.3~132 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a412391c75d020d68b9a87219dd09f12025afaf8;p=thirdparty%2Fgcc.git re PR rtl-optimization/13521 ([3.3 only] Endless loop in calculate_global_regs_live) PR optimization/13521 Backport from mainline: 2003-03-22 Richard Henderson * cfgcleanup.c (insns_match_p): Do not do EQUIV substitution after reload. * gcc.c-torture/compile/20031231-1.c: New test. From-SVN: r75300 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e569f4d122c8..74d16a6c9ea5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2004-01-01 Jakub Jelinek + + PR optimization/13521 + Backport from mainline: + 2003-03-22 Richard Henderson + + * cfgcleanup.c (insns_match_p): Do not do EQUIV substitution + after reload. + 2003-12-31 Roger Sayle PR fortran/12632 diff --git a/gcc/cfgcleanup.c b/gcc/cfgcleanup.c index df914ec0cf27..aa120bd4bec2 100644 --- a/gcc/cfgcleanup.c +++ b/gcc/cfgcleanup.c @@ -974,7 +974,15 @@ insns_match_p (mode, i1, i2) #endif if (reload_completed - ? ! rtx_renumbered_equal_p (p1, p2) : ! rtx_equal_p (p1, p2)) + ? rtx_renumbered_equal_p (p1, p2) : rtx_equal_p (p1, p2)) + return true; + + /* Do not do EQUIV substitution after reload. First, we're undoing the + work of reload_cse. Second, we may be undoing the work of the post- + reload splitting pass. */ + /* ??? Possibly add a new phase switch variable that can be used by + targets to disallow the troublesome insns after splitting. */ + if (!reload_completed) { /* The following code helps take care of G++ cleanups. */ rtx equiv1 = find_reg_equal_equiv_note (i1); @@ -1001,11 +1009,9 @@ insns_match_p (mode, i1, i2) return true; } } - - return false; } - return true; + return false; } /* Look through the insns at the end of BB1 and BB2 and find the longest diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3b58c492f1d9..e34dc4a4ca44 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2004-01-01 Jakub Jelinek + + PR optimization/13521 + * gcc.c-torture/compile/20031231-1.c: New test. + 2003-12-31 Roger Sayle PR fortran/12632 diff --git a/gcc/testsuite/gcc.c-torture/compile/20031231-1.c b/gcc/testsuite/gcc.c-torture/compile/20031231-1.c new file mode 100644 index 000000000000..bbd8e7cb5143 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/20031231-1.c @@ -0,0 +1,51 @@ +extern int f1 (int, void *); +extern int *f2 (void) __attribute__ ((__const__)); +extern int f3 (int, void *); + +int +test (int x, char *y, int z) +{ + int b = 0; + + if (x < 1024) + { + y[0] = '\0'; + + do + { + switch (f1 (x, y + b)) + { + case -1: + if (b == 0) + return -1; + else + return b; + + default: + b++; + } + } + while (y[b - 1] != '\0' && y[b - 1] != '\n' && b < z); + } + else + { + do + { + switch (f3 (x, y + b)) + { + case -1: + if ((*f2 ()) == 4) + continue; + if (b == 0) + return -1; + else + return b; + + default: + b++; + } + } + while (y[b - 1] != '\0' && y[b - 1] != '\n' && b < z); + } + return b; +}