From 039baf9e878ff41bafecf6e56f5e8a6517f2550d Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Thu, 19 Dec 2002 21:47:12 +0100 Subject: [PATCH] re PR rtl-optimization/8988 (gcc3.2 and 3.2.1 with -O2 and -mcpu=i386 generates code that segfaults) PR optimization/8988 * loop.c (maybe_eliminate_biv): Kill REG_EQUAL notes mentioning the biv when eliminating. From-SVN: r60334 --- gcc/ChangeLog | 6 ++++++ gcc/loop.c | 11 ++++++++++- gcc/testsuite/ChangeLog | 4 ++++ .../gcc.c-torture/execute/20021219-1.c | 18 ++++++++++++++++++ 4 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.c-torture/execute/20021219-1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 51f11f5287a..5269ecc82e1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2002-12-19 Eric Botcazou + + PR optimization/8988 + * loop.c (maybe_eliminate_biv): Kill REG_EQUAL notes mentioning + the biv when eliminating. + 2002-12-19 Devang Patel * gcc.c (struct default_compiler): Recognizes input file name with .CPP extension as C++ source files diff --git a/gcc/loop.c b/gcc/loop.c index b3a8d2818d5..b0ce7cd9d43 100644 --- a/gcc/loop.c +++ b/gcc/loop.c @@ -8612,11 +8612,12 @@ maybe_eliminate_biv (loop, bl, eliminate_p, threshold, insn_count) enum rtx_code code = GET_CODE (p); basic_block where_bb = 0; rtx where_insn = threshold >= insn_count ? 0 : p; + rtx note; /* If this is a libcall that sets a giv, skip ahead to its end. */ if (GET_RTX_CLASS (code) == 'i') { - rtx note = find_reg_note (p, REG_LIBCALL, NULL_RTX); + note = find_reg_note (p, REG_LIBCALL, NULL_RTX); if (note) { @@ -8634,6 +8635,8 @@ maybe_eliminate_biv (loop, bl, eliminate_p, threshold, insn_count) } } } + + /* Closely examine the insn if the biv is mentioned. */ if ((code == INSN || code == JUMP_INSN || code == CALL_INSN) && reg_mentioned_p (reg, PATTERN (p)) && ! maybe_eliminate_biv_1 (loop, PATTERN (p), p, bl, @@ -8645,6 +8648,12 @@ maybe_eliminate_biv (loop, bl, eliminate_p, threshold, insn_count) bl->regno, INSN_UID (p)); break; } + + /* If we are eliminating, kill REG_EQUAL notes mentioning the biv. */ + if (eliminate_p + && (note = find_reg_note (p, REG_EQUAL, NULL_RTX)) != NULL_RTX + && reg_mentioned_p (reg, XEXP (note, 0))) + remove_note (p, note); } if (p == loop->end) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index cadf26ac95e..0e978c29b7a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2002-12-19 Eric Botcazou + + * gcc.c-torture/execute/20021219-1.c: New test. + 2002-12-19 Eric Botcazou * gcc.dg/i386-pic-1.c: New test. diff --git a/gcc/testsuite/gcc.c-torture/execute/20021219-1.c b/gcc/testsuite/gcc.c-torture/execute/20021219-1.c new file mode 100644 index 00000000000..2e658a5a885 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/20021219-1.c @@ -0,0 +1,18 @@ +/* PR optimization/8988 */ +/* Contributed by Kevin Easton */ + +void foo(char *p1, char **p2) +{} + +int main(void) +{ + char str[] = "foo { xx }"; + char *ptr = str + 5; + + foo(ptr, &ptr); + + while (*ptr && (*ptr == 13 || *ptr == 32)) + ptr++; + + return 0; +}