From patchwork Fri Aug 5 04:50:40 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alan Modra X-Patchwork-Id: 656026 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 3s5DsR1627z9sdg for ; Fri, 5 Aug 2016 14:51:06 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b=HkqvrB6+; 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:date :from:to:cc:subject:message-id:mime-version:content-type; q=dns; s=default; b=xsg/628oJ0L1kmRcScRL0AQA4057hBiRvQZY+CD3yJbkcpGixy fCudP2lNUcJgdEG0guOX4Jw2FwZqut+NRXHvD4CcYe9k7LxemNMxvxD0sPy+77Vn mJsJWpdqL9c3FzclJvjgB/qTOJQ+YZ9HOx1jVvm/cx8+lgGId+71Z005g= 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:date :from:to:cc:subject:message-id:mime-version:content-type; s= default; bh=npggQzt8A3j8/m8Gtd71ak+bE/I=; b=HkqvrB6+k1hw9C0nMmaT 1Q/PmuZF/msgc/PixAYkrvtAMB778mY19qboNBsI/vEfpUSxDOdTf82m0VPRwOG1 zaf1c35pMSs1W6c1OeesAPN7Hy5kooejrovob65aIQIwLDwqZxpNX2YOy8NF4ihc jx4ZC/5irVY+GnVH3+3mZhk= Received: (qmail 1543 invoked by alias); 5 Aug 2016 04:50:58 -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 1523 invoked by uid 89); 5 Aug 2016 04:50:57 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.5 required=5.0 tests=AWL, BAYES_00, FREEMAIL_FROM, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 spammy=mr X-HELO: mail-pf0-f194.google.com Received: from mail-pf0-f194.google.com (HELO mail-pf0-f194.google.com) (209.85.192.194) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Fri, 05 Aug 2016 04:50:47 +0000 Received: by mail-pf0-f194.google.com with SMTP id i6so19483356pfe.0 for ; Thu, 04 Aug 2016 21:50:47 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:date:from:to:cc:subject:message-id:mime-version :content-disposition:user-agent; bh=GrfJGS5+tbRJyQr8VSBGXnoFJoZGVhc0Cn2d7y8FoQc=; b=eBeM8nFcleoK8TwrIu+1sUp31iy7JlsVimvQ+hGF8BepVKPYAPgRgPDi/rVcE02fJY Ra0TRxIeUqjXp/SDFIpHKO+kDxpiUOg49Gf/w3CxPBrPKuJ8WiHt3HxDuAj3qr6jW9Ch jlUHlN5o+bBXQC58wVAFxdavQfds1E0F3WbduzS0lOrmCI17IqBInFY1+0Aw/J2oNTpo Cb9demUWA7u0+SOf7X7W/yd66OlW4sXzxmWg9yf7ewg2KZ7vh/MKGxF93bABykD1tR3a zLehmWrdgKsVE/GwdNZ4OLvFToZoTQiCQqSblTlSVvnkYexDZmv/5ETl4w3O7TH68KsG 1I4w== X-Gm-Message-State: AEkoouuhz2ny9izH1fNc8s+Oa8VRNBeEFWCKUHq6p/N4i60Vl7dl0mT2axUNyMoyUNThgg== X-Received: by 10.98.63.154 with SMTP id z26mr132686042pfj.41.1470372645555; Thu, 04 Aug 2016 21:50:45 -0700 (PDT) Received: from bubble.grove.modra.org (CPE-58-160-146-233.sa.bigpond.net.au. [58.160.146.233]) by smtp.gmail.com with ESMTPSA id p64sm23967009pfd.11.2016.08.04.21.50.44 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 04 Aug 2016 21:50:44 -0700 (PDT) Received: by bubble.grove.modra.org (Postfix, from userid 1000) id D0ED5C17FE; Fri, 5 Aug 2016 14:20:40 +0930 (ACST) Date: Fri, 5 Aug 2016 14:20:40 +0930 From: Alan Modra To: gcc-patches@gcc.gnu.org Cc: Segher Boessenkool Subject: [RS6000] PR72802 part 2, reload ICE Message-ID: <20160805045040.GN20904@bubble.grove.modra.org> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.5.24 (2015-08-30) X-IsSubscribed: yes After fixing the constraint problem, we hit an "insn does not satisfy its constraints" with -mno-lra on the following insn, a vector load from mem which has an invalid offset: (insn 631 630 1122 12 (set (reg:SF 108 31 [orig:260 pretmp_44 ] [260]) (mem:SF (plus:DI (reg:DI 30 30 [orig:338 ivtmp.141 ] [338]) (const_int 2 [0x2])) [5 MEM[base: _1, offset: 2B]+0 S4 A32])) 470 {movsf_hardfloat} (nil)) Here are the reload costs for the various alternatives of movsf_hardfloat: "=!r, !r, m, f, ww, ww, !r, f, wb, m, wY, wu, Z,?wn, ?r,*c*l, !r, *h" "r, m, r, f, ww, j, j, m, wY, f, wb, Z, wu, r, wn, r, *h, 0" 617 609 17 17 8 8 617 9 8 17 17 8 17 23 23 17 617 17 Notice that the cost for a vector<-vector move (ww,ww) is the same as the cost for a vector<-mem move (wb,wY or wu,Z). Since the vector<-vector move comes first, it is chosen and the mem part of the insn reloaded. That just gives another copy of insn 631. Bootstrapped and regression tested powerpc64le-linux. powerpc64-linux regression tests still in progress. OK assuming all goes well? Segher, this one differs from the previous attempt (that regressed gcc.target/powerpc/sd-pwr6.c and gcc.target/powerpc/pr39902-2.c), in that the r,m and m,r alternatives are before other mem alternatives. Ordered the other way we get no progress on trying to do secondary mem reloads. PR target/72802 * config/rs6000/rs6000.md (mov_hardflow): Sort alternatives. Put reg/reg moves within same class last, same class loads before stores. Delete attr length. testsuite/ * gcc.c-torture/compile/pr72802.c: New. diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md index f4c00d2..e52f759 100644 --- a/gcc/config/rs6000/rs6000.md +++ b/gcc/config/rs6000/rs6000.md @@ -6689,32 +6689,37 @@ }") (define_insn "mov_hardfloat" - [(set (match_operand:FMOVE32 0 "nonimmediate_operand" "=!r,!r,m,f,,,!r,,,,,,Z,?,?r,*c*l,!r,*h") - (match_operand:FMOVE32 1 "input_operand" "r,m,r,f,,,,,,,,Z,,r,,r,h,0"))] + [(set (match_operand:FMOVE32 0 "nonimmediate_operand" + "=, !r, !r, m, , , + , , , Z, ?, ?r, + *c*l, !r, f, , !r, *h") + (match_operand:FMOVE32 1 "input_operand" + ", , m, r, , , + Z, , , , r, , + r, *h, f, , r, 0"))] "(gpc_reg_operand (operands[0], mode) || gpc_reg_operand (operands[1], mode)) && (TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_SINGLE_FLOAT)" "@ - mr %0,%1 - lwz%U1%X1 %0,%1 - stw%U0%X0 %1,%0 - fmr %0,%1 - xscpsgndp %x0,%x1,%x1 xxlxor %x0,%x0,%x0 li %0,0 + lwz%U1%X1 %0,%1 + stw%U0%X0 %1,%0 + - mtvsrwz %x0,%1 mfvsrwz %0,%x1 mt%0 %1 mf%1 %0 + fmr %0,%1 + xscpsgndp %x0,%x1,%x1 + mr %0,%1 nop" - [(set_attr "type" "*,load,store,fpsimple,fpsimple,veclogical,integer,fpload,fpload,fpstore,fpstore,fpload,fpstore,mffgpr,mftgpr,mtjmpr,mfjmpr,*") - (set_attr "length" "4")]) + [(set_attr "type" "veclogical,integer,load,store,fpload,fpload,fpload,fpstore,fpstore,fpstore,mffgpr,mftgpr,mtjmpr,mfjmpr,fpsimple,fpsimple,*,*")]) (define_insn "*mov_softfloat" [(set (match_operand:FMOVE32 0 "nonimmediate_operand" "=r,cl,r,r,m,r,r,r,r,*h") diff --git a/gcc/testsuite/gcc.c-torture/compile/pr72802.c b/gcc/testsuite/gcc.c-torture/compile/pr72802.c new file mode 100644 index 0000000..b9e1ab3 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr72802.c @@ -0,0 +1,211 @@ +static a[]; +static b, h, m, n, o, p, q, t, u, v, t5, t6, t16, t17, t18, t25; +c; +static volatile d; +static volatile e; +static volatile f; +static volatile g; +j; +static volatile k; +static volatile l; +static volatile r; +const volatile s; +static volatile w; +static volatile x; +const volatile y; +static volatile z; +static volatile t1; +static volatile t2; +const t3; +t4; +const volatile t8; +const volatile t9; +const volatile t10; +static volatile t11; +static volatile t12; +static volatile t13; +static volatile t14; +const volatile t15; +static volatile t19; +static volatile t20; +const volatile t21; +static volatile t22; +static volatile t23; +const volatile t24; +*t29; +fn1() { b = 5; } +fn2(long); +#pragma pack(1) +struct S0 { + short f3; + float f4; + signed f5 +}; +const struct S0 t7[] = {}; +static fn3() { + int t26[] = {}; + int t27[10] = {}; + --t25; + if (fn4()) { + t5++; + fn5(); + int t28[] = {t26, t27}; + return; + } +} +fn6() { + int i, t30 = 0; + if (fn6 == 2) + t30 = 1; + { + int t31, i = 0; + for (; i < 256; i++) { + t31 = i; + if (i & 1) + t31 = 0; + a[i] = t31; + } + i = 0; + for (; i < 3; i++) + t29[i] = t6; + fn7(); + fn3(); + t4 = c = j = 0; + } + fn2(h); + if (t30) + printf(b); + g; + fn2(g); + printf(b); + f; + fn2(f); + if (t30) + printf(b); + e; + fn2(e); + printf(b); + fn8(); + d; + fn2(d); + if (t30) + printf(b); + l; + fn2(l); + printf(b); + k; + fn2(k); + if (t30) + printf(b); + printf(b); + for (; i; i++) { + y; + fn2(y); + printf(b); + x; + fn2(x); + if (t30) + printf(b); + w; + fn2(w); + printf(b); + fn2(v); + printf(b); + fn2(u); + if (t30) + printf(b); + fn2(t); + printf(b); + s; + fn2(s); + if (t30) + printf(b); + r; + fn2(r); + printf(b); + fn2(q); + if (t30) + printf(b); + fn2(p); + printf("", b); + fn2(o); + printf(b); + fn2(n); + if (t30) + printf(b); + fn2(m); + printf(b); + } + fn2(z); + if (t30) + printf(b); + printf("", t3); + t2; + fn2(t2); + printf(b); + t1; + fn2(t1); + if (t30) + printf(b); + for (; i < 6; i++) { + t10; + fn2(t10); + printf(b); + t9; + fn2(t9); + if (t30) + printf(b); + t8; + fn2(t8); + printf(b); + fn2(t7[i].f3); + if (t30) + printf(b); + fn2(t7[i].f4); + printf(b); + fn2(t7[i].f5); + if (t30) + printf(b); + t15; + fn2(t15); + printf(b); + t14; + fn2(t14); + if (t30) + printf(b); + t13; + fn2(t13); + printf(b); + t12; + fn2(t12); + if (t30) + printf(b); + t11; + fn2(t11); + printf(b); + t21; + fn2(t21); + if (t30) + printf(b); + t20; + fn2(t20); + fn2(t19); + if (t30) + printf(b); + fn2(t18); + printf(b); + fn2(t17); + printf(b); + fn2(t16); + printf(b); + } + t24; + t24; + if (t30) + printf(b); + printf(t23); + t22; + t22; + if (t30) + printf(b); +}