aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2005-08-31 15:55:52 +0000
committerFariborz Jahanian <fjahanian@gcc.gnu.org>2005-08-31 15:55:52 +0000
commitdc38a61086ce5044b9b78c48e7897179b819e06e (patch)
tree18099d4c9108cab72f9d8b420877fd4281f5f06d /gcc
parentf471f0fcc76c7e67c8c958f25203660d78913537 (diff)
downloadgcc-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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/expr.c2
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/const-addr-expr-1.c33
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
diff --git a/gcc/expr.c b/gcc/expr.c
index e75d335..e44a54f 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 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;
+}