From patchwork Thu Sep 10 14:47:07 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kyrylo Tkachov X-Patchwork-Id: 516309 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 06959140180 for ; Fri, 11 Sep 2015 00:47:22 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b=IH9lnIH5; dkim-atps=neutral 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:cc:subject:references :in-reply-to:content-type; q=dns; s=default; b=jDeGtDm977KvRxXpr xRJX1ADxa21c38nZ8P1mlRCqyWByEEYXZVGsRCAPnnUU36C/GUuRM8lvFsQ/tH4t ADBCbHtl2v5TohyufVJpLGGzon1YlzMuySioNNYVkigH9K+wTcBzmH1nYdXOmGDv td80p/glsTPHmrjwO7PdEqUCn8= 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:cc:subject:references :in-reply-to:content-type; s=default; bh=SFL4cpdkl2PqHiHCvAnDOKx KwQg=; b=IH9lnIH52bjHnVV+2FYwYDk8NwYQ+3Aa6yREO4Nm3RTtwGdXnWhGupY 1FdHuY78d81nSVMsxP+eVK7hLmKuKiXFdXsnBXMemg8OzswytweWxrVP8LXOcwV6 pV1Mr/uhkHsB70zuWyQsC0Tb1uOsoFVOk12WeEqN78xVy/aJXupw= Received: (qmail 70600 invoked by alias); 10 Sep 2015 14:47:16 -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 70588 invoked by uid 89); 10 Sep 2015 14:47:15 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.7 required=5.0 tests=AWL, BAYES_00, SPF_PASS autolearn=ham version=3.3.2 X-HELO: eu-smtp-delivery-143.mimecast.com Received: from eu-smtp-delivery-143.mimecast.com (HELO eu-smtp-delivery-143.mimecast.com) (146.101.78.143) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 10 Sep 2015 14:47:13 +0000 Received: from cam-owa2.Emea.Arm.com (fw-tnat.cambridge.arm.com [217.140.96.140]) by eu-smtp-1.mimecast.com with ESMTP id uk-mta-37-_ZPYmYBpRBmAivlkTRsVdA-1; Thu, 10 Sep 2015 15:47:08 +0100 Received: from [10.2.207.50] ([10.1.2.79]) by cam-owa2.Emea.Arm.com with Microsoft SMTPSVC(6.0.3790.3959); Thu, 10 Sep 2015 15:47:08 +0100 Message-ID: <55F197EB.3010404@arm.com> Date: Thu, 10 Sep 2015 15:47:07 +0100 From: Kyrill Tkachov User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.2.0 MIME-Version: 1.0 To: Rainer Orth CC: GCC Patches , Jeff Law Subject: Re: [PATCH][RTL-ifcvt] PR rtl-optimization/67465: Handle pairs of complex+simple blocks and empty blocks more gracefully References: <55F13D66.9010207@arm.com> In-Reply-To: X-MC-Unique: _ZPYmYBpRBmAivlkTRsVdA-1 X-IsSubscribed: yes On 10/09/15 12:43, Rainer Orth wrote: > Hi Kyrill, > >> Rainer, could you please check that this patch still fixes the SPARC >> regressions? > unfortunately, it breaks sparc-sun-solaris2.10 bootstrap: compiling > stage2 libiberty/regex.c FAILs: > > Thanks for providing the preprocessed file. I've reproduced and fixed the ICE in this version of the patch. The problem was that I was taking the mode of x before the check of whether a and b are MEMs, after which we would change x to an address_mode reg, thus confusing emit_move_insn. The fix is to take the mode of x and perform the can_conditionally_move_p check after that transformation. Bootstrapped and tested on aarch64 and x86_64. The preprocessed regex.i that Rainer provided now compiles successfully for me on a sparc-sun-solaris2.10 stage-1 cross-compiler. Rainer, thanks for your help so far, could you please try out this patch? Thanks, Kyrill 2015-09-10 Kyrylo Tkachov PR rtl-optimization/67456 PR rtl-optimization/67464 PR rtl-optimization/67465 PR rtl-optimization/67481 * ifcvt.c (noce_try_cmove_arith): Bail out if cannot conditionally move in the mode of x. Handle combination of complex and simple block pairs as well as the case when one is empty. 2015-09-10 Kyrylo Tkachov * gcc.dg/pr67465.c: New test. commit 90c12de20cdc8a8a5e81c25accc640ab517a3f7c Author: Kyrylo Tkachov Date: Mon Sep 7 14:58:01 2015 +0100 [RTL-ifcvt] PR rtl-optimization/67465: Do not ifcvt complex blocks if the else block is empty diff --git a/gcc/ifcvt.c b/gcc/ifcvt.c index d2f5b66..e708ac4 100644 --- a/gcc/ifcvt.c +++ b/gcc/ifcvt.c @@ -2043,6 +2043,11 @@ noce_try_cmove_arith (struct noce_if_info *if_info) insn_a = if_info->insn_a; insn_b = if_info->insn_b; + machine_mode x_mode = GET_MODE (x); + + if (!can_conditionally_move_p (x_mode)) + return FALSE; + unsigned int then_cost; unsigned int else_cost; if (insn_a) @@ -2079,13 +2084,32 @@ noce_try_cmove_arith (struct noce_if_info *if_info) } } - if (!a_simple && then_bb && !b_simple && else_bb + if (then_bb && else_bb && !a_simple && !b_simple && (!bbs_ok_for_cmove_arith (then_bb, else_bb) || !bbs_ok_for_cmove_arith (else_bb, then_bb))) return FALSE; start_sequence (); + /* If one of the blocks is empty then the corresponding B or A value + came from the test block. The non-empty complex block that we will + emit might clobber the register used by B or A, so move it to a pseudo + first. */ + + if (b_simple || !else_bb) + { + rtx tmp_b = gen_reg_rtx (x_mode); + noce_emit_move_insn (tmp_b, b); + b = tmp_b; + } + + if (a_simple || !then_bb) + { + rtx tmp_a = gen_reg_rtx (x_mode); + noce_emit_move_insn (tmp_a, a); + a = tmp_a; + } + orig_a = a; orig_b = b; diff --git a/gcc/testsuite/gcc.dg/pr67465.c b/gcc/testsuite/gcc.dg/pr67465.c new file mode 100644 index 0000000..321fd38 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr67465.c @@ -0,0 +1,53 @@ +/* { dg-do run } */ +/* { dg-options "-O3 -std=gnu99" } */ + +int a, b, c, d, e, h; + +int +fn1 (int p1) +{ + { + int g[2]; + for (int i = 0; i < 1; i++) + g[i] = 0; + if (g[0] < c) + { + a = (unsigned) (1 ^ p1) % 2; + return 0; + } + } + return 0; +} + +void +fn2 () +{ + for (h = 0; h < 1; h++) + { + for (int j = 0; j < 2; j++) + { + for (b = 1; b; b = 0) + a = 1; + for (; b < 1; b++) + ; + if (e) + continue; + a = 2; + } + fn1 (h); + short k = -16; + d = k > a; + } +} + +int +main () +{ + fn2 (); + + if (a != 2) + __builtin_abort (); + + return 0; +} +