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