diff options
| author | fjahanian <fjahanian@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-08-31 15:55:52 +0000 |
|---|---|---|
| committer | fjahanian <fjahanian@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-08-31 15:55:52 +0000 |
| commit | d0ce84265164827f11494239b06d0eaa5d81ff7d (patch) | |
| tree | 18099d4c9108cab72f9d8b420877fd4281f5f06d | |
| parent | c6950818cc78854be4fcb839ff2f1fed25dedc09 (diff) | |
| download | ppe42-gcc-d0ce84265164827f11494239b06d0eaa5d81ff7d.tar.gz ppe42-gcc-d0ce84265164827f11494239b06d0eaa5d81ff7d.zip | |
Fix ppc -m64 constant address expression expansion bug.
Oked by Richard Henderson.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@103676 138bc75d-0d04-0410-961f-82ee72b054a4
| -rw-r--r-- | gcc/ChangeLog | 6 | ||||
| -rw-r--r-- | gcc/expr.c | 2 | ||||
| -rw-r--r-- | gcc/testsuite/gcc.c-torture/execute/const-addr-expr-1.c | 33 |
3 files changed, 40 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 62801c9c3f5..40dcbe33045 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2005-08-31 Fariborz Jahanian <fjahanian@apple.com> + + * expr.c (expand_expr_real_1): Compare size of address + mode to target's address mode size in deciding expansion of + the constant address. + 2005-08-31 Richard Guenther <rguenther@suse.de> PR middle-end/23477 diff --git a/gcc/expr.c b/gcc/expr.c index e75d3351395..e44a54f9729 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -7673,7 +7673,7 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode, } else if (TREE_CODE (TREE_OPERAND (exp, 1)) == INTEGER_CST - && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_INT + && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT && TREE_CONSTANT (TREE_OPERAND (exp, 0))) { rtx constant_part; diff --git a/gcc/testsuite/gcc.c-torture/execute/const-addr-expr-1.c b/gcc/testsuite/gcc.c-torture/execute/const-addr-expr-1.c new file mode 100644 index 00000000000..dc34368cb4a --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/const-addr-expr-1.c @@ -0,0 +1,33 @@ +#include <stdio.h> +#include <stdlib.h> +extern void abort(); + +typedef struct foo +{ + int uaattrid; + char *name; +} FOO; + +FOO Upgrade_items[] = +{ + {1, "1"}, + {2, "2"}, + {0, NULL} +}; + +int *Upgd_minor_ID = + (int *) &((Upgrade_items + 1)->uaattrid); + +int *Upgd_minor_ID1 = + (int *) &((Upgrade_items)->uaattrid); + +int +main(int argc, char **argv) +{ + if (*Upgd_minor_ID != 2) + abort(); + + if (*Upgd_minor_ID1 != 1) + abort(); + return 0; +} |

