]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
(cse_insn): Ignore paradoxical SUBREGs unless we are looking for such.
authorRichard Kenner <kenner@gcc.gnu.org>
Sat, 2 Aug 1997 17:48:13 +0000 (13:48 -0400)
committerRichard Kenner <kenner@gcc.gnu.org>
Sat, 2 Aug 1997 17:48:13 +0000 (13:48 -0400)
From-SVN: r14625

gcc/cse.c

index 971e5c80c7900959c8a76079eba94c1c72c0867a..1331fc83dbd7dda69e9ca6666dfe2488bf97cda0 100644 (file)
--- a/gcc/cse.c
+++ b/gcc/cse.c
@@ -6773,6 +6773,18 @@ cse_insn (insn, in_libcall_block)
          if (code != REG && ! exp_equiv_p (p->exp, p->exp, 1, 0))
            continue;
 
+         /* Also skip paradoxical subregs, unless that's what we're
+            looking for.  */
+         if (code == SUBREG
+             && (GET_MODE_SIZE (GET_MODE (p->exp))
+                 > GET_MODE_SIZE (GET_MODE (SUBREG_REG (p->exp))))
+             && ! (src != 0
+                   && GET_CODE (src) == SUBREG
+                   && GET_MODE (src) == GET_MODE (p->exp)
+                   && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (src)))
+                       < GET_MODE_SIZE (GET_MODE (SUBREG_REG (p->exp))))))
+           continue;
+
           if (src && GET_CODE (src) == code && rtx_equal_p (src, p->exp))
            src = 0;
           else if (src_folded && GET_CODE (src_folded) == code
@@ -6846,6 +6858,25 @@ cse_insn (insn, in_libcall_block)
           while (elt && GET_CODE (elt->exp) != REG
                 && ! exp_equiv_p (elt->exp, elt->exp, 1, 0))
            elt = elt->next_same_value;      
+
+         /* A paradoxical subreg would be bad here: it'll be the right
+            size, but later may be adjusted so that the upper bits aren't
+            what we want.  So reject it.  */
+         if (elt != 0
+             && GET_CODE (elt->exp) == SUBREG
+             && (GET_MODE_SIZE (GET_MODE (elt->exp))
+                 > GET_MODE_SIZE (GET_MODE (SUBREG_REG (elt->exp))))
+             /* It is okay, though, if the rtx we're trying to match
+                will ignore any of the bits we can't predict.  */
+             && ! (src != 0
+                   && GET_CODE (src) == SUBREG
+                   && GET_MODE (src) == GET_MODE (elt->exp)
+                   && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (src)))
+                       < GET_MODE_SIZE (GET_MODE (SUBREG_REG (elt->exp))))))
+           {
+             elt = elt->next_same_value;
+             continue;
+           }
              
           if (elt) src_elt_cost = elt->cost;