OSDN Git Service

2004-12-12 Andrew Pinski <pinskia@physics.uc.edu>
authorpinskia <pinskia@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 12 Dec 2004 16:45:20 +0000 (16:45 +0000)
committerpinskia <pinskia@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 12 Dec 2004 16:45:20 +0000 (16:45 +0000)
        PR tree-opt/18040
        * g++.dg/opt/ptrmem6.C: New test.

2004-12-12  Andrew Pinski  <pinskia@physics.uc.edu>

        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
gcc/expr.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/opt/ptrmem6.C [new file with mode: 0644]

index 643de99..ba0229f 100644 (file)
@@ -1,3 +1,10 @@
+2004-12-12  Andrew Pinski  <pinskia@physics.uc.edu>
+
+       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  <kazu@cs.umass.edu>
 
        * reg-stack.c (convert_regs_2): Free stack.
index 1f4d140..8505d8f 100644 (file)
@@ -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;
     }
index 50912ca..96706b2 100644 (file)
@@ -1,3 +1,8 @@
+2004-12-12  Andrew Pinski  <pinskia@physics.uc.edu>
+
+       PR tree-opt/18040
+       * g++.dg/opt/ptrmem6.C: New test.
+
 2004-12-11  Roger Sayle  <roger@eyesopen.com>
 
        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 (file)
index 0000000..891c4ff
--- /dev/null
@@ -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();
+    }
+}
+