From patchwork Wed Dec 28 19:04:08 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Jelinek X-Patchwork-Id: 133455 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 87435B6FBC for ; Thu, 29 Dec 2011 06:04:38 +1100 (EST) Received: (qmail 13847 invoked by alias); 28 Dec 2011 19:04:36 -0000 Received: (qmail 13836 invoked by uid 22791); 28 Dec 2011 19:04:35 -0000 X-SWARE-Spam-Status: No, hits=-7.2 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, SPF_HELO_PASS, TW_CP, TW_TM X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 28 Dec 2011 19:04:10 +0000 Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id pBSJ4A57030228 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 28 Dec 2011 14:04:10 -0500 Received: from tyan-ft48-01.lab.bos.redhat.com (tyan-ft48-01.lab.bos.redhat.com [10.16.42.4]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id pBSJ49n4024996 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Wed, 28 Dec 2011 14:04:09 -0500 Received: from tyan-ft48-01.lab.bos.redhat.com (tyan-ft48-01.lab.bos.redhat.com [127.0.0.1]) by tyan-ft48-01.lab.bos.redhat.com (8.14.4/8.14.4) with ESMTP id pBSJ480S004616 for ; Wed, 28 Dec 2011 20:04:09 +0100 Received: (from jakub@localhost) by tyan-ft48-01.lab.bos.redhat.com (8.14.4/8.14.4/Submit) id pBSJ48Ca004614 for gcc-patches@gcc.gnu.org; Wed, 28 Dec 2011 20:04:08 +0100 Date: Wed, 28 Dec 2011 20:04:08 +0100 From: Jakub Jelinek To: gcc-patches@gcc.gnu.org Subject: [PATCH] Don't optimize away non-pure/const calls during ccp (PR tree-optimization/51683) Message-ID: <20111228190408.GJ1957@tyan-ft48-01.lab.bos.redhat.com> Reply-To: Jakub Jelinek MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-IsSubscribed: yes 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 Hi! For some calls (like memcpy and other builtins that are known to pass through the first argument) we know the value of the lhs, but still we shouldn't be replacing the call with just a mere assignment of that known value to the LHS SSA_NAME, because the call has other side-effects. Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2011-12-28 Jakub Jelinek PR tree-optimization/51683 * tree-ssa-propagate.c (substitute_and_fold): Don't optimize away calls with side-effects. * tree-ssa-ccp.c (ccp_fold_stmt): Likewise. * gcc.dg/pr51683.c: New test. Jakub --- gcc/tree-ssa-propagate.c.jj 2011-11-11 20:54:59.000000000 +0100 +++ gcc/tree-ssa-propagate.c 2011-12-27 12:23:41.334187258 +0100 @@ -1056,6 +1056,12 @@ substitute_and_fold (ssa_prop_get_value_ } else if (is_gimple_call (def_stmt)) { + int flags = gimple_call_flags (def_stmt); + + /* Don't optimize away calls that have side-effects. */ + if ((flags & (ECF_CONST|ECF_PURE)) == 0 + || (flags & ECF_LOOPING_CONST_OR_PURE)) + continue; if (update_call_from_tree (&gsi, val) && maybe_clean_or_replace_eh_stmt (def_stmt, gsi_stmt (gsi))) gimple_purge_dead_eh_edges (gimple_bb (gsi_stmt (gsi))); --- gcc/tree-ssa-ccp.c.jj 2011-12-19 09:21:07.000000000 +0100 +++ gcc/tree-ssa-ccp.c 2011-12-27 12:29:48.620880857 +0100 @@ -1878,6 +1878,7 @@ ccp_fold_stmt (gimple_stmt_iterator *gsi case GIMPLE_CALL: { tree lhs = gimple_call_lhs (stmt); + int flags = gimple_call_flags (stmt); tree val; tree argt; bool changed = false; @@ -1888,7 +1889,10 @@ ccp_fold_stmt (gimple_stmt_iterator *gsi type issues. */ if (lhs && TREE_CODE (lhs) == SSA_NAME - && (val = get_constant_value (lhs))) + && (val = get_constant_value (lhs)) + /* Don't optimize away calls that have side-effects. */ + && (flags & (ECF_CONST|ECF_PURE)) != 0 + && (flags & ECF_LOOPING_CONST_OR_PURE) == 0) { tree new_rhs = unshare_expr (val); bool res; --- gcc/testsuite/gcc.dg/pr51683.c.jj 2011-12-27 12:21:43.662925435 +0100 +++ gcc/testsuite/gcc.dg/pr51683.c 2011-12-27 12:21:23.000000000 +0100 @@ -0,0 +1,18 @@ +/* PR tree-optimization/51683 */ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ + +static inline void * +bar (void *p, void *q, int r) +{ + return __builtin_memcpy (p, q, r); +} + +void * +foo (void *p) +{ + return bar ((void *) 0x12345000, p, 256); +} + +/* { dg-final { scan-tree-dump "memcpy" "optimized" } } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */