Commit 1a8c4ca6 by Eric Botcazou Committed by Eric Botcazou

re PR rtl-optimization/11210 (optimizer drops conditional with typecast from…

re PR rtl-optimization/11210 (optimizer drops conditional with typecast from signed to unsigned char)

	PR optimization/11210
	* expr.c (handled_component_p) [NOP_EXPR]: Add ??? note
	about the behaviour with regard to bitfields.
	* fold-const (decode_field_reference): Record outermost type in
	case the expression is a NOP. Strip all NOPs. Set the signedness
	to that of the outermost type (if any) when the bitsize is equal
	to the size of the type.

From-SVN: r68823
parent 23cdfcf7
2003-07-02 Eric Botcazou <ebotcazou@libertysurf.fr>
PR optimization/11210
* expr.c (handled_component_p) [NOP_EXPR]: Add ??? note
about the behaviour with regard to bitfields.
* fold-const (decode_field_reference): Record outermost type in
case the expression is a NOP. Strip all NOPs. Set the signedness
to that of the outermost type (if any) when the bitsize is equal
to the size of the type.
2003-07-02 Richard Sandiford <rsandifo@redhat.com>
* config/mips/mips.md (addsi3): Remove workaround for adds of -32768.
......
......@@ -5903,6 +5903,9 @@ handled_component_p (tree t)
case VIEW_CONVERT_EXPR:
return 1;
/* ??? Sure they are handled, but get_inner_reference may return
a different PBITSIZE, depending upon whether the expression is
wrapped up in a NOP_EXPR or not, e.g. for bitfields. */
case NOP_EXPR:
case CONVERT_EXPR:
return (TYPE_MODE (TREE_TYPE (t))
......
......@@ -2625,6 +2625,7 @@ decode_field_reference (tree exp, HOST_WIDE_INT *pbitsize, HOST_WIDE_INT *pbitpo
enum machine_mode *pmode, int *punsignedp, int *pvolatilep,
tree *pmask, tree *pand_mask)
{
tree outer_type = 0;
tree and_mask = 0;
tree mask, inner, offset;
tree unsigned_type;
......@@ -2636,6 +2637,13 @@ decode_field_reference (tree exp, HOST_WIDE_INT *pbitsize, HOST_WIDE_INT *pbitpo
if (! INTEGRAL_TYPE_P (TREE_TYPE (exp)))
return 0;
/* We are interested in the bare arrangement of bits, so strip everything
that doesn't affect the machine mode. However, record the type of the
outermost expression if it may matter below. */
if (TREE_CODE (exp) == NOP_EXPR
|| TREE_CODE (exp) == CONVERT_EXPR
|| TREE_CODE (exp) == NON_LVALUE_EXPR)
outer_type = TREE_TYPE (exp);
STRIP_NOPS (exp);
if (TREE_CODE (exp) == BIT_AND_EXPR)
......@@ -2654,6 +2662,12 @@ decode_field_reference (tree exp, HOST_WIDE_INT *pbitsize, HOST_WIDE_INT *pbitpo
|| TREE_CODE (inner) == PLACEHOLDER_EXPR)
return 0;
/* If the number of bits in the reference is the same as the bitsize of
the outer type, then the outer type gives the signedness. Otherwise
(in case of a small bitfield) the signedness is unchanged. */
if (outer_type && *pbitsize == tree_low_cst (TYPE_SIZE (outer_type), 1))
*punsignedp = TREE_UNSIGNED (outer_type);
/* Compute the mask to access the bitfield. */
unsigned_type = (*lang_hooks.types.type_for_size) (*pbitsize, 1);
precision = TYPE_PRECISION (unsigned_type);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment