dojump.c (do_jump): If the expression being compared against zero...
authorRoger Sayle <roger@eyesopen.com>
Fri, 5 Dec 2003 14:06:46 +0000 (14:06 +0000)
committerRoger Sayle <sayle@gcc.gnu.org>
Fri, 5 Dec 2003 14:06:46 +0000 (14:06 +0000)
* dojump.c (do_jump): If the expression being compared against
zero, is the subreg of a promoted variable, perform the comparison
in the promoted mode.
* simplify-rtx.c (simplify_unary_operation): Optimize sign and
zero-extensions of subregs of promoted variables where the
extension is identical to that used to promote the variable.

From-SVN: r74332

gcc/ChangeLog
gcc/dojump.c
gcc/simplify-rtx.c

index 4f79d5e..66ba579 100644 (file)
@@ -1,3 +1,12 @@
+2003-12-05  Roger Sayle  <roger@eyesopen.com>
+
+       * dojump.c (do_jump): If the expression being compared against
+       zero, is the subreg of a promoted variable, perform the comparison
+       in the promoted mode.
+       * simplify-rtx.c (simplify_unary_operation): Optimize sign and
+       zero-extensions of subregs of promoted variables where the
+       extension is identical to that used to promote the variable.
+
 2003-12-05  Hans-Peter Nilsson  <hp@axis.com>
 
        PR target/13256
index 2ed014b..8887c49 100644 (file)
@@ -584,7 +584,14 @@ do_jump (tree exp, rtx if_false_label, rtx if_true_label)
        {
          /* The RTL optimizers prefer comparisons against pseudos.  */
          if (GET_CODE (temp) == SUBREG)
-           temp = copy_to_reg (temp);
+           {
+             /* Compare promoted variables in their promoted mode.  */
+             if (SUBREG_PROMOTED_VAR_P (temp)
+                 && GET_CODE (XEXP (temp, 0)) == REG)
+               temp = XEXP (temp, 0);
+             else
+               temp = copy_to_reg (temp);
+           }
          do_compare_rtx_and_jump (temp, CONST0_RTX (GET_MODE (temp)),
                                   NE, TREE_UNSIGNED (TREE_TYPE (exp)),
                                   GET_MODE (temp), NULL_RTX,
index bf44b55..ffa87cd 100644 (file)
@@ -1031,6 +1031,15 @@ simplify_unary_operation (enum rtx_code code, enum machine_mode mode,
              && GET_CODE (XEXP (XEXP (op, 0), 1)) == LABEL_REF)
            return XEXP (op, 0);
 
+         /* Check for a sign extension of a subreg of a promoted
+            variable, where the promotion is sign-extended, and the
+            target mode is the same as the variable's promotion.  */
+         if (GET_CODE (op) == SUBREG
+             && SUBREG_PROMOTED_VAR_P (op)
+             && ! SUBREG_PROMOTED_UNSIGNED_P (op)
+             && GET_MODE (XEXP (op, 0)) == mode)
+           return XEXP (op, 0);
+
 #if defined(POINTERS_EXTEND_UNSIGNED) && !defined(HAVE_ptr_extend)
          if (! POINTERS_EXTEND_UNSIGNED
              && mode == Pmode && GET_MODE (op) == ptr_mode
@@ -1043,8 +1052,17 @@ simplify_unary_operation (enum rtx_code code, enum machine_mode mode,
 #endif
          break;
 
-#if defined(POINTERS_EXTEND_UNSIGNED) && !defined(HAVE_ptr_extend)
        case ZERO_EXTEND:
+         /* Check for a zero extension of a subreg of a promoted
+            variable, where the promotion is zero-extended, and the
+            target mode is the same as the variable's promotion.  */
+         if (GET_CODE (op) == SUBREG
+             && SUBREG_PROMOTED_VAR_P (op)
+             && SUBREG_PROMOTED_UNSIGNED_P (op)
+             && GET_MODE (XEXP (op, 0)) == mode)
+           return XEXP (op, 0);
+
+#if defined(POINTERS_EXTEND_UNSIGNED) && !defined(HAVE_ptr_extend)
          if (POINTERS_EXTEND_UNSIGNED > 0
              && mode == Pmode && GET_MODE (op) == ptr_mode
              && (CONSTANT_P (op)
@@ -1053,8 +1071,8 @@ simplify_unary_operation (enum rtx_code code, enum machine_mode mode,
                      && REG_POINTER (SUBREG_REG (op))
                      && GET_MODE (SUBREG_REG (op)) == Pmode)))
            return convert_memory_address (Pmode, op);
-         break;
 #endif
+         break;
 
        default:
          break;