aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAndrew Pinski <pinskia@physics.uc.edu>2004-12-12 16:45:20 +0000
committerAndrew Pinski <pinskia@gcc.gnu.org>2004-12-12 08:45:20 -0800
commita5f712ff3f308c61bad9a71f075f304f367031bd (patch)
tree6b9af61f2a460eb0d5a22975239f5c95ddfd4b12 /gcc
parent902c2ed4ead835a619897aa11fe6cdee34106ae4 (diff)
downloadgcc-a5f712ff3f308c61bad9a71f075f304f367031bd.zip
gcc-a5f712ff3f308c61bad9a71f075f304f367031bd.tar.gz
gcc-a5f712ff3f308c61bad9a71f075f304f367031bd.tar.bz2
re PR tree-optimization/18040 (ICE in for_each_index, at tree-ssa-loop-im.c:178)
2004-12-12 Andrew Pinski <pinskia@physics.uc.edu> 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. From-SVN: r92051
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/expr.c19
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/opt/ptrmem6.C28
4 files changed, 40 insertions, 19 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 643de99..ba0229f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/expr.c b/gcc/expr.c
index 1f4d140..8505d8f 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 50912ca9..96706b2 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..891c4ff
--- /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();
+ }
+}
+