mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-01-11 21:05:36 +08:00
expr.c (store_field): Don't clobber TEMP in shift: it might be a variable.
* expr.c (store_field): Don't clobber TEMP in shift: it might be a variable. (get_inner_reference): Don't go through a VIEW_CONVERT_EXPR whose purpose is to step up the alignment. (expand_expr, case ADDR_EXPR): Force LO_SUM into memory, just like REG. From-SVN: r66465
This commit is contained in:
parent
41dd7402ad
commit
c1853da7d3
@ -1,5 +1,11 @@
|
||||
2003-05-04 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
|
||||
|
||||
* expr.c (store_field): Don't clobber TEMP in shift: it might be
|
||||
a variable.
|
||||
(get_inner_reference): Don't go through a VIEW_CONVERT_EXPR
|
||||
whose purpose is to step up the alignment.
|
||||
(expand_expr, case ADDR_EXPR): Force LO_SUM into memory, just like REG.
|
||||
|
||||
* stor-layout.c (compute_record_mode): Relax restriction
|
||||
on fields crossing word boundaries forcing BLKmode.
|
||||
|
||||
|
18
gcc/expr.c
18
gcc/expr.c
@ -5648,7 +5648,7 @@ store_field (target, bitsize, bitpos, mode, exp, value_mode, unsignedp, type,
|
||||
temp = expand_shift (RSHIFT_EXPR, GET_MODE (temp), temp,
|
||||
size_int (GET_MODE_BITSIZE (GET_MODE (temp))
|
||||
- bitsize),
|
||||
temp, 1);
|
||||
NULL_RTX, 1);
|
||||
|
||||
/* Unless MODE is VOIDmode or BLKmode, convert TEMP to
|
||||
MODE. */
|
||||
@ -5888,8 +5888,20 @@ get_inner_reference (exp, pbitsize, pbitpos, poffset, pmode,
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
/* We can go inside most conversions: all NON_VALUE_EXPRs, all normal
|
||||
conversions that don't change the mode, and all view conversions
|
||||
except those that need to "step up" the alignment. */
|
||||
else if (TREE_CODE (exp) != NON_LVALUE_EXPR
|
||||
&& TREE_CODE (exp) != VIEW_CONVERT_EXPR
|
||||
&& ! (TREE_CODE (exp) == VIEW_CONVERT_EXPR
|
||||
&& ! ((TYPE_ALIGN (TREE_TYPE (exp))
|
||||
> TYPE_ALIGN (TREE_TYPE (TREE_OPERAND (exp, 0))))
|
||||
&& STRICT_ALIGNMENT
|
||||
&& (TYPE_ALIGN (TREE_TYPE (TREE_OPERAND (exp, 0)))
|
||||
< BIGGEST_ALIGNMENT)
|
||||
&& (TYPE_ALIGN_OK (TREE_TYPE (exp))
|
||||
|| TYPE_ALIGN_OK (TREE_TYPE
|
||||
(TREE_OPERAND (exp, 0))))))
|
||||
&& ! ((TREE_CODE (exp) == NOP_EXPR
|
||||
|| TREE_CODE (exp) == CONVERT_EXPR)
|
||||
&& (TYPE_MODE (TREE_TYPE (exp))
|
||||
@ -9245,7 +9257,7 @@ expand_expr (exp, target, tmode, modifier)
|
||||
op0);
|
||||
else if (GET_CODE (op0) == REG || GET_CODE (op0) == SUBREG
|
||||
|| GET_CODE (op0) == CONCAT || GET_CODE (op0) == ADDRESSOF
|
||||
|| GET_CODE (op0) == PARALLEL)
|
||||
|| GET_CODE (op0) == PARALLEL || GET_CODE (op0) == LO_SUM)
|
||||
{
|
||||
/* If the operand is a SAVE_EXPR, we can deal with this by
|
||||
forcing the SAVE_EXPR into memory. */
|
||||
|
Loading…
Reference in New Issue
Block a user