diff options
author | Richard Kenner <kenner@vlsi1.ultra.nyu.edu> | 2003-05-04 22:09:48 +0000 |
---|---|---|
committer | Richard Kenner <kenner@gcc.gnu.org> | 2003-05-04 18:09:48 -0400 |
commit | c1853da7d396a05e6946b81051c18c8b5709b3c2 (patch) | |
tree | b8640fda4af09633acae350d1bc8ba846aa08da9 | |
parent | 41dd7402adb27e783c5d928f5c53cf221c5c6eb5 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/expr.c | 18 |
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. @@ -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. */ |