From 844d5fca1fcf3c1adf83b7c0b8e0d8e4141b5c33 Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Thu, 4 Nov 2010 14:07:48 +0000 Subject: [PATCH] re PR tree-optimization/45991 (ICE: verify_stmts failed: Invalid address operand in in TARGET_MEM_REF. with -fstrict-overflow) 2010-11-04 Richard Guenther PR tree-optimization/45991 * gimplify.c (force_gimple_operand_1): Use the provded test function in the initial test. * gcc.dg/pr45991.c: New testcase. From-SVN: r166312 --- gcc/ChangeLog | 6 ++++++ gcc/gimplify.c | 6 +++++- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/pr45991.c | 20 ++++++++++++++++++++ 4 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/pr45991.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 12f72b87c0f..705c9ff0a45 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2010-11-04 Richard Guenther + + PR tree-optimization/45991 + * gimplify.c (force_gimple_operand_1): Use the provded test + function in the initial test. + 2010-11-04 Jeff Law * ira.c (validate_equiv_mem): Remove code to avoid invalidation diff --git a/gcc/gimplify.c b/gcc/gimplify.c index d5a633c1b5e..f4903499717 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -8047,7 +8047,11 @@ force_gimple_operand_1 (tree expr, gimple_seq *stmts, *stmts = NULL; - if (is_gimple_val (expr)) + /* gimple_test_f might be more strict than is_gimple_val, make + sure we pass both. Just checking gimple_test_f doesn't work + because most gimple predicates do not work recursively. */ + if (is_gimple_val (expr) + && (*gimple_test_f) (expr)) return expr; push_gimplify_context (&gctx); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d20cee4db96..c5ce28be1e3 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-11-04 Richard Guenther + + PR tree-optimization/45991 + * gcc.dg/pr45991.c: New testcase. + 2010-11-04 Richard Guenther PR tree-optimization/46154 diff --git a/gcc/testsuite/gcc.dg/pr45991.c b/gcc/testsuite/gcc.dg/pr45991.c new file mode 100644 index 00000000000..eefce4429e1 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr45991.c @@ -0,0 +1,20 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fstrict-overflow" } */ + +struct S +{ + int i; +}; + +char A[64]; + +void foo (char **dst, int i) +{ + char *p = A + 16; + while (i--) + { + int b = ((struct S *) (&p[i * 16 + 4]))->i; + char *c = A + i * 16; + dst[i] = c + b; + } +} -- 2.30.2