re PR middle-end/71310 (Bitfields cause load hit store with smaller store and larger load)
2016-06-14 Richard Biener <rguenther@suse.de> PR middle-end/71310 PR bootstrap/71510 * expr.h (get_bit_range): Declare. * expr.c (get_bit_range): Export. * fold-const.c (optimize_bit_field_compare): Use get_bit_range and word_mode again to constrain the bitfield access. From-SVN: r237426
This commit is contained in:
parent
90b72e84c4
commit
585334d41d
|
@ -1,3 +1,12 @@
|
||||||
|
2016-06-14 Richard Biener <rguenther@suse.de>
|
||||||
|
|
||||||
|
PR middle-end/71310
|
||||||
|
PR bootstrap/71510
|
||||||
|
* expr.h (get_bit_range): Declare.
|
||||||
|
* expr.c (get_bit_range): Export.
|
||||||
|
* fold-const.c (optimize_bit_field_compare): Use get_bit_range and
|
||||||
|
word_mode again to constrain the bitfield access.
|
||||||
|
|
||||||
2016-06-14 Richard Biener <rguenther@suse.de>
|
2016-06-14 Richard Biener <rguenther@suse.de>
|
||||||
|
|
||||||
PR tree-optimization/71521
|
PR tree-optimization/71521
|
||||||
|
|
|
@ -4795,7 +4795,7 @@ optimize_bitfield_assignment_op (unsigned HOST_WIDE_INT bitsize,
|
||||||
If the access does not need to be restricted, 0 is returned in both
|
If the access does not need to be restricted, 0 is returned in both
|
||||||
*BITSTART and *BITEND. */
|
*BITSTART and *BITEND. */
|
||||||
|
|
||||||
static void
|
void
|
||||||
get_bit_range (unsigned HOST_WIDE_INT *bitstart,
|
get_bit_range (unsigned HOST_WIDE_INT *bitstart,
|
||||||
unsigned HOST_WIDE_INT *bitend,
|
unsigned HOST_WIDE_INT *bitend,
|
||||||
tree exp,
|
tree exp,
|
||||||
|
|
|
@ -242,6 +242,10 @@ extern rtx push_block (rtx, int, int);
|
||||||
extern bool emit_push_insn (rtx, machine_mode, tree, rtx, unsigned int,
|
extern bool emit_push_insn (rtx, machine_mode, tree, rtx, unsigned int,
|
||||||
int, rtx, int, rtx, rtx, int, rtx, bool);
|
int, rtx, int, rtx, rtx, int, rtx, bool);
|
||||||
|
|
||||||
|
/* Extract the accessible bit-range from a COMPONENT_REF. */
|
||||||
|
extern void get_bit_range (unsigned HOST_WIDE_INT *, unsigned HOST_WIDE_INT *,
|
||||||
|
tree, HOST_WIDE_INT *, tree *);
|
||||||
|
|
||||||
/* Expand an assignment that stores the value of FROM into TO. */
|
/* Expand an assignment that stores the value of FROM into TO. */
|
||||||
extern void expand_assignment (tree, tree, bool);
|
extern void expand_assignment (tree, tree, bool);
|
||||||
|
|
||||||
|
|
|
@ -3902,24 +3902,23 @@ optimize_bit_field_compare (location_t loc, enum tree_code code,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Don't use a larger mode for reading the bit field than we will
|
/* Honor the C++ memory model and mimic what RTL expansion does. */
|
||||||
use in other places accessing the bit field. */
|
unsigned HOST_WIDE_INT bitstart = 0;
|
||||||
machine_mode largest_mode = word_mode;
|
unsigned HOST_WIDE_INT bitend = 0;
|
||||||
if (TREE_CODE (lhs) == COMPONENT_REF)
|
if (TREE_CODE (lhs) == COMPONENT_REF)
|
||||||
{
|
{
|
||||||
tree field = TREE_OPERAND (lhs, 1);
|
get_bit_range (&bitstart, &bitend, lhs, &lbitpos, &offset);
|
||||||
tree repr = DECL_BIT_FIELD_REPRESENTATIVE (field);
|
if (offset != NULL_TREE)
|
||||||
if (repr)
|
return 0;
|
||||||
largest_mode = DECL_MODE (repr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* See if we can find a mode to refer to this field. We should be able to,
|
/* See if we can find a mode to refer to this field. We should be able to,
|
||||||
but fail if we can't. */
|
but fail if we can't. */
|
||||||
nmode = get_best_mode (lbitsize, lbitpos, 0, 0,
|
nmode = get_best_mode (lbitsize, lbitpos, bitstart, bitend,
|
||||||
const_p ? TYPE_ALIGN (TREE_TYPE (linner))
|
const_p ? TYPE_ALIGN (TREE_TYPE (linner))
|
||||||
: MIN (TYPE_ALIGN (TREE_TYPE (linner)),
|
: MIN (TYPE_ALIGN (TREE_TYPE (linner)),
|
||||||
TYPE_ALIGN (TREE_TYPE (rinner))),
|
TYPE_ALIGN (TREE_TYPE (rinner))),
|
||||||
largest_mode, false);
|
word_mode, false);
|
||||||
if (nmode == VOIDmode)
|
if (nmode == VOIDmode)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue