This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[4.4 resubmission] Extending simplify-rtx handling of SUBREG_PROMOTED_VAR_P


I posted this patch during stage 4.3 as an FYI:

    http://gcc.gnu.org/ml/gcc-patches/2007-10/msg01667.html

Paolo, you seemed in favour of the patch here, except that I'd used
the wrong gen_lowpart function:

    http://gcc.gnu.org/ml/gcc-patches/2007-10/msg01799.html

Here's the corrected version.  Bootstrapped & regression-tested on
x86_64-linux-gnu.  Regression-tested on mips64-linux-gnu.  OK for trunk?

Richard


gcc/
	* simplify-rtx.c (simplify_unary_operation_1): Extend the handling
	of SUBREG_PROMOTED_VAR_P to cope with cases where the extended value
	is smaller than the original promoted value.
	(simplify_subreg): If OP is a SUBREG, try to preserve its
	SUBREG_PROMOTED_VAR_P information.

Index: gcc/simplify-rtx.c
===================================================================
--- gcc/simplify-rtx.c	2008-02-24 12:22:32.000000000 +0000
+++ gcc/simplify-rtx.c	2008-02-24 12:22:54.000000000 +0000
@@ -859,8 +859,8 @@ simplify_unary_operation_1 (enum rtx_cod
       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);
+	  && GET_MODE_SIZE (mode) <= GET_MODE_SIZE (GET_MODE (XEXP (op, 0))))
+	return rtl_hooks.gen_lowpart_no_emit (mode, op);
 
 #if defined(POINTERS_EXTEND_UNSIGNED) && !defined(HAVE_ptr_extend)
       if (! POINTERS_EXTEND_UNSIGNED
@@ -881,8 +881,8 @@ simplify_unary_operation_1 (enum rtx_cod
       if (GET_CODE (op) == SUBREG
 	  && SUBREG_PROMOTED_VAR_P (op)
 	  && SUBREG_PROMOTED_UNSIGNED_P (op) > 0
-	  && GET_MODE (XEXP (op, 0)) == mode)
-	return XEXP (op, 0);
+	  && GET_MODE_SIZE (mode) <= GET_MODE_SIZE (GET_MODE (XEXP (op, 0))))
+	return rtl_hooks.gen_lowpart_no_emit (mode, op);
 
 #if defined(POINTERS_EXTEND_UNSIGNED) && !defined(HAVE_ptr_extend)
       if (POINTERS_EXTEND_UNSIGNED > 0
@@ -5021,7 +5021,21 @@ simplify_subreg (enum machine_mode outer
 	return newx;
       if (validate_subreg (outermode, innermostmode,
 			   SUBREG_REG (op), final_offset))
-        return gen_rtx_SUBREG (outermode, SUBREG_REG (op), final_offset);
+	{
+	  newx = gen_rtx_SUBREG (outermode, SUBREG_REG (op), final_offset);
+	  if (SUBREG_PROMOTED_VAR_P (op)
+	      && SUBREG_PROMOTED_UNSIGNED_P (op) >= 0
+	      && IN_RANGE (GET_MODE_SIZE (outermode),
+			   GET_MODE_SIZE (innermode),
+			   GET_MODE_SIZE (innermostmode))
+	      && subreg_lowpart_p (newx))
+	    {
+	      SUBREG_PROMOTED_VAR_P (newx) = 1;
+	      SUBREG_PROMOTED_UNSIGNED_SET
+		(newx, SUBREG_PROMOTED_UNSIGNED_P (op));
+	    }
+	  return newx;
+	}
       return NULL_RTX;
     }
 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]