A pair of simplify-rtx tweaks

Zack Weinberg zack@wolery.cumb.org
Mon Jul 17 09:43:00 GMT 2000


1. Fix a bug in simplify_ternary_operation which caused bitfield
extraction operations to never be simplified.

2. Teach simplify_binary_operation about
   (compare (gt[u] (cc) 0) (lt[u] (cc) 0)), which is equivalent to just
   (cc).

Bootstrapped i386-linux.  No regressions.  This patch doesn't do much
by itself, it is preparation for combine work.

zw

	* simplify-rtx.c (simplify_binary_operation): Recognize
	   (compare (gt[u] (cc) 0) (lt[u] (cc) 0)).
	(simplify_ternary_operation):  Do not examine MODE_BITSIZE of
	   a CONST_INT, it will always be zero.

===================================================================
Index: simplify-rtx.c
--- simplify-rtx.c	2000/05/24 20:26:54	1.19
+++ simplify-rtx.c	2000/07/17 16:37:34
@@ -948,11 +948,29 @@ simplify_binary_operation (code, mode, o
 	       || ! FLOAT_MODE_P (mode) || flag_fast_math)
 	      && op1 == CONST0_RTX (mode))
 	    return op0;
+#endif
+
+	  /* Convert (compare (gt (flags) 0) (lt (flags) 0)) to (flags).  */
+	  if (((GET_CODE (op0) == GT && GET_CODE (op1) == LT)
+	       || (GET_CODE (op0) == GTU && GET_CODE (op1) == LTU))
+	      && XEXP (op0, 1) == const0_rtx && XEXP (op1, 1) == const0_rtx)
+	    {
+	      rtx xop00 = XEXP (op0, 0);
+	      rtx xop10 = XEXP (op1, 0);
+
+#ifdef HAVE_cc0
+	      if (GET_CODE (xop00) == CC0 && GET_CODE (xop10) == CC0)
 #else
-	  /* Do nothing here.  */
+	      if (GET_CODE (xop00) == REG && GET_CODE (xop10) == REG
+		  && GET_MODE (xop00) == GET_MODE (xop10)
+		  && REGNO (xop00) == REGNO (xop10)
+		  && GET_MODE_CLASS (GET_MODE (xop00)) == MODE_CC
+		  && GET_MODE_CLASS (GET_MODE (xop10)) == MODE_CC)
 #endif
-	  break;
-	      
+		return xop00;
+	    }
+
+	  break;	      
 	case MINUS:
 	  /* None of these optimizations can be done for IEEE
 	     floating point.  */
@@ -1912,8 +1930,7 @@ simplify_ternary_operation (code, mode, 
       if (GET_CODE (op0) == CONST_INT
 	  && GET_CODE (op1) == CONST_INT
 	  && GET_CODE (op2) == CONST_INT
-	  && ((unsigned) INTVAL (op1) + (unsigned) INTVAL (op2)
-	      <= GET_MODE_BITSIZE (op0_mode))
+	  && ((unsigned) INTVAL (op1) + (unsigned) INTVAL (op2) <= width)
 	  && width <= (unsigned) HOST_BITS_PER_WIDE_INT)
 	{
 	  /* Extracting a bit-field from a constant */


More information about the Gcc-patches mailing list