From 8586aeeb9cf8ca7a2cd3dfd6cb589dbc070abd0f Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Mon, 15 Sep 2008 23:52:53 +0200 Subject: [PATCH] re PR libmudflap/36397 (ICE with pointer cast and -fmudflap) PR libmudflap/36397 * tree-mudflap.c (mf_xform_derefs_1): Handle VIEW_CONVERT_EXPR. * testsuite/libmudflap.c/pass64-frag.c: New test. From-SVN: r140374 --- gcc/ChangeLog | 5 +++ gcc/tree-mudflap.c | 7 ++++ libmudflap/ChangeLog | 5 +++ .../testsuite/libmudflap.c/pass64-frag.c | 38 +++++++++++++++++++ 4 files changed, 55 insertions(+) create mode 100644 libmudflap/testsuite/libmudflap.c/pass64-frag.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index eeab0fea997..ab5a3156b46 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2008-09-15 Jakub Jelinek + + PR libmudflap/36397 + * tree-mudflap.c (mf_xform_derefs_1): Handle VIEW_CONVERT_EXPR. + 2008-09-14 Andreas Schwab * tree-call-cdce.c (check_target_format): Accept Motorola formats. diff --git a/gcc/tree-mudflap.c b/gcc/tree-mudflap.c index 3f77b2cb1f6..0b3eba5ddad 100644 --- a/gcc/tree-mudflap.c +++ b/gcc/tree-mudflap.c @@ -773,6 +773,13 @@ mf_xform_derefs_1 (gimple_stmt_iterator *iter, tree *tp, base = TREE_OPERAND (var, 0); break; } + else if (TREE_CODE (var) == VIEW_CONVERT_EXPR) + { + var = TREE_OPERAND (var, 0); + if (CONSTANT_CLASS_P (var) + && TREE_CODE (var) != STRING_CST) + return; + } else { gcc_assert (TREE_CODE (var) == VAR_DECL diff --git a/libmudflap/ChangeLog b/libmudflap/ChangeLog index e9eec1050f4..6a879243c9c 100644 --- a/libmudflap/ChangeLog +++ b/libmudflap/ChangeLog @@ -1,3 +1,8 @@ +2008-09-15 Jakub Jelinek + + PR libmudflap/36397 + * testsuite/libmudflap.c/pass64-frag.c: New test. + 2008-06-17 Ralf Wildenhues * Makefile.in: Regenerate. diff --git a/libmudflap/testsuite/libmudflap.c/pass64-frag.c b/libmudflap/testsuite/libmudflap.c/pass64-frag.c new file mode 100644 index 00000000000..856eec0fa7e --- /dev/null +++ b/libmudflap/testsuite/libmudflap.c/pass64-frag.c @@ -0,0 +1,38 @@ +/* PR libmudflap/36397 */ +/* { dg-do run } */ +/* { dg-options "-O -fmudflap -fno-strict-aliasing -lmudflap" } */ + +struct A +{ + int a[2]; +}; + +long long int x; + +int __attribute__ ((noinline)) +baz (long long int *x) +{ + return *x; +} + +int __attribute__ ((noinline)) +foo (int i) +{ + if (i > 10) + return baz (&x); + return ((struct A *) &x)->a[i]; +} + +int +main (void) +{ + if (sizeof (long long) == 2 * sizeof (int) + && sizeof (long long) == sizeof (struct A)) + { + struct A a = { .a[0] = 10, .a[1] = 20 }; + __builtin_memcpy (&x, &a, sizeof (x)); + if (foo (0) != 10 || foo (1) != 20) + __builtin_abort (); + } + return 0; +}