http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45878

--- Comment #6 from Richard Guenther <rguenth at gcc dot gnu.org> 2010-10-13 
13:54:54 UTC ---
(In reply to comment #5)
> I think the patch that broke this should be backed out until the semantics are
> sorted out.  I think the middle-end people should decide on which part of the
> compiler is wrong, how to make the other-side conform and then change the
> documentation to make it clear.  Once that is done, the side that is wrong
> should be fixed, once that is done, the patch can then be reenabled.
> 
> So far, it sounds like a ME problem to me.

It is likely a miscommunication (or lack of definition) on what the middle-end
expects from an OBJ_TYPE_REF and what the ObjC frontend uses it for or how
it does that.

The CCP folding piece looks overly simple to me, it should use the
fold-stmt machinery:

Index: tree-ssa-ccp.c
===================================================================
--- tree-ssa-ccp.c      (revision 165419)
+++ tree-ssa-ccp.c      (working copy)
@@ -2267,6 +2284,7 @@ ccp_fold_stmt (gimple_stmt_iterator *gsi
        tree lhs = gimple_call_lhs (stmt);
        tree val;
        tree argt;
+       tree callee;
        bool changed = false;
        unsigned i;

@@ -2306,16 +2324,24 @@ ccp_fold_stmt (gimple_stmt_iterator *gsi
                changed = true;
              }
          }
-       if (TREE_CODE (gimple_call_fn (stmt)) == OBJ_TYPE_REF)
+
+       callee = gimple_call_fn (stmt);
+       if (TREE_CODE (callee) == OBJ_TYPE_REF
+           && TREE_CODE (OBJ_TYPE_REF_EXPR (callee)) == SSA_NAME)
          {
-           tree expr = OBJ_TYPE_REF_EXPR (gimple_call_fn (stmt));
-           expr = valueize_op (expr);
-           if (TREE_CODE (expr) == ADDR_EXPR
-               && TREE_CODE (TREE_OPERAND (expr, 0)) == FUNCTION_DECL)
-            {
-              gimple_call_set_fn (stmt, expr);
-              changed = true;
-            }
+           tree expr = OBJ_TYPE_REF_EXPR (callee);
+           OBJ_TYPE_REF_EXPR (callee) = valueize_op (expr);
+           if (TREE_CODE (OBJ_TYPE_REF_EXPR (callee)) == ADDR_EXPR)
+             {
+               tree t;
+               t = gimple_fold_obj_type_ref (callee, NULL_TREE);
+               if (t)
+                 {
+                   gimple_call_set_fn (stmt, t);
+                   changed = true;
+                 }
+             }
+           OBJ_TYPE_REF_EXPR (callee) = expr;
          }

        return changed;


but as my ObjC/ObjC++ results on Linux are clean I can't see any issue
with testing.  Hmm?

Reply via email to