From: Andrew Pinski Date: Sun, 12 Dec 2004 16:45:20 +0000 (+0000) Subject: re PR tree-optimization/18040 (ICE in for_each_index, at tree-ssa-loop-im.c:178) X-Git-Tag: releases/gcc-4.0.0~2231 X-Git-Url: https://gcc.gnu.org/git/?a=commitdiff_plain;h=a5f712ff3f308c61bad9a71f075f304f367031bd;p=gcc.git re PR tree-optimization/18040 (ICE in for_each_index, at tree-ssa-loop-im.c:178) 2004-12-12 Andrew Pinski PR tree-opt/18040 * g++.dg/opt/ptrmem6.C: New test. 2004-12-12 Andrew Pinski PR tree-opt/18040 * expr.c (get_inner_reference): Remove NON_LVALUE_EXPR, NOP_EXPR, CONVERT_EXPR cases. (handled_component_p): Likewise. From-SVN: r92051 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 643de99a3cf4..ba0229f1fcd9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2004-12-12 Andrew Pinski + + PR tree-opt/18040 + * expr.c (get_inner_reference): Remove NON_LVALUE_EXPR, NOP_EXPR, + CONVERT_EXPR cases. + (handled_component_p): Likewise. + 2004-12-12 Kazu Hirata * reg-stack.c (convert_regs_2): Free stack. diff --git a/gcc/expr.c b/gcc/expr.c index 1f4d140332f7..8505d8f676f1 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -5293,16 +5293,6 @@ get_inner_reference (tree exp, HOST_WIDE_INT *pbitsize, conversions that don't change the mode, and all view conversions except those that need to "step up" the alignment. */ - case NON_LVALUE_EXPR: - break; - - case NOP_EXPR: - case CONVERT_EXPR: - if (TYPE_MODE (TREE_TYPE (exp)) - != TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0)))) - goto done; - break; - case VIEW_CONVERT_EXPR: if ((TYPE_ALIGN (TREE_TYPE (exp)) > TYPE_ALIGN (TREE_TYPE (TREE_OPERAND (exp, 0)))) @@ -5445,20 +5435,11 @@ handled_component_p (tree t) case COMPONENT_REF: case ARRAY_REF: case ARRAY_RANGE_REF: - case NON_LVALUE_EXPR: case VIEW_CONVERT_EXPR: case REALPART_EXPR: case IMAGPART_EXPR: return 1; - /* ??? Sure they are handled, but get_inner_reference may return - a different PBITSIZE, depending upon whether the expression is - wrapped up in a NOP_EXPR or not, e.g. for bitfields. */ - case NOP_EXPR: - case CONVERT_EXPR: - return (TYPE_MODE (TREE_TYPE (t)) - == TYPE_MODE (TREE_TYPE (TREE_OPERAND (t, 0)))); - default: return 0; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 50912ca9b4b7..96706b2dc202 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2004-12-12 Andrew Pinski + + PR tree-opt/18040 + * g++.dg/opt/ptrmem6.C: New test. + 2004-12-11 Roger Sayle PR middle-end/18921 diff --git a/gcc/testsuite/g++.dg/opt/ptrmem6.C b/gcc/testsuite/g++.dg/opt/ptrmem6.C new file mode 100644 index 000000000000..891c4ff176fa --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/ptrmem6.C @@ -0,0 +1,28 @@ +// PR tree-opt/18040 +// { dg-do compile } +// { dg-options "-O3" } + +int PyObject_IsTrue(); +struct object_base +{ + void ptr() const; + void ptr1() const; +}; +struct object : public object_base +{ + typedef void (object::*bool_type)() const; + inline operator bool_type() const + { return PyObject_IsTrue() + ? &object_base::ptr : &object::ptr1; } +}; +void f(); +void g (void) +{ + for (unsigned n = 0; n < 100; ++n) + { + object kv; + if (kv) + f(); + } +} +