aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Kenner <kenner@vlsi1.ultra.nyu.edu>2003-05-04 22:09:48 +0000
committerRichard Kenner <kenner@gcc.gnu.org>2003-05-04 18:09:48 -0400
commitc1853da7d396a05e6946b81051c18c8b5709b3c2 (patch)
treeb8640fda4af09633acae350d1bc8ba846aa08da9
parent41dd7402adb27e783c5d928f5c53cf221c5c6eb5 (diff)
downloadgcc-c1853da7d396a05e6946b81051c18c8b5709b3c2.zip
gcc-c1853da7d396a05e6946b81051c18c8b5709b3c2.tar.gz
gcc-c1853da7d396a05e6946b81051c18c8b5709b3c2.tar.bz2
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
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/expr.c18
2 files changed, 21 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 286b66a..669001d 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/expr.c b/gcc/expr.c
index 7fd347b..ba7db15 100644
--- a/gcc/expr.c
+++ b/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. */