diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2005-08-31 15:55:52 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@gcc.gnu.org> | 2005-08-31 15:55:52 +0000 |
commit | dc38a61086ce5044b9b78c48e7897179b819e06e (patch) | |
tree | 18099d4c9108cab72f9d8b420877fd4281f5f06d | |
parent | f471f0fcc76c7e67c8c958f25203660d78913537 (diff) | |
download | gcc-dc38a61086ce5044b9b78c48e7897179b819e06e.zip gcc-dc38a61086ce5044b9b78c48e7897179b819e06e.tar.gz gcc-dc38a61086ce5044b9b78c48e7897179b819e06e.tar.bz2 |
Fix ppc -m64 constant address expression expansion bug.
Oked by Richard Henderson.
From-SVN: r103676
-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 62801c9..40dcbe3 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 @@ -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 0000000..dc34368 --- /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; +} |