From: Richard Sandiford Date: Sun, 16 Dec 2007 09:54:34 +0000 (+0000) Subject: re PR rtl-optimization/34415 (Possible miscompilation on MIPS) X-Git-Tag: releases/gcc-4.3.0~946 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=30c6f45db68721a709f3cb135b821d10f38970fc;p=thirdparty%2Fgcc.git re PR rtl-optimization/34415 (Possible miscompilation on MIPS) gcc/ PR rtl-optimization/34415 * df.h (DF_LR_IN, DF_LR_OUT): Update comments. * resource.c (mark_target_live_regs): Use DF_LR_IN rather than df_get_live_in. Don't handle pseudos. gcc/testsuite/ PR rtl-optimization/34415 * gcc.c-torture/execute/pr34415.c: New test. From-SVN: r130987 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 054ef8f2caf4..4dac20691b7e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2007-12-16 Richard Sandiford + + PR rtl-optimization/34415 + * df.h (DF_LR_IN, DF_LR_OUT): Update comments. + * resource.c (mark_target_live_regs): Use DF_LR_IN rather than + df_get_live_in. Don't handle pseudos. + 2007-12-16 Jakub Jelinek PR bootstrap/34003 diff --git a/gcc/df.h b/gcc/df.h index ba5f9b9e9b02..04bac49bf0a1 100644 --- a/gcc/df.h +++ b/gcc/df.h @@ -559,9 +559,9 @@ struct df #define DF_LIVE_IN(BB) (DF_LIVE_BB_INFO(BB)->in) #define DF_LIVE_OUT(BB) (DF_LIVE_BB_INFO(BB)->out) -/* These macros are currently used by only reg-stack since it is not - tolerant of uninitialized variables. This intolerance should be - fixed because it causes other problems. */ +/* These macros are used by passes that are not tolerant of + uninitialized variables. This intolerance should eventually + be fixed. */ #define DF_LR_IN(BB) (DF_LR_BB_INFO(BB)->in) #define DF_LR_OUT(BB) (DF_LR_BB_INFO(BB)->out) diff --git a/gcc/resource.c b/gcc/resource.c index 7cb4d2ae490c..2ffde4f8e6fe 100644 --- a/gcc/resource.c +++ b/gcc/resource.c @@ -958,9 +958,8 @@ mark_target_live_regs (rtx insns, rtx target, struct resources *res) TARGET. Otherwise, we must assume everything is live. */ if (b != -1) { - regset regs_live = df_get_live_in (BASIC_BLOCK (b)); + regset regs_live = DF_LR_IN (BASIC_BLOCK (b)); rtx start_insn, stop_insn; - reg_set_iterator rsi; /* Compute hard regs live at start of block -- this is the real hard regs marked live, plus live pseudo regs that have been renumbered to @@ -968,13 +967,6 @@ mark_target_live_regs (rtx insns, rtx target, struct resources *res) REG_SET_TO_HARD_REG_SET (current_live_regs, regs_live); - EXECUTE_IF_SET_IN_REG_SET (regs_live, FIRST_PSEUDO_REGISTER, i, rsi) - { - if (reg_renumber[i] >= 0) - add_to_hard_reg_set (¤t_live_regs, PSEUDO_REGNO_MODE (i), - reg_renumber[i]); - } - /* Get starting and ending insn, handling the case where each might be a SEQUENCE. */ start_insn = (b == ENTRY_BLOCK_PTR->next_bb->index ? diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3014120c2d18..06a2195d963b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-12-16 Richard Sandiford + + PR rtl-optimization/34415 + * gcc.c-torture/execute/pr34415.c: New test. + 2007-12-16 Danny Smith * gcc.target/i386/fastcall-1.c: (f4): Change return type to diff --git a/gcc/testsuite/gcc.c-torture/execute/pr34415.c b/gcc/testsuite/gcc.c-torture/execute/pr34415.c new file mode 100644 index 000000000000..ec75394afe0f --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr34415.c @@ -0,0 +1,34 @@ +const char *__attribute__((noinline)) +foo (const char *p) +{ + const char *end; + int len = 1; + for (;;) + { + int c = *p; + c = (c >= 'a' && c <= 'z' ? c - 'a' + 'A' : c); + if (c == 'B') + end = p; + else if (c == 'A') + { + end = p; + do + p++; + while (*p == '+'); + } + else + break; + p++; + len++; + } + if (len > 2 && *p == ':') + p = end; + return p; +} + +int +main (void) +{ + const char *input = "Bbb:"; + return foo (input) != input + 2; +}