From 616ba5c3d0b0d1335bf1f164e8aef45bc453eab9 Mon Sep 17 00:00:00 2001 From: pinskia Date: Sun, 12 Dec 2004 16:45:20 +0000 Subject: [PATCH] 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@92051 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 7 +++++++ gcc/expr.c | 19 ------------------- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/opt/ptrmem6.C | 28 ++++++++++++++++++++++++++++ 4 files changed, 40 insertions(+), 19 deletions(-) create mode 100644 gcc/testsuite/g++.dg/opt/ptrmem6.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 643de99a3cf..ba0229f1fcd 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 1f4d140332f..8505d8f676f 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 50912ca9b4b..96706b2dc20 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 00000000000..891c4ff176f --- /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(); + } +} + -- 2.11.0