From f98e89380fd7ca4035221eaa9a8efad0e420d1b5 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Tue, 27 Nov 2007 16:28:07 +0100 Subject: [PATCH] re PR target/34225 (ICE (segfault) in adjacent_mem_locations at rs6000.c:18191) PR target/34225 * config/rs6000/rs6000.c (adjacent_mem_locations): Don't assume MEM_SIZE is set on all MEMs. * gcc.dg/pr34225.c: New test. From-SVN: r130470 --- gcc/ChangeLog | 6 ++++ gcc/config/rs6000/rs6000.c | 7 ++-- gcc/testsuite/ChangeLog | 5 +++ gcc/testsuite/gcc.dg/pr34225.c | 61 ++++++++++++++++++++++++++++++++++ 4 files changed, 75 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr34225.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index eeca68ad311..3febeaba0a6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2007-11-27 Jakub Jelinek + + PR target/34225 + * config/rs6000/rs6000.c (adjacent_mem_locations): Don't assume + MEM_SIZE is set on all MEMs. + 2007-11-27 Andreas Krebbel * config/s390/s390.opt (mhard-float): Add the option to be diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 15bebb12ee8..3367e0848da 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -18166,9 +18166,8 @@ adjacent_mem_locations (rtx insn1, rtx insn2) || (GET_CODE (XEXP (b, 0)) == PLUS && GET_CODE (XEXP (XEXP (b, 0), 1)) == CONST_INT))) { - HOST_WIDE_INT val0 = 0, val1 = 0; + HOST_WIDE_INT val0 = 0, val1 = 0, val_diff; rtx reg0, reg1; - int val_diff; if (GET_CODE (XEXP (a, 0)) == PLUS) { @@ -18189,8 +18188,8 @@ adjacent_mem_locations (rtx insn1, rtx insn2) val_diff = val1 - val0; return ((REGNO (reg0) == REGNO (reg1)) - && (val_diff == INTVAL (MEM_SIZE (a)) - || val_diff == -INTVAL (MEM_SIZE (b)))); + && ((MEM_SIZE (a) && val_diff == INTVAL (MEM_SIZE (a))) + || (MEM_SIZE (b) && val_diff == -INTVAL (MEM_SIZE (b))))); } return false; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4e14852e88b..231513f0daf 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-11-27 Jakub Jelinek + + PR target/34225 + * gcc.dg/pr34225.c: New test. + 2007-11-27 Richard Guenther PR tree-optimization/34241 diff --git a/gcc/testsuite/gcc.dg/pr34225.c b/gcc/testsuite/gcc.dg/pr34225.c new file mode 100644 index 00000000000..659e176ad96 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr34225.c @@ -0,0 +1,61 @@ +/* PR target/34225 */ +/* { dg-do compile } */ +/* { dg-options "-O2 -fno-strict-aliasing -fstack-protector" } */ +/* { dg-require-effective-target fstack_protector } */ + +typedef __SIZE_TYPE__ size_t; +extern int sscanf (const char *, const char *, ...); +struct C +{ + char c[240]; +}; +struct O +{ + char **o; +}; +struct P +{ + int p1; + char p2[256]; + char p3[256]; + char p4[256]; +}; + +extern void *s; +extern int f1 (char *, struct C *); +extern void f2 (void *, const char *); +extern void f3 (char *, const char *); +extern int f4 (int, double *, int); + +int +foo (char *a[], struct O *b, int c, int d, struct P *e, int f, int *h, + char *l) +{ + int i, g = 7, m = 0, n; + struct C j[150]; + double *k[150]; + char o[100]; + + if (f1 (o, &j[g]) < 0) + g++; + + while (!m) + { + f2 (s, "xxx"); + for (i = 0; i < f; i++) + if ((!b->o && __builtin_strncmp (l, "abcde", 5) == 0) + || (b->o && !b->o[c])) + { + *e[d].p4 = *e[d].p3 = *e[d].p2 = 0; + sscanf (l, "%s %s %[^\n]", e[d].p3, e[d].p2, e[d].p4); + } + for (n = 0; n < d; n++) + for (i = 0; i < g; i++) + { + f3 (a[i + 1], "foo"); + if (f4 (h[i], k[i], e[n].p1) < 0) + f3 (a[i + 1], "bar"); + } + } + return 0; +} -- 2.30.2