From 7139194bf9ee6158e94d4ddfb47dcfcdb338eae4 Mon Sep 17 00:00:00 2001 From: Aldy Hernandez <aldyh@redhat.com> Date: Tue, 20 Nov 2012 18:28:09 +0000 Subject: [PATCH] re PR tree-optimization/55350 (verify_gimple failed with invalid (pointer) operands to plus/minus) PR tree-optimization/55350 * gimple-ssa-strength-reduction.c (replace_dependent): Handle POINTER_{PLUS,MINUS}_EXPR correctly. From-SVN: r193672 --- gcc/ChangeLog | 6 ++++++ gcc/gimple-ssa-strength-reduction.c | 15 ++++++++++++--- gcc/testsuite/gcc.c-torture/compile/pr55350.c | 8 ++++++++ 3 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr55350.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index cc6441c657bd..09ab535d6a69 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2012-11-20 Aldy Hernandez <aldyh@redhat.com> + + PR tree-optimization/55350 + * gimple-ssa-strength-reduction.c (replace_dependent): Handle + POINTER_PLUS_EXPR correctly. + 2012-11-20 Uros Bizjak <ubizjak@gmail.com> * config/i386/i386.md (fix_trunc<MODEF:mode><SWI48:mode>_sse): Macroize diff --git a/gcc/gimple-ssa-strength-reduction.c b/gcc/gimple-ssa-strength-reduction.c index 8e2a24758ddc..65fc6b148593 100644 --- a/gcc/gimple-ssa-strength-reduction.c +++ b/gcc/gimple-ssa-strength-reduction.c @@ -1643,10 +1643,19 @@ replace_dependent (slsr_cand_t c, enum tree_code cand_code) basis = lookup_cand (c->basis); basis_name = gimple_assign_lhs (basis->cand_stmt); - incr_type = TREE_TYPE (gimple_assign_rhs1 (c->cand_stmt)); - code = PLUS_EXPR; + if (cand_code == POINTER_PLUS_EXPR) + { + incr_type = sizetype; + code = cand_code; + } + else + { + incr_type = TREE_TYPE (gimple_assign_rhs1 (c->cand_stmt)); + code = PLUS_EXPR; + } - if (bump.is_negative ()) + if (bump.is_negative () + && cand_code != POINTER_PLUS_EXPR) { code = MINUS_EXPR; bump = -bump; diff --git a/gcc/testsuite/gcc.c-torture/compile/pr55350.c b/gcc/testsuite/gcc.c-torture/compile/pr55350.c new file mode 100644 index 000000000000..f10daeae5020 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr55350.c @@ -0,0 +1,8 @@ +void +foo (__INTPTR_TYPE__ x, __INTPTR_TYPE__ y) +{ + int i; + void **a = (void *) (8UL * (x / 8UL)); + for (i = 0; i < x; i++) + a[i] = (void *) y; +} -- GitLab