]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR rtl-optimization/17810 (internal compiler error: in verify_local_live_at_start...
authorRichard Earnshaw <rearnsha@gcc.gnu.org>
Thu, 1 Sep 2005 13:09:04 +0000 (13:09 +0000)
committerRichard Earnshaw <rearnsha@gcc.gnu.org>
Thu, 1 Sep 2005 13:09:04 +0000 (13:09 +0000)
PR rtl-optimization/17810
Backport
2004-11-04  Richard Sandiford  <rsandifo@redhat.com>
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

gcc/ChangeLog
gcc/regrename.c

index a46e80e1a07a0dcbf77c66714820d76a00041c8f..452860d77d28b88203bf9637e22dd5b56f03f951 100644 (file)
@@ -1,3 +1,12 @@
+2005-09-01  Richard Earnshaw  <richard.earnshaw@arm.com>
+
+       PR rtl-optimization/17810
+       Backport
+       2004-11-04  Richard Sandiford  <rsandifo@redhat.com>
+       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  <edelsohn@gnu.org>
 
         PR target/23539
@@ -9,8 +18,8 @@
 
 2005-08-21  Jakub Jelinek  <jakub@redhat.com>
 
-       * simplify-rtx.c (simplify_immed_subreg) <case CONST_DOUBLE>: Only clear
-       up to elem_bitsize bits, not max_bitsize.
+       * simplify-rtx.c (simplify_immed_subreg) <case CONST_DOUBLE>: Only
+       clear up to elem_bitsize bits, not max_bitsize.
 
 2005-07-20  Steve Ellcey  <sje@cup.hp.com>
 
index 8c326c030ecda3ec1d4f924ea230438e56673a84..bf3940a73f8fa34089b0f56741c435179134669c 100644 (file)
 #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;
       }