fix opt/12941

Richard Henderson rth@twiddle.net
Fri Jan 23 20:35:00 GMT 2004


The PR is against tree-ssa, but this bug is latent everywhere else.
My guess as to why the test case fails here and not elsewhere is
better constant propagation.

Since the fix is of the form "disable an unusual optimization", I
believe this to be correct and safe for all active branches.

Tested on alphaev67-linux.


r~


        PR opt/12941 
        * combine.c (SHIFT_COUNT_TRUNCATED): Provide default value.
        (simplify_comparison): Don't simplify (eq (zero_extract c 1 r) 0)
        if SHIFT_COUNT_TRUNCATED is set.

Index: combine.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/combine.c,v
retrieving revision 1.299.2.32
diff -c -p -d -u -r1.299.2.32 combine.c
--- combine.c	3 Jan 2004 23:01:40 -0000	1.299.2.32
+++ combine.c	23 Jan 2004 20:23:23 -0000
@@ -91,6 +91,10 @@ Software Foundation, 59 Temple Place - S
 #include "toplev.h"
 #include "target.h"
 
+#ifndef SHIFT_COUNT_TRUNCATED
+#define SHIFT_COUNT_TRUNCATED 0
+#endif
+
 /* It is not safe to use ordinary gen_lowpart in combine.
    Use gen_lowpart_for_combine instead.  See comments there.  */
 #define gen_lowpart dont_use_gen_lowpart_you_dummy
@@ -4536,7 +4540,6 @@ combine_simplify_rtx (rtx x, enum machin
 	return simplify_shift_const (x, code, mode, XEXP (x, 0),
 				     INTVAL (XEXP (x, 1)));
 
-#ifdef SHIFT_COUNT_TRUNCATED
       else if (SHIFT_COUNT_TRUNCATED && GET_CODE (XEXP (x, 1)) != REG)
 	SUBST (XEXP (x, 1),
 	       force_to_mode (XEXP (x, 1), GET_MODE (XEXP (x, 1)),
@@ -4544,8 +4547,6 @@ combine_simplify_rtx (rtx x, enum machin
 			       << exact_log2 (GET_MODE_BITSIZE (GET_MODE (x))))
 			      - 1,
 			      NULL_RTX, 0));
-#endif
-
       break;
 
     case VEC_SELECT:
@@ -9111,10 +9112,8 @@ simplify_shift_const (rtx x, enum rtx_co
   /* Make sure and truncate the "natural" shift on the way in.  We don't
      want to do this inside the loop as it makes it more difficult to
      combine shifts.  */
-#ifdef SHIFT_COUNT_TRUNCATED
   if (SHIFT_COUNT_TRUNCATED)
     orig_count &= GET_MODE_BITSIZE (mode) - 1;
-#endif
 
   /* If we were given an invalid count, don't do anything except exactly
      what was requested.  */
@@ -10510,8 +10509,10 @@ simplify_comparison (enum rtx_code code,
 	     a constant that has only a single bit set and are comparing it
 	     with zero, we can convert this into an equality comparison
 	     between the position and the location of the single bit.  */
-
-	  if (GET_CODE (XEXP (op0, 0)) == CONST_INT
+	  /* Except we can't if SHIFT_COUNT_TRUNCATED is set, since we might
+	     have already reduced the shift count modulo the word size.  */
+	  if (!SHIFT_COUNT_TRUNCATED
+	      && GET_CODE (XEXP (op0, 0)) == CONST_INT
 	      && XEXP (op0, 1) == const1_rtx
 	      && equality_comparison_p && const_op == 0
 	      && (i = exact_log2 (INTVAL (XEXP (op0, 0)))) >= 0)



More information about the Gcc-patches mailing list