From patchwork Sat Apr 6 11:13:55 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jeff Law X-Patchwork-Id: 234327 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]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client CN "localhost", Issuer "www.qmailtoaster.com" (not verified)) by ozlabs.org (Postfix) with ESMTPS id F29652C00FE for ; Sat, 6 Apr 2013 22:14:08 +1100 (EST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :message-id:date:from:mime-version:to:subject:content-type; q= dns; s=default; b=c5VE+Dc4Vw6PFlExVIDNxEeR+D1zphbSfP7kyb8IoeyzVc 9X5I+9WsQsbIhOETw3bZUDzvpa01amLX2P8ohps9Fv85SVErSqKgw6+0mgh3Nksw 31GdGL4CPH5UssMjZ2hqd+82pMY+HoiZ4AP6a9XVjAE65y+oo5nywQUC1UdLw= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :message-id:date:from:mime-version:to:subject:content-type; s= default; bh=49Qwkefp67hyA3A7GNuOZU3/+38=; b=mHAd4pyAfB2NLfVhR01i Ld8IbzaAxBSVv/eH2+tkRZvYt8hbpIoIZ+8vImBUTdm2vkWau3ZU0cZLyZJzfIXO ShqLSAufuHa9mKQbWL0RQUCsbwKTtOEj+ndHUY7xp96fl5k4SSD2h8zP4d5hn4dn zt99gPE/BS/9lSO5jdvXR+k= Received: (qmail 8098 invoked by alias); 6 Apr 2013 11:14:01 -0000 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 Received: (qmail 8085 invoked by uid 89); 6 Apr 2013 11:14:00 -0000 X-Spam-SWARE-Status: No, score=-7.9 required=5.0 tests=AWL, BAYES_00, KHOP_RCVD_UNTRUST, RCVD_IN_DNSWL_HI, RCVD_IN_HOSTKARMA_W, RP_MATCHES_RCVD, SPF_HELO_PASS autolearn=ham version=3.3.1 Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.84/v0.84-167-ge50287c) with ESMTP; Sat, 06 Apr 2013 11:13:58 +0000 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r36BDuD0003901 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Sat, 6 Apr 2013 07:13:56 -0400 Received: from stumpy.slc.redhat.com (ovpn-113-84.phx2.redhat.com [10.3.113.84]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r36BDugO027461 for ; Sat, 6 Apr 2013 07:13:56 -0400 Message-ID: <51600373.7050706@redhat.com> Date: Sat, 06 Apr 2013 05:13:55 -0600 From: Jeff Law User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130311 Thunderbird/17.0.4 MIME-Version: 1.0 To: gcc-patches Subject: [RFA] [PATCH] Minor improvement to canonicalization of COND_EXPR for gimple X-Virus-Found: No The tree combiner/forward propagator is missing opportunities to collapse sequences like this: _15 = _12 ^ _14; if (_15 != 0) Into: if (_12 != _14) The tree combiner/forward propagator builds this tree: x ^ y Then passes it to canonicalize_cond_expr_cond That is not suitable for the condition in a gimple COND_EXPR. So canonicalize_cond_expr_cond returns NULL. Thus combine_cond_expr_cond decides the tree it created isn't useful and throws it away. This patch changes canonicalize_cond_expr to rewrite x ^ y into x != y. The net result being the tree combiner/forward propagator is able to perform the desired simplification, eliminating the BIT_XOR_EXPR. Bootstrapped and regression tested on x86_64-unknown-linux-gnu. As you can see from the testcase, these kinds of sequences show up when compiling gcc itself. OK for the trunk? commit 809408a4bde6dfbaf62c5bda9ab7ae6c4447d984 Author: Jeff Law Date: Sat Apr 6 05:11:17 2013 -0600 * gimple.c (canonicalize_cond_expr_cond): Rewrite x ^ y into x != y. * gcc.dg/tree-ssa/forwprop-25.c: New test diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b8a6900..44797cc 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2013-04-06 Jeff Law + + * gimple.c (canonicalize_cond_expr_cond): Rewrite x ^ y into + x != y. + 2013-04-03 Jeff Law * Makefile.in (lra-constraints.o): Depend on $(OPTABS_H). diff --git a/gcc/gimple.c b/gcc/gimple.c index 785c2f0..cdb6f24 100644 --- a/gcc/gimple.c +++ b/gcc/gimple.c @@ -2958,7 +2958,11 @@ canonicalize_cond_expr_cond (tree t) t = build2 (TREE_CODE (top0), TREE_TYPE (t), TREE_OPERAND (top0, 0), TREE_OPERAND (top0, 1)); } - + /* For x ^ y use x != y. */ + else if (TREE_CODE (t) == BIT_XOR_EXPR) + t = build2 (NE_EXPR, TREE_TYPE (t), + TREE_OPERAND (t, 0), TREE_OPERAND (t, 1)); + if (is_gimple_condexpr (t)) return t; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index dc0b745..601ca66 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2013-04-06 Jeff Law + + * gcc.dg/tree-ssa/forwprop-25.c: New test + 2013-04-03 Jeff Law PR tree-optimization/56799 diff --git a/gcc/testsuite/gcc.dg/tree-ssa/forwprop-25.c b/gcc/testsuite/gcc.dg/tree-ssa/forwprop-25.c new file mode 100644 index 0000000..cf0c504 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/forwprop-25.c @@ -0,0 +1,43 @@ +/* { dg-do compile } */ +/* { dg-options "-O1 -fdump-tree-forwprop1" } */ + +struct rtx_def; +typedef struct rtx_def *rtx; +typedef const struct rtx_def *const_rtx; +enum machine_mode +{ + MAX_MACHINE_MODE, + NUM_MACHINE_MODES = MAX_MACHINE_MODE +}; +extern const char *const mode_name[NUM_MACHINE_MODES]; +enum mode_class +{ MODE_RANDOM, MODE_CC, MODE_INT, MODE_PARTIAL_INT, MODE_FRACT, MODE_UFRACT, + MODE_ACCUM, MODE_UACCUM, MODE_FLOAT, MODE_DECIMAL_FLOAT, MODE_COMPLEX_INT, + MODE_COMPLEX_FLOAT, MODE_VECTOR_INT, MODE_VECTOR_FRACT, + MODE_VECTOR_UFRACT, MODE_VECTOR_ACCUM, MODE_VECTOR_UACCUM, + MODE_VECTOR_FLOAT, MAX_MODE_CLASS }; +extern const unsigned char mode_class[NUM_MACHINE_MODES]; +extern const unsigned short mode_precision[NUM_MACHINE_MODES]; +struct rtx_def +{ + __extension__ enum machine_mode mode:8; +}; +void +convert_move (rtx to, rtx from, int unsignedp) +{ + enum machine_mode to_mode = ((enum machine_mode) (to)->mode); + enum machine_mode from_mode = ((enum machine_mode) (from)->mode); + ((void) + (!((mode_precision[from_mode] != mode_precision[to_mode]) + || ((((enum mode_class) mode_class[from_mode]) == MODE_DECIMAL_FLOAT) != + (((enum mode_class) mode_class[to_mode]) == + MODE_DECIMAL_FLOAT))) ? + fancy_abort ("/home/gcc/virgin-gcc/gcc/expr.c", 380, __FUNCTION__), + 0 : 0)); +} + +/* { dg-final { scan-tree-dump "Replaced.*!=.*with.*!=.* " "forwprop1"} } */ +/* { dg-final { cleanup-tree-dump "forwprop1" } } */ + + +