From patchwork Mon Oct 27 01:53:21 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhenqiang Chen X-Patchwork-Id: 403350 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.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4ECEF14003E for ; Mon, 27 Oct 2014 12:56:14 +1100 (AEDT) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:subject:date:message-id:mime-version:content-type :content-transfer-encoding; q=dns; s=default; b=fW7MdsInycV2JirS tNPonGVperQBLNIPix0Pd0efH/Nh9VcxNdnintfrIq81guPKyvY/qA6RT2uxXEmL 0XsN55jIBR80wgXe0dDypkqvKPlV6viJbDQIXQcr2u0DsjJ6EKbtQ3RE9oDVy8h6 dizxFAH2mNYCl83CzyzrrCEmP+4= 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:from :to:subject:date:message-id:mime-version:content-type :content-transfer-encoding; s=default; bh=AQEsEF35m2XIRQe892c/XQ yG8LQ=; b=ElyFOz8A+EJxeh/PpN86nGyQcwoslsWnRAb0/sWaXK66Cmkv6cmBXp HwXect/L3pCC0LdBLV1WGXnKT1+Rs/xmSJjfAugwcGOLJSCswdRkW8xGHcAo0sur HwX466W3cbcKD5P2d5J2StF4r1DxZaj2JmAb4VYPLYV2ENO4NsBBU= Received: (qmail 17975 invoked by alias); 27 Oct 2014 01:56:04 -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 5230 invoked by uid 89); 27 Oct 2014 01:54:02 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.8 required=5.0 tests=AWL, BAYES_00, SPF_PASS autolearn=ham version=3.3.2 X-HELO: service87.mimecast.com Received: from service87.mimecast.com (HELO service87.mimecast.com) (91.220.42.44) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 27 Oct 2014 01:53:59 +0000 Received: from cam-owa1.Emea.Arm.com (fw-tnat.cambridge.arm.com [217.140.96.21]) by service87.mimecast.com; Mon, 27 Oct 2014 01:53:56 +0000 Received: from shawin003 ([10.164.2.30]) by cam-owa1.Emea.Arm.com with Microsoft SMTPSVC(6.0.3790.3959); Mon, 27 Oct 2014 01:53:56 +0000 From: "Zhenqiang Chen" To: Subject: [PATCH, ifcvt] Check size cost in noce_try_store_flag_mask Date: Mon, 27 Oct 2014 09:53:21 +0800 Message-ID: <000001cff188$ca24cf50$5e6e6df0$@arm.com> MIME-Version: 1.0 X-MC-Unique: 114102701535600201 X-IsSubscribed: yes Hi, Function noce_try_store_flag_mask converts "if (test) x = 0;" to "x &= -(test == 0);" But from code size view, "x &= -(test == 0);" might have more instructions than "if (test) x = 0;". The patch checks the cost to determine the conversion is valuable or not. Bootstrap and no make check regression on X86-64. No make check regression with Cortex-M0 qemu. For CSiBE, ARM Cortex-m0 result is a little better. A little regression for MIPS. Roughly no change for PowerPC. OK for trunk? Thanks! -Zhenqiang ChangeLog: 2014-10-27 Zhenqiang Chen * ifcvt.c (noce_try_store_flag_mask): Check rtx cost. testsuite/ChangeLog: 2014-10-27 Zhenqiang Chen * gcc.target/arm/ifcvt-size-check.c: New test. diff --git a/gcc/ifcvt.c b/gcc/ifcvt.c index 949d2b4..3abd518 100644 --- a/gcc/ifcvt.c +++ b/gcc/ifcvt.c @@ -1393,6 +1393,14 @@ noce_try_store_flag_mask (struct noce_if_info *if_info) if (!seq) return FALSE; + if (optimize_function_for_size_p (cfun)) + { + int old_cost = COSTS_N_INSNS (if_info->branch_cost + 1); + int new_cost = seq_cost (seq, 0); + if (new_cost > old_cost) + return FALSE; + } + emit_insn_before_setloc (seq, if_info->jump, INSN_LOCATION (if_info->insn_a)); return TRUE; diff --git a/gcc/testsuite/gcc.target/arm/ifcvt-size-check.c b/gcc/testsuite/gcc.target/arm/ifcvt-size-check.c new file mode 100644 index 0000000..43fa16b --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/ifcvt-size-check.c @@ -0,0 +1,13 @@ +/* { dg-do assemble } */ +/* { dg-options "-mthumb -Os " } */ +/* { dg-require-effective-target arm_thumb1_ok } */ + +int +test (unsigned char iov_len, int count, int i) +{ + unsigned char bytes = 0; + if ((unsigned char) ((char) 127 - bytes) < iov_len) + return 22; + return 0; +} +/* { dg-final { object-size text <= 12 } } */