From: Richard Earnshaw Date: Thu, 1 Sep 2005 13:09:04 +0000 (+0000) Subject: re PR rtl-optimization/17810 (internal compiler error: in verify_local_live_at_start... X-Git-Tag: releases/gcc-3.4.5~224 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7cd75090f8f2a95a29b79bd47091beaf0cc44c4f;p=thirdparty%2Fgcc.git re PR rtl-optimization/17810 (internal compiler error: in verify_local_live_at_start for arm-rtems, arm-linux) PR rtl-optimization/17810 Backport 2004-11-04 Richard Sandiford PR target/15342 * regrename.c (scan_rtx): Treat the destinations of SETs and CLOBBERs as OP_INOUT if the instruction is predicated. From-SVN: r103726 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a46e80e1a07a..452860d77d28 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2005-09-01 Richard Earnshaw + + PR rtl-optimization/17810 + Backport + 2004-11-04 Richard Sandiford + PR target/15342 + * regrename.c (scan_rtx): Treat the destinations of SETs and CLOBBERs + as OP_INOUT if the instruction is predicated. + 2005-08-31 David Edelsohn PR target/23539 @@ -9,8 +18,8 @@ 2005-08-21 Jakub Jelinek - * simplify-rtx.c (simplify_immed_subreg) : Only clear - up to elem_bitsize bits, not max_bitsize. + * simplify-rtx.c (simplify_immed_subreg) : Only + clear up to elem_bitsize bits, not max_bitsize. 2005-07-20 Steve Ellcey diff --git a/gcc/regrename.c b/gcc/regrename.c index 8c326c030ecd..bf3940a73f8f 100644 --- a/gcc/regrename.c +++ b/gcc/regrename.c @@ -38,10 +38,6 @@ #include "toplev.h" #include "obstack.h" -#ifndef REG_MODE_OK_FOR_BASE_P -#define REG_MODE_OK_FOR_BASE_P(REGNO, MODE) REG_OK_FOR_BASE_P (REGNO) -#endif - static const char *const reg_class_names[] = REG_CLASS_NAMES; struct du_chain @@ -532,6 +528,7 @@ scan_rtx_address (rtx insn, rtx *loc, enum reg_class class, rtx op1 = orig_op1; rtx *locI = NULL; rtx *locB = NULL; + rtx *locB_reg = NULL; if (GET_CODE (op0) == SUBREG) { @@ -568,14 +565,14 @@ scan_rtx_address (rtx insn, rtx *loc, enum reg_class class, int index_op; if (REG_OK_FOR_INDEX_P (op0) - && REG_MODE_OK_FOR_BASE_P (op1, mode)) + && REG_MODE_OK_FOR_REG_BASE_P (op1, mode)) index_op = 0; else if (REG_OK_FOR_INDEX_P (op1) - && REG_MODE_OK_FOR_BASE_P (op0, mode)) + && REG_MODE_OK_FOR_REG_BASE_P (op0, mode)) index_op = 1; - else if (REG_MODE_OK_FOR_BASE_P (op1, mode)) + else if (REG_MODE_OK_FOR_REG_BASE_P (op1, mode)) index_op = 0; - else if (REG_MODE_OK_FOR_BASE_P (op0, mode)) + else if (REG_MODE_OK_FOR_REG_BASE_P (op0, mode)) index_op = 1; else if (REG_OK_FOR_INDEX_P (op1)) index_op = 1; @@ -583,7 +580,7 @@ scan_rtx_address (rtx insn, rtx *loc, enum reg_class class, index_op = 0; locI = &XEXP (x, index_op); - locB = &XEXP (x, !index_op); + locB_reg = &XEXP (x, !index_op); } else if (code0 == REG) { @@ -600,6 +597,9 @@ scan_rtx_address (rtx insn, rtx *loc, enum reg_class class, scan_rtx_address (insn, locI, INDEX_REG_CLASS, action, mode); if (locB) scan_rtx_address (insn, locB, MODE_BASE_REG_CLASS (mode), action, mode); + if (locB_reg) + scan_rtx_address (insn, locB_reg, MODE_BASE_REG_REG_CLASS (mode), + action, mode); return; } @@ -675,7 +675,8 @@ scan_rtx (rtx insn, rtx *loc, enum reg_class class, case SET: scan_rtx (insn, &SET_SRC (x), class, action, OP_IN, 0); - scan_rtx (insn, &SET_DEST (x), class, action, OP_OUT, 0); + scan_rtx (insn, &SET_DEST (x), class, action, + GET_CODE (PATTERN (insn)) == COND_EXEC ? OP_INOUT : OP_OUT, 0); return; case STRICT_LOW_PART: @@ -700,7 +701,8 @@ scan_rtx (rtx insn, rtx *loc, enum reg_class class, abort (); case CLOBBER: - scan_rtx (insn, &SET_DEST (x), class, action, OP_OUT, 1); + scan_rtx (insn, &SET_DEST (x), class, action, + GET_CODE (PATTERN (insn)) == COND_EXEC ? OP_INOUT : OP_OUT, 1); return; case EXPR_LIST: @@ -1408,6 +1410,7 @@ replace_oldest_value_addr (rtx *loc, enum reg_class class, rtx op1 = orig_op1; rtx *locI = NULL; rtx *locB = NULL; + rtx *locB_reg = NULL; if (GET_CODE (op0) == SUBREG) { @@ -1444,14 +1447,14 @@ replace_oldest_value_addr (rtx *loc, enum reg_class class, int index_op; if (REG_OK_FOR_INDEX_P (op0) - && REG_MODE_OK_FOR_BASE_P (op1, mode)) + && REG_MODE_OK_FOR_REG_BASE_P (op1, mode)) index_op = 0; else if (REG_OK_FOR_INDEX_P (op1) - && REG_MODE_OK_FOR_BASE_P (op0, mode)) + && REG_MODE_OK_FOR_REG_BASE_P (op0, mode)) index_op = 1; - else if (REG_MODE_OK_FOR_BASE_P (op1, mode)) + else if (REG_MODE_OK_FOR_REG_BASE_P (op1, mode)) index_op = 0; - else if (REG_MODE_OK_FOR_BASE_P (op0, mode)) + else if (REG_MODE_OK_FOR_REG_BASE_P (op0, mode)) index_op = 1; else if (REG_OK_FOR_INDEX_P (op1)) index_op = 1; @@ -1459,7 +1462,7 @@ replace_oldest_value_addr (rtx *loc, enum reg_class class, index_op = 0; locI = &XEXP (x, index_op); - locB = &XEXP (x, !index_op); + locB_reg = &XEXP (x, !index_op); } else if (code0 == REG) { @@ -1479,6 +1482,10 @@ replace_oldest_value_addr (rtx *loc, enum reg_class class, changed |= replace_oldest_value_addr (locB, MODE_BASE_REG_CLASS (mode), mode, insn, vd); + if (locB_reg) + changed |= replace_oldest_value_addr (locB_reg, + MODE_BASE_REG_REG_CLASS (mode), + mode, insn, vd); return changed; }