fwprop.c (forward_propagate_and_simplify): After checking reg/subreg combinations...
authorRichard Sandiford <rdsandiford@googlemail.com>
Tue, 27 Sep 2011 17:24:03 +0000 (17:24 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Tue, 27 Sep 2011 17:24:03 +0000 (17:24 +0000)
gcc/
* fwprop.c (forward_propagate_and_simplify): After checking
reg/subreg combinations, check whether the modes are the same.

From-SVN: r179287

gcc/ChangeLog
gcc/fwprop.c

index d05ebc63a66f96e6fce6c3197a1ad36190f879ae..ab85f50774dc42928844c6dd16b433ceb17c1bde 100644 (file)
@@ -1,3 +1,8 @@
+2011-09-27  Richard Sandiford  <rdsandiford@googlemail.com>
+
+       * fwprop.c (forward_propagate_and_simplify): After checking
+       reg/subreg combinations, check whether the modes are the same.
+
 2011-09-27  Bernd Schmidt  <bernds@codesourcery.com>
            Richard Sandiford  <rdsandiford@googlemail.com>
 
index 236dda2dea5180886f26086bd6b25bc2421f0f5b..5368d187f4b4941029bea124c1cc58a1b1d175d6 100644 (file)
@@ -1232,21 +1232,24 @@ forward_propagate_and_simplify (df_ref use, rtx def_insn, rtx def_set)
 
   /* If def and use are subreg, check if they match.  */
   reg = DF_REF_REG (use);
-  if (GET_CODE (reg) == SUBREG
-      && GET_CODE (SET_DEST (def_set)) == SUBREG
-      && (SUBREG_BYTE (SET_DEST (def_set)) != SUBREG_BYTE (reg)
-         || GET_MODE (SET_DEST (def_set)) != GET_MODE (reg)))
-    return false;
-
+  if (GET_CODE (reg) == SUBREG && GET_CODE (SET_DEST (def_set)) == SUBREG)
+    {
+      if (SUBREG_BYTE (SET_DEST (def_set)) != SUBREG_BYTE (reg))
+       return false;
+    }
   /* Check if the def had a subreg, but the use has the whole reg.  */
-  if (REG_P (reg) && GET_CODE (SET_DEST (def_set)) == SUBREG)
+  else if (REG_P (reg) && GET_CODE (SET_DEST (def_set)) == SUBREG)
     return false;
-
   /* Check if the use has a subreg, but the def had the whole reg.  Unlike the
      previous case, the optimization is possible and often useful indeed.  */
-  if (GET_CODE (reg) == SUBREG && REG_P (SET_DEST (def_set)))
+  else if (GET_CODE (reg) == SUBREG && REG_P (SET_DEST (def_set)))
     reg = SUBREG_REG (reg);
 
+  /* Make sure that we can treat REG as having the same mode as the
+     source of DEF_SET.  */
+  if (GET_MODE (SET_DEST (def_set)) != GET_MODE (reg))
+    return false;
+
   /* Check if the substitution is valid (last, because it's the most
      expensive check!).  */
   src = SET_SRC (def_set);