From patchwork Fri Oct 7 16:39:12 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kai Tietz X-Patchwork-Id: 118352 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 B3FC2B70FF for ; Sat, 8 Oct 2011 03:39:56 +1100 (EST) Received: (qmail 17318 invoked by alias); 7 Oct 2011 16:39:38 -0000 Received: (qmail 16910 invoked by uid 22791); 7 Oct 2011 16:39:32 -0000 X-SWARE-Spam-Status: No, hits=-1.8 required=5.0 tests=AWL, BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM, RCVD_IN_DNSWL_LOW, TW_TM X-Spam-Check-By: sourceware.org Received: from mail-vx0-f175.google.com (HELO mail-vx0-f175.google.com) (209.85.220.175) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 07 Oct 2011 16:39:13 +0000 Received: by vcbfl17 with SMTP id fl17so3847406vcb.20 for ; Fri, 07 Oct 2011 09:39:12 -0700 (PDT) MIME-Version: 1.0 Received: by 10.220.5.210 with SMTP id 18mr649225vcw.83.1318005552214; Fri, 07 Oct 2011 09:39:12 -0700 (PDT) Received: by 10.220.180.5 with HTTP; Fri, 7 Oct 2011 09:39:12 -0700 (PDT) Date: Fri, 7 Oct 2011 18:39:12 +0200 Message-ID: Subject: [patch tree-optimization]: 6 of 6 Improve reassoc for bitwise operations From: Kai Tietz To: GCC Patches Cc: Richard Guenther 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 Hello, This patch adds to the repropagation code the conversion for ~X ==/!= CST to X ==/!= CST' (with CST' = ~ CST). We need to do this back-conversion after initial bitwise-binary repropagation loop, as otherwise it would interfer. ChangeLog 2011-10-07 Kai Tietz * tree-ssa-reassoc.c (repropagate_bitwise): Add handling for ~X !=/== CST conversion. 2011-10-07 Kai Tietz * gcc.dg/tree-ssa/reassoc-repro_cmpior-4.c: New file. * gcc.dg/tree-ssa/reassoc-repro_cmpior-5.c: New file. * gcc.dg/tree-ssa/reassoc-repro_cmpior-6.c: New file. Bootstrapped and regression-tested for all languages plus Ada and Obj-C++ on x86_64-pc-linux-gnu. Ok for apply? Regards, Kai Index: gcc/gcc/tree-ssa-reassoc.c =================================================================== --- gcc.orig/gcc/tree-ssa-reassoc.c +++ gcc/gcc/tree-ssa-reassoc.c @@ -3712,6 +3712,37 @@ repropagate_bitwise (basic_block bb) remove_stmt_chain (r); } + /* Now we are doing transformation ~X !=/== CST -> X !=/== ~CST. */ + for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) + { + gimple sub; + gimple stmt = gsi_stmt (gsi); + enum tree_code code; + tree l, r; + + if (!is_gimple_assign (stmt)) + continue; + + code = gimple_assign_rhs_code (stmt); + if (code != EQ_EXPR && code != NE_EXPR) + continue; + l = gimple_assign_rhs1 (stmt); + r = gimple_assign_rhs2 (stmt); + if (TREE_CODE (l) != SSA_NAME + || TREE_CODE (r) != INTEGER_CST + || (sub = SSA_NAME_DEF_STMT (l)) == NULL + || !is_gimple_assign (sub) + || gimple_assign_rhs_code (sub) != BIT_NOT_EXPR + || !INTEGRAL_TYPE_P (TREE_TYPE (l))) + continue; + gimple_assign_set_rhs_with_ops (&gsi, code, gimple_assign_rhs1 (sub), + fold_build1 (BIT_NOT_EXPR, + TREE_TYPE (l), r)); + update_stmt (stmt); + remove_stmt_chain (l); + remove_stmt_chain (r); + } + for (son = first_dom_son (CDI_DOMINATORS, bb); son; son = next_dom_son (CDI_DOMINATORS, son)) Index: gcc/gcc/testsuite/gcc.dg/tree-ssa/reassoc-repro_cmpior-4.c =================================================================== --- /dev/null +++ gcc/gcc/testsuite/gcc.dg/tree-ssa/reassoc-repro_cmpior-4.c @@ -0,0 +1,21 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized -ffast-math" } */ + +int foo (int a, int b, int c, int d) +{ + int r = (a == -1) & (b == -1); + int q = (c == -1) & (d == -1); + return r & q; +} + +int bar (int a, int b, int c, int d) +{ + int r = (a != -1) | (b != -1); + int q = (c != -1) | (d != -1); + return r | q; +} + +/* { dg-final { scan-tree-dump-times " == -1" 1 "optimized"} } */ +/* { dg-final { scan-tree-dump-times " != -1" 1 "optimized"} } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ + Index: gcc/gcc/testsuite/gcc.dg/tree-ssa/reassoc-repro_cmpior-5.c =================================================================== --- /dev/null +++ gcc/gcc/testsuite/gcc.dg/tree-ssa/reassoc-repro_cmpior-5.c @@ -0,0 +1,21 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized -ffast-math" } */ + +int foo (int a, char b, short c, long d) +{ + int r = (a == -1) & (b == -1); + int q = (c == -1) & (d == -1); + return r & q; +} + +int bar (int a, char b, short c, long d) +{ + int r = (a != -1) | (b != -1); + int q = (c != -1) | (d != -1); + return r | q; +} + +/* { dg-final { scan-tree-dump-times " == -1" 1 "optimized"} } */ +/* { dg-final { scan-tree-dump-times " != -1" 1 "optimized"} } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ + Index: gcc/gcc/testsuite/gcc.dg/tree-ssa/reassoc-repro_cmpior-6.c =================================================================== --- /dev/null +++ gcc/gcc/testsuite/gcc.dg/tree-ssa/reassoc-repro_cmpior-6.c @@ -0,0 +1,27 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized -ffast-math" } */ + +int foo (int a, unsigned char b, unsigned short c, unsigned long d) +{ + unsigned char b1 = ~0; + unsigned short c1 = ~0; + unsigned long d1 = ~0; + int r = (a == -1) & (b == b1); + int q = (c == c1) & (d == d1); + return r & q; +} + +int bar (int a, unsigned char b, unsigned short c, unsigned long d) +{ + unsigned char b1 = ~0; + unsigned short c1 = ~0; + unsigned long d1 = ~0; + int r = (a != -1) | (b != b1); + int q = (c != c1) | (d != d1); + return r | q; +} + +/* { dg-final { scan-tree-dump-times " == -1" 1 "optimized"} } */ +/* { dg-final { scan-tree-dump-times " != -1" 1 "optimized"} } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ +