From patchwork Wed Jul 13 09:00:00 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kai Tietz X-Patchwork-Id: 104494 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 E1F44B6F7A for ; Wed, 13 Jul 2011 19:00:25 +1000 (EST) Received: (qmail 18301 invoked by alias); 13 Jul 2011 09:00:23 -0000 Received: (qmail 18289 invoked by uid 22791); 13 Jul 2011 09:00:22 -0000 X-SWARE-Spam-Status: No, hits=-1.7 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-qy0-f182.google.com (HELO mail-qy0-f182.google.com) (209.85.216.182) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 13 Jul 2011 09:00:01 +0000 Received: by qyk38 with SMTP id 38so3409548qyk.20 for ; Wed, 13 Jul 2011 02:00:00 -0700 (PDT) MIME-Version: 1.0 Received: by 10.229.17.17 with SMTP id q17mr728834qca.154.1310547600643; Wed, 13 Jul 2011 02:00:00 -0700 (PDT) Received: by 10.229.38.195 with HTTP; Wed, 13 Jul 2011 02:00:00 -0700 (PDT) Date: Wed, 13 Jul 2011 11:00:00 +0200 Message-ID: Subject: [patch tree-optimization]: Normalize compares X ==/!= 1 -> X !=/== 0 for truth valued X 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 fixes that for replaced uses, we call fold_stmt_inplace. Additionally it adds to fold_gimple_assign the canonical form for X !=/== 1 -> X ==/!= 0 for X with one-bit precision type. ChangeLog gcc/ 2011-07-13 Kai Tietz * gimple-fold.c (fold_gimple_assign): Add normalization for compares of 1-bit integer precision operands. * tree-ssa-propagate.c (replace_uses_in): Call fold_stmt_inplace on modified statement. ChangeLog gcc/testsuite 2011-07-13 Kai Tietz * gcc.dg/tree-ssa/fold-1.c: New test. Bootstrapped and regression tested for x86_64-pc-linux-gnu. Ok for apply? Regards, Kai Index: gcc/gcc/gimple-fold.c =================================================================== --- gcc.orig/gcc/gimple-fold.c 2011-07-13 10:37:32.000000000 +0200 +++ gcc/gcc/gimple-fold.c 2011-07-13 10:39:05.100843400 +0200 @@ -815,6 +815,17 @@ fold_gimple_assign (gimple_stmt_iterator gimple_assign_rhs2 (stmt)); } + if (!result && (subcode == EQ_EXPR || subcode == NE_EXPR) + && INTEGRAL_TYPE_P (TREE_TYPE (gimple_assign_rhs1 (stmt))) + && TYPE_PRECISION (TREE_TYPE (gimple_assign_rhs1 (stmt))) == 1 + && integer_onep (gimple_assign_rhs2 (stmt))) + result = build2_loc (loc, (subcode == EQ_EXPR ? NE_EXPR : EQ_EXPR), + TREE_TYPE (gimple_assign_lhs (stmt)), + gimple_assign_rhs1 (stmt), + fold_convert_loc (loc, + TREE_TYPE (gimple_assign_rhs1 (stmt)), + integer_zero_node)); + if (!result) result = fold_binary_loc (loc, subcode, TREE_TYPE (gimple_assign_lhs (stmt)), Index: gcc/gcc/testsuite/gcc.dg/tree-ssa/fold-1.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ gcc/gcc/testsuite/gcc.dg/tree-ssa/fold-1.c 2011-07-13 10:50:38.294367800 +0200 @@ -0,0 +1,9 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ + +int foo (_Bool a, _Bool b) +{ + return a != ((b | !b)); +} +/* { dg-final { scan-tree-dump-not " != 1" "optimized" } } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ Index: gcc/gcc/tree-ssa-propagate.c =================================================================== --- gcc.orig/gcc/tree-ssa-propagate.c 2011-07-13 10:37:42.000000000 +0200 +++ gcc/gcc/tree-ssa-propagate.c 2011-07-13 10:40:25.688576800 +0200 @@ -904,6 +904,8 @@ replace_uses_in (gimple stmt, ssa_prop_g propagate_value (use, val); + fold_stmt_inplace (stmt); + replaced = true; }