From patchwork Thu Oct 25 14:00:29 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ilya Leoshkevich X-Patchwork-Id: 989087 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=gcc.gnu.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=gcc-patches-return-488290-incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=linux.ibm.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b="KxMR+lDv"; dkim-atps=neutral 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 42gph14swLz9sDC for ; Fri, 26 Oct 2018 01:01:21 +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:cc:subject:date:mime-version:content-transfer-encoding :message-id; q=dns; s=default; b=fbw62zDR6Znt1+a1xjmideLBw/Aa747 NtefH4XmOZ1Va7cwCkL1nDdk97ziUXX7Vn6KEkJHEwukJ8MxeHtmY/GTsYEPR88T tfv97mZ9ZRF7Mi7NuRTpt7YJESwTl2qP22M4KMDYHhz504qsmHH5RCzvXsOLAYt3 cDHWTEZITV6Y= 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:cc:subject:date:mime-version:content-transfer-encoding :message-id; s=default; bh=bNo95byhw/shrRX+5QNMDo6zTBw=; b=KxMR+ lDvUHyNmGCjBMGYTZQ5dxj54VMZ/EGDCA7jDyg9s7NBfEEH1AyyHrJnen6QZBCZW WIMF6jFS3o8BJWe+j/wxohwT/dENkhfJhQSO7+66SXqZw15O7rETw9ctDM0VqUvK ACmF9yDatrMWNLsiZdERoyMe2Ph8Extr3axb+8= Received: (qmail 21048 invoked by alias); 25 Oct 2018 14:01:12 -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 21011 invoked by uid 89); 25 Oct 2018 14:01:10 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-24.4 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_NUMSUBJECT, KHOP_DYNAMIC, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 spammy=*******, sk:legitim, ril, H*Ad:D*de.ibm.com X-HELO: mx0a-001b2d01.pphosted.com Received: from mx0a-001b2d01.pphosted.com (HELO mx0a-001b2d01.pphosted.com) (148.163.156.1) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 25 Oct 2018 14:01:03 +0000 Received: from pps.filterd (m0098404.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.22/8.16.0.22) with SMTP id w9PDxrEA003717 for ; Thu, 25 Oct 2018 10:01:01 -0400 Received: from e06smtp01.uk.ibm.com (e06smtp01.uk.ibm.com [195.75.94.97]) by mx0a-001b2d01.pphosted.com with ESMTP id 2nbf128nww-1 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=NOT) for ; Thu, 25 Oct 2018 10:01:00 -0400 Received: from localhost by e06smtp01.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Thu, 25 Oct 2018 15:00:56 +0100 Received: from b06cxnps3075.portsmouth.uk.ibm.com (9.149.109.195) by e06smtp01.uk.ibm.com (192.168.101.131) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; (version=TLSv1/SSLv3 cipher=AES256-GCM-SHA384 bits=256/256) Thu, 25 Oct 2018 15:00:53 +0100 Received: from d06av25.portsmouth.uk.ibm.com (d06av25.portsmouth.uk.ibm.com [9.149.105.61]) by b06cxnps3075.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id w9PE0pN536110406 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Thu, 25 Oct 2018 14:00:51 GMT Received: from d06av25.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 4C1DB11C064; Thu, 25 Oct 2018 14:00:51 +0000 (GMT) Received: from d06av25.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 186DD11C04A; Thu, 25 Oct 2018 14:00:51 +0000 (GMT) Received: from white.boeblingen.de.ibm.com (unknown [9.152.96.202]) by d06av25.portsmouth.uk.ibm.com (Postfix) with ESMTP; Thu, 25 Oct 2018 14:00:51 +0000 (GMT) From: Ilya Leoshkevich To: gcc-patches@gcc.gnu.org Cc: krebbel@linux.ibm.com, rdapp@linux.ibm.com, uweigand@de.ibm.com, Ilya Leoshkevich Subject: [PATCH] S/390: Merge movdi_larl into movdi_64 Date: Thu, 25 Oct 2018 16:00:29 +0200 MIME-Version: 1.0 x-cbid: 18102514-4275-0000-0000-000002D3A362 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 18102514-4276-0000-0000-000037DFB31E Message-Id: <20181025140029.39217-1-iii@linux.ibm.com> X-IsSubscribed: yes Bootstrapped and regtested on s390x-redhat-linux. Consider the following RTL: (insn (set (mem/f/c:DI (reg/f:DI 60)) (const:DI (plus:DI (symbol_ref:DI ("*.LANCHOR0")) (const_int 8))))) generated by cse2 pass. It is matched to movdi_64, resulting in the following inefficient code: larl %r5,.L6 # Load literal pool@ lg %r1,.L7-.L6(%r5) # Load .LANCHOR0+8 stgrl %r1,.LANCHOR0 br %r14 Matching it to movdi_larl improves the code, eliminating one instruction and the literal pool entry: larl %r1,.LANCHOR0+8 stgrl %r1,.LANCHOR0 br %r14 Taking it one step further, there is no reason to keep movdi_64 and movdi_larl separate, since this could potentially improve code in other ways by giving lra one more alternative to choose from. gcc/ChangeLog: 2018-10-22 Ilya Leoshkevich * config/s390/constraints.md (ZL): New constraint. * config/s390/s390.c (legitimate_pic_operand_p): Accept LARL operands. * config/s390/s390.md (movdi_larl): Remove. (movdi_64): Add the LARL alternative. gcc/testsuite/ChangeLog: 2018-10-25 Ilya Leoshkevich * gcc.target/s390/global-array-almost-huge-element.c: New test. * gcc.target/s390/global-array-almost-negative-huge-element.c: New test. * gcc.target/s390/global-array-element-pic.c: New test. * gcc.target/s390/global-array-even-element.c: New test. * gcc.target/s390/global-array-huge-element.c: New test. * gcc.target/s390/global-array-negative-huge-element.c: New test. * gcc.target/s390/global-array-odd-element.c: New test. --- gcc/config/s390/constraints.md | 5 ++++ gcc/config/s390/s390.c | 4 +++ gcc/config/s390/s390.md | 27 +++++++------------ .../s390/global-array-almost-huge-element.c | 12 +++++++++ ...lobal-array-almost-negative-huge-element.c | 12 +++++++++ .../s390/global-array-element-pic.c | 13 +++++++++ .../s390/global-array-even-element.c | 12 +++++++++ .../s390/global-array-huge-element.c | 12 +++++++++ .../s390/global-array-negative-huge-element.c | 12 +++++++++ .../s390/global-array-odd-element.c | 12 +++++++++ 10 files changed, 104 insertions(+), 17 deletions(-) create mode 100644 gcc/testsuite/gcc.target/s390/global-array-almost-huge-element.c create mode 100644 gcc/testsuite/gcc.target/s390/global-array-almost-negative-huge-element.c create mode 100644 gcc/testsuite/gcc.target/s390/global-array-element-pic.c create mode 100644 gcc/testsuite/gcc.target/s390/global-array-even-element.c create mode 100644 gcc/testsuite/gcc.target/s390/global-array-huge-element.c create mode 100644 gcc/testsuite/gcc.target/s390/global-array-negative-huge-element.c create mode 100644 gcc/testsuite/gcc.target/s390/global-array-odd-element.c diff --git a/gcc/config/s390/constraints.md b/gcc/config/s390/constraints.md index b8ba8510096..63c7fd368be 100644 --- a/gcc/config/s390/constraints.md +++ b/gcc/config/s390/constraints.md @@ -89,6 +89,7 @@ ;; ZR -- Pointer with index register and short displacement. ;; ZS -- Pointer without index register but with long displacement. ;; ZT -- Pointer with index register and long displacement. +;; ZL -- LARL operand when in 64-bit mode, otherwise nothing. ;; ;; @@ -562,3 +563,7 @@ (define_address_constraint "ZT" "Pointer with index register and long displacement." (match_test "s390_mem_constraint (\"ZT\", op)")) + +(define_constraint "ZL" + "LARL operand when in 64-bit mode, otherwise nothing." + (match_test "TARGET_64BIT && larl_operand (op, VOIDmode)")) diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c index 6d18a034030..29a829f48ea 100644 --- a/gcc/config/s390/s390.c +++ b/gcc/config/s390/s390.c @@ -3859,6 +3859,10 @@ legitimate_pic_operand_p (rtx op) if (!SYMBOLIC_CONST (op)) return 1; + /* Accept addresses that can be expressed relative to (pc). */ + if (larl_operand (op, VOIDmode)) + return 1; + /* Reject everything else; must be handled via emit_symbolic_move. */ return 0; diff --git a/gcc/config/s390/s390.md b/gcc/config/s390/s390.md index 3bd18acb456..e4049c25406 100644 --- a/gcc/config/s390/s390.md +++ b/gcc/config/s390/s390.md @@ -1729,21 +1729,11 @@ emit_symbolic_move (operands); }) -(define_insn "*movdi_larl" - [(set (match_operand:DI 0 "register_operand" "=d") - (match_operand:DI 1 "larl_operand" "X"))] - "TARGET_64BIT - && !FP_REG_P (operands[0])" - "larl\t%0,%1" - [(set_attr "op_type" "RIL") - (set_attr "type" "larl") - (set_attr "z10prop" "z10_super_A1")]) - (define_insn "*movdi_64" [(set (match_operand:DI 0 "nonimmediate_operand" - "=d, d, d, d, d, d, d, d,f,d,d,d,d,d,T,!*f,!*f,!*f,!R,!T,b,Q,d,t,Q,t,v,v,v,d,v,R") + "=d, d, d, d, d, d, d, d,f,d,d,d,d,d,T,!*f,!*f,!*f,!R,!T,b,Q,d,t,Q,t,v,v,v,d,v,R,d") (match_operand:DI 1 "general_operand" - " K,N0HD0,N1HD0,N2HD0,N3HD0,Os,N0SD0,N1SD0,d,f,L,b,d,T,d, *f, R, T,*f,*f,d,K,t,d,t,Q,K,v,d,v,R,v"))] + " K,N0HD0,N1HD0,N2HD0,N3HD0,Os,N0SD0,N1SD0,d,f,L,b,d,T,d, *f, R, T,*f,*f,d,K,t,d,t,Q,K,v,d,v,R,v,ZL"))] "TARGET_ZARCH" "@ lghi\t%0,%h1 @@ -1777,15 +1767,17 @@ vlvgg\t%v0,%1,0 vlgvg\t%0,%v1,0 vleg\t%v0,%1,0 - vsteg\t%v1,%0,0" + vsteg\t%v1,%0,0 + larl\t%0,%1" [(set_attr "op_type" "RI,RI,RI,RI,RI,RIL,RIL,RIL,RRE,RRE,RXY,RIL,RRE,RXY, - RXY,RR,RX,RXY,RX,RXY,RIL,SIL,*,*,RS,RS,VRI,VRR,VRS,VRS,VRX,VRX") + RXY,RR,RX,RXY,RX,RXY,RIL,SIL,*,*,RS,RS,VRI,VRR,VRS,VRS, + VRX,VRX,RIL") (set_attr "type" "*,*,*,*,*,*,*,*,floaddf,floaddf,la,larl,lr,load,store, floaddf,floaddf,floaddf,fstoredf,fstoredf,larl,*,*,*,*, - *,*,*,*,*,*,*") + *,*,*,*,*,*,*,larl") (set_attr "cpu_facility" "*,*,*,*,*,extimm,extimm,extimm,dfp,dfp,longdisp, z10,*,*,*,*,*,longdisp,*,longdisp, - z10,z10,*,*,*,*,vx,vx,vx,vx,vx,vx") + z10,z10,*,*,*,*,vx,vx,vx,vx,vx,vx,*") (set_attr "z10prop" "z10_fwd_A1, z10_fwd_E1, z10_fwd_E1, @@ -1811,7 +1803,8 @@ *, *, *, - *,*,*,*,*,*,*") + *,*,*,*,*,*,*, + z10_super_A1") ]) (define_split diff --git a/gcc/testsuite/gcc.target/s390/global-array-almost-huge-element.c b/gcc/testsuite/gcc.target/s390/global-array-almost-huge-element.c new file mode 100644 index 00000000000..28e4ccd9bdd --- /dev/null +++ b/gcc/testsuite/gcc.target/s390/global-array-almost-huge-element.c @@ -0,0 +1,12 @@ +/* Test the maximum possible LARL offset. */ +/* { dg-do compile } */ +/* { dg-options "-O1" } */ + +extern char a[] __attribute__ ((aligned (2))); +extern char *b; + +void almost_huge() +{ + b = a + 0x7ffffffeULL; + /* { dg-final { scan-assembler {(?n)\n\tlarl\t%r\d+,a\+2147483646\n} } } */ +} diff --git a/gcc/testsuite/gcc.target/s390/global-array-almost-negative-huge-element.c b/gcc/testsuite/gcc.target/s390/global-array-almost-negative-huge-element.c new file mode 100644 index 00000000000..0012ceb8d49 --- /dev/null +++ b/gcc/testsuite/gcc.target/s390/global-array-almost-negative-huge-element.c @@ -0,0 +1,12 @@ +/* Test the minimum LARL offset. */ +/* { dg-do compile } */ +/* { dg-options "-O1" } */ + +extern char a[] __attribute__ ((aligned (2))); +extern char *b; + +void almost_negative_huge() +{ + b = a - 0x80000000ULL; + /* { dg-final { scan-assembler {(?n)\n\tlarl\t%r\d+,a-2147483648\n} } } */ +} diff --git a/gcc/testsuite/gcc.target/s390/global-array-element-pic.c b/gcc/testsuite/gcc.target/s390/global-array-element-pic.c new file mode 100644 index 00000000000..78721206151 --- /dev/null +++ b/gcc/testsuite/gcc.target/s390/global-array-element-pic.c @@ -0,0 +1,13 @@ +/* Test accesses to global array elements in PIC code. */ +/* { dg-do compile } */ +/* { dg-options "-O1 -fPIC" } */ + +extern char a[] __attribute__ ((aligned (2))); +extern char *b; + +void c() +{ + b = a + 4; + /* { dg-final { scan-assembler {(?n)\n\tlarl\t%r\d+,a@GOTENT\n} } } */ + /* { dg-final { scan-assembler-not {(?n)\n\tlarl\t%r\d+,a[^@]} } } */ +} diff --git a/gcc/testsuite/gcc.target/s390/global-array-even-element.c b/gcc/testsuite/gcc.target/s390/global-array-even-element.c new file mode 100644 index 00000000000..5737f7e3496 --- /dev/null +++ b/gcc/testsuite/gcc.target/s390/global-array-even-element.c @@ -0,0 +1,12 @@ +/* Test accesses to even global array elements. */ +/* { dg-do compile } */ +/* { dg-options "-O1" } */ + +extern char a[] __attribute__ ((aligned (2))); +extern char *b; + +void even() +{ + b = a + 4; + /* { dg-final { scan-assembler {(?n)\n\tlarl\t%r\d+,a\+4\n} } } */ +} diff --git a/gcc/testsuite/gcc.target/s390/global-array-huge-element.c b/gcc/testsuite/gcc.target/s390/global-array-huge-element.c new file mode 100644 index 00000000000..d4aad5764fd --- /dev/null +++ b/gcc/testsuite/gcc.target/s390/global-array-huge-element.c @@ -0,0 +1,12 @@ +/* Test minimum invalid LARL offset. */ +/* { dg-do compile } */ +/* { dg-options "-O1" } */ + +extern char a[] __attribute__ ((aligned (2))); +extern char *b; + +void huge() +{ + b = a + 0x80000000ULL; + /* { dg-final { scan-assembler-not {(?n)\n\tlarl\t%r\d+,a} } } */ +} diff --git a/gcc/testsuite/gcc.target/s390/global-array-negative-huge-element.c b/gcc/testsuite/gcc.target/s390/global-array-negative-huge-element.c new file mode 100644 index 00000000000..bd72d01a53b --- /dev/null +++ b/gcc/testsuite/gcc.target/s390/global-array-negative-huge-element.c @@ -0,0 +1,12 @@ +/* Test maximum invalid LARL offset. */ +/* { dg-do compile } */ +/* { dg-options "-O1" } */ + +extern char a[] __attribute__ ((aligned (2))); +extern char *b; + +void negative_huge() +{ + b = a - 0x80000004ULL; + /* { dg-final { scan-assembler-not {(?n)\n\tlarl\t%r\d+,a} } } */ +} diff --git a/gcc/testsuite/gcc.target/s390/global-array-odd-element.c b/gcc/testsuite/gcc.target/s390/global-array-odd-element.c new file mode 100644 index 00000000000..84a65e55626 --- /dev/null +++ b/gcc/testsuite/gcc.target/s390/global-array-odd-element.c @@ -0,0 +1,12 @@ +/* Test accesses to odd global array elements. */ +/* { dg-do compile } */ +/* { dg-options "-O1" } */ + +extern char a[] __attribute__ ((aligned (2))); +extern char *b; + +void odd() +{ + b = a + 1; + /* { dg-final { scan-assembler-not {(?n)\n\tlarl\t%r\d+,a} } } */ +}