+2007-11-09 Richard Sandiford <rsandifo@nildram.co.uk>
+
+ * dse.c (find_shift_sequence): Always choose an integer mode for
+ new_mode.
+ (replace_read): Require both the read and store mode to be
+ integer ones. Remove a then-redundant FLOAT_P check.
+
2007-11-08 Richard Guenther <rguenther@suse.de>
* tree-dfa.c (remove_referenced_var): If removing a
continue;
new_mode = smallest_mode_for_size (access_size * BITS_PER_UNIT,
- GET_MODE_CLASS (read_mode));
+ MODE_INT);
new_reg = gen_reg_rtx (new_mode);
start_sequence ();
of the arguments and could be precomputed. It may
not be worth doing so. We could precompute if
worthwhile or at least cache the results. The result
- technically depends on SHIFT, ACCESS_SIZE, and
- GET_MODE_CLASS (READ_MODE). But in practice the
- answer will depend only on ACCESS_SIZE. */
+ technically depends on both SHIFT and ACCESS_SIZE,
+ but in practice the answer will depend only on ACCESS_SIZE. */
if (cost > COSTS_N_INSNS (1))
continue;
if (!dbg_cnt (dse))
return false;
- if (GET_MODE_CLASS (read_mode) != GET_MODE_CLASS (store_mode))
+ if (GET_MODE_CLASS (read_mode) != MODE_INT
+ || GET_MODE_CLASS (store_mode) != MODE_INT)
return false;
/* To get here the read is within the boundaries of the write so
call to get rid of the read. */
if (shift)
{
- if (access_size > UNITS_PER_WORD || FLOAT_MODE_P (store_mode))
+ if (access_size > UNITS_PER_WORD)
return false;
shift_seq = find_shift_sequence (read_reg, access_size, store_info,
+/* ??? Further to the subreg comment below, we can't rely on any of the
+ tests passing unless we handle subregs, and the patch to do so has
+ been rejected for the time being. */
+/* { dg-do compile { target { ! *-*-* } } } */
/* { dg-mips-options "-mgp64 -O" } */
#define TEST(ID, TYPE1, TYPE2) \