From patchwork Wed Oct 13 18:23:21 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Biener X-Patchwork-Id: 67722 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id 589A3B70D8 for ; Thu, 14 Oct 2010 05:23:32 +1100 (EST) Received: (qmail 3137 invoked by alias); 13 Oct 2010 18:23:30 -0000 Received: (qmail 3127 invoked by uid 22791); 13 Oct 2010 18:23:29 -0000 X-SWARE-Spam-Status: No, hits=-3.3 required=5.0 tests=AWL, BAYES_00, TW_TM, T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from cantor2.suse.de (HELO mx2.suse.de) (195.135.220.15) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 13 Oct 2010 18:23:24 +0000 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.221.2]) by mx2.suse.de (Postfix) with ESMTP id E192C8765C for ; Wed, 13 Oct 2010 20:23:21 +0200 (CEST) Date: Wed, 13 Oct 2010 20:23:21 +0200 (CEST) From: Richard Guenther To: gcc-patches@gcc.gnu.org Subject: [PATCH] Fix PR45878 Message-ID: User-Agent: Alpine 2.00 (LNX 1167 2008-08-23) MIME-Version: 1.0 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org This fixes ccp_fold_stmt to use gimple_fold_obj_type_ref so we can centrailize knowledge on how to interpret that in the context of a known function-decl in OBJ_TYPE_REF_EXPR. Appearantly this fixes PR45878. Bootstrapped and tested on x86_64-unknown-linux-gnu, applied. Richard. 2010-10-13 Richard Guenther PR objc/45878 * tree-ssa-ccpc (ccp_fold_stmt): Use gimple_fold_obj_type_ref. 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;