(maybe_eliminate_biv_1): Disable all but two cases of biv elimination with givs...
authorRichard Kenner <kenner@gcc.gnu.org>
Fri, 10 May 1996 23:01:08 +0000 (19:01 -0400)
committerRichard Kenner <kenner@gcc.gnu.org>
Fri, 10 May 1996 23:01:08 +0000 (19:01 -0400)
(maybe_eliminate_biv_1): Disable all but two cases of biv elimination
with givs and restrict those two cases to an ADD_VAL that is an
address.

From-SVN: r11968

gcc/loop.c

index efde04034b8715ce500132ff661c017870726aba..0ee43c9e509d6c056ccfab795a04dc49ab9d6ed2 100644 (file)
@@ -6178,13 +6178,16 @@ maybe_eliminate_biv_1 (x, insn, bl, eliminate_p, where)
        {
          /* Can replace with any giv that was reduced and
             that has (MULT_VAL != 0) and (ADD_VAL == 0).
-            Require a constant for MULT_VAL, so we know it's nonzero.  */
+            Require a constant for MULT_VAL, so we know it's nonzero.
+            ??? We disable this optimization to avoid potential
+            overflows.  */
 
          for (v = bl->giv; v; v = v->next_iv)
            if (CONSTANT_P (v->mult_val) && v->mult_val != const0_rtx
                && v->add_val == const0_rtx
                && ! v->ignore && ! v->maybe_dead && v->always_computable
-               && v->mode == mode)
+               && v->mode == mode
+               && 0)
              {
                /* If the giv V had the auto-inc address optimization applied
                   to it, and INSN occurs between the giv insn and the biv
@@ -6215,12 +6218,19 @@ maybe_eliminate_biv_1 (x, insn, bl, eliminate_p, where)
 
          /* Look for a giv with (MULT_VAL != 0) and (ADD_VAL != 0);
             replace test insn with a compare insn (cmp REDUCED_GIV ADD_VAL).
-            Require a constant for MULT_VAL, so we know it's nonzero.  */
+            Require a constant for MULT_VAL, so we know it's nonzero.
+            ??? Do this only if ADD_VAL is a pointer to avoid a potential
+            overflow problem.  */
 
          for (v = bl->giv; v; v = v->next_iv)
            if (CONSTANT_P (v->mult_val) && v->mult_val != const0_rtx
                && ! v->ignore && ! v->maybe_dead && v->always_computable
-               && v->mode == mode)
+               && v->mode == mode
+               && (GET_CODE (v->add_val) == SYMBOL_REF
+                   || GET_CODE (v->add_val) == LABEL_REF
+                   || GET_CODE (v->add_val) == CONST
+                   || (GET_CODE (v->add_val) == REG
+                       && REGNO_POINTER_FLAG (REGNO (v->add_val)))))
              {
                /* If the giv V had the auto-inc address optimization applied
                   to it, and INSN occurs between the giv insn and the biv
@@ -6286,7 +6296,11 @@ maybe_eliminate_biv_1 (x, insn, bl, eliminate_p, where)
 
          for (v = bl->giv; v; v = v->next_iv)
            if (CONSTANT_P (v->mult_val) && INTVAL (v->mult_val) > 0
-               && CONSTANT_P (v->add_val)
+               && (GET_CODE (v->add_val) == SYMBOL_REF
+                   || GET_CODE (v->add_val) == LABEL_REF
+                   || GET_CODE (v->add_val) == CONST
+                   || (GET_CODE (v->add_val) == REG
+                       && REGNO_POINTER_FLAG (REGNO (v->add_val))))
                && ! v->ignore && ! v->maybe_dead && v->always_computable
                && v->mode == mode)
              {
@@ -6330,12 +6344,14 @@ maybe_eliminate_biv_1 (x, insn, bl, eliminate_p, where)
              }
          
          /* Look for giv with positive constant mult_val and nonconst add_val.
-            Insert insns to calculate new compare value.  */
+            Insert insns to calculate new compare value.  
+            ??? Turn this off due to possible overflow.  */
 
          for (v = bl->giv; v; v = v->next_iv)
            if (CONSTANT_P (v->mult_val) && INTVAL (v->mult_val) > 0
                && ! v->ignore && ! v->maybe_dead && v->always_computable
-               && v->mode == mode)
+               && v->mode == mode
+               && 0)
              {
                rtx tem;
 
@@ -6372,12 +6388,14 @@ maybe_eliminate_biv_1 (x, insn, bl, eliminate_p, where)
          if (invariant_p (arg) == 1)
            {
              /* Look for giv with constant positive mult_val and nonconst
-                add_val. Insert insns to compute new compare value.  */
+                add_val. Insert insns to compute new compare value. 
+                ??? Turn this off due to possible overflow.  */
 
              for (v = bl->giv; v; v = v->next_iv)
                if (CONSTANT_P (v->mult_val) && INTVAL (v->mult_val) > 0
                    && ! v->ignore && ! v->maybe_dead && v->always_computable
-                   && v->mode == mode)
+                   && v->mode == mode
+                   && 0)
                  {
                    rtx tem;