expr.c (expand_assignment): Rework address calculation for structure field members to expose more invariant...
* expr.c (expand_assignment): Rework address calculation for structure field members to expose more invariant computations to the loop optimizer. (expand_expr): Likewise. From-SVN: r20705
This commit is contained in:
parent
c358412fe8
commit
8975220280
@ -1,3 +1,10 @@
|
||||
1998-06-22 Herman A.J. ten Brugge <Haj.Ten.Brugge@net.HCC.nl>
|
||||
|
||||
* expr.c (expand_assignment): Rework address calculation for structure
|
||||
field members to expose more invariant computations to the loop
|
||||
optimizer.
|
||||
(expand_expr): Likewise.
|
||||
|
||||
Wed Jun 24 22:44:22 1998 Jeffrey A Law (law@cygnus.com)
|
||||
|
||||
* local-alloc.c (block_alloc): Do not try to avoid false dependencies
|
||||
|
41
gcc/expr.c
41
gcc/expr.c
@ -2920,6 +2920,26 @@ expand_assignment (to, from, want_value, suggest_reg)
|
||||
#endif
|
||||
}
|
||||
|
||||
if (GET_CODE (to_rtx) == MEM
|
||||
&& GET_MODE (to_rtx) == BLKmode
|
||||
&& bitsize
|
||||
&& (bitpos % bitsize) == 0
|
||||
&& (bitsize % GET_MODE_ALIGNMENT (mode1)) == 0
|
||||
&& (alignment * BITS_PER_UNIT) == GET_MODE_ALIGNMENT (mode1))
|
||||
{
|
||||
rtx temp = change_address (to_rtx, mode1,
|
||||
plus_constant (XEXP (to_rtx, 0),
|
||||
(bitpos /
|
||||
BITS_PER_UNIT)));
|
||||
if (GET_CODE (XEXP (temp, 0)) == REG)
|
||||
to_rtx = temp;
|
||||
else
|
||||
to_rtx = change_address (to_rtx, mode1,
|
||||
force_reg (GET_MODE (XEXP (temp, 0)),
|
||||
XEXP (temp, 0)));
|
||||
bitpos = 0;
|
||||
}
|
||||
|
||||
to_rtx = change_address (to_rtx, VOIDmode,
|
||||
gen_rtx_PLUS (ptr_mode, XEXP (to_rtx, 0),
|
||||
force_reg (ptr_mode, offset_rtx)));
|
||||
@ -5918,6 +5938,27 @@ expand_expr (exp, target, tmode, modifier)
|
||||
#endif
|
||||
}
|
||||
|
||||
if (GET_CODE (op0) == MEM
|
||||
&& GET_MODE (op0) == BLKmode
|
||||
&& bitsize
|
||||
&& (bitpos % bitsize) == 0
|
||||
&& (bitsize % GET_MODE_ALIGNMENT (mode1)) == 0
|
||||
&& (alignment * BITS_PER_UNIT) == GET_MODE_ALIGNMENT (mode1))
|
||||
{
|
||||
rtx temp = change_address (op0, mode1,
|
||||
plus_constant (XEXP (op0, 0),
|
||||
(bitpos /
|
||||
BITS_PER_UNIT)));
|
||||
if (GET_CODE (XEXP (temp, 0)) == REG)
|
||||
op0 = temp;
|
||||
else
|
||||
op0 = change_address (op0, mode1,
|
||||
force_reg (GET_MODE (XEXP (temp, 0)),
|
||||
XEXP (temp, 0)));
|
||||
bitpos = 0;
|
||||
}
|
||||
|
||||
|
||||
op0 = change_address (op0, VOIDmode,
|
||||
gen_rtx_PLUS (ptr_mode, XEXP (op0, 0),
|
||||
force_reg (ptr_mode, offset_rtx)));
|
||||
|
Loading…
Reference in New Issue
Block a user