aboutsummaryrefslogtreecommitdiff
path: root/gcc/expr.c
diff options
context:
space:
mode:
authorHerman A.J. ten Brugge <Haj.Ten.Brugge@net.HCC.nl>1998-06-25 00:40:29 +0200
committerJeff Law <law@gcc.gnu.org>1998-06-24 16:40:29 -0600
commit8975220280e19103df314fc6cbf54a44824fdd83 (patch)
tree1b095b46e1f5dc4f113f58e85bef3d80e30dee5c /gcc/expr.c
parentc358412fe862074065968caec2e318a8b5d9f4ee (diff)
downloadgcc-8975220280e19103df314fc6cbf54a44824fdd83.zip
gcc-8975220280e19103df314fc6cbf54a44824fdd83.tar.gz
gcc-8975220280e19103df314fc6cbf54a44824fdd83.tar.bz2
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
Diffstat (limited to 'gcc/expr.c')
-rw-r--r--gcc/expr.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/gcc/expr.c b/gcc/expr.c
index ddb5bbb..91134d3 100644
--- a/gcc/expr.c
+++ b/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)));