From patchwork Tue Jun 27 16:43:57 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Aaron Sawdey X-Patchwork-Id: 781284 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 3wxsGB3bkPz9s5L for ; Wed, 28 Jun 2017 02:44:34 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b="MgotMCV4"; 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 :subject:from:to:cc:date:content-type:mime-version:message-id; q=dns; s=default; b=wj61WqcBTYLcK2UupbDXHXUH7O/w2n+nIhhck2ZJxwI afVSzrl549e71KaS+kKJe5fI+L5pmcBNhvC2mKDr25jY/0/O1+MzizZIOjBGzFt8 eH86wkAa+AOA6i9oUpLvN4JLN+QYZSJeptsKCVbz655QkI18bftTMd9ZJw1kGxqw = 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 :subject:from:to:cc:date:content-type:mime-version:message-id; s=default; bh=5Gb0lwo53V6GJht38LmtubKqTv8=; b=MgotMCV4QT8GNtx8q 0GfEOsqbl6Z0JRX1qNfzikcU86buNop24i1od3VjoLpdZFJTJ2tSHK6u5Lk9Q3eP tO+3DJdEYqSycdld1C3sFN7mD24OplHvbJAQ/qmPomQ5BI6ZQJtK65Ghe1742Uc8 zIeL+K1V2QDVzAjpo4OfhLyMzY= Received: (qmail 106687 invoked by alias); 27 Jun 2017 16:44:23 -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 105994 invoked by uid 89); 27 Jun 2017 16:44:15 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-10.8 required=5.0 tests=BAYES_00, GIT_PATCH_2, GIT_PATCH_3, KAM_ASCII_DIVIDERS, KAM_LAZY_DOMAIN_SECURITY, RCVD_IN_DNSWL_LOW autolearn=ham version=3.3.2 spammy=PLUS, Aaron 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; Tue, 27 Jun 2017 16:44:10 +0000 Received: from pps.filterd (m0098399.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.20/8.16.0.20) with SMTP id v5RGhuaT045825 for ; Tue, 27 Jun 2017 12:44:08 -0400 Received: from e13.ny.us.ibm.com (e13.ny.us.ibm.com [129.33.205.203]) by mx0a-001b2d01.pphosted.com with ESMTP id 2bbs206m1p-1 (version=TLSv1.2 cipher=AES256-SHA bits=256 verify=NOT) for ; Tue, 27 Jun 2017 12:44:07 -0400 Received: from localhost by e13.ny.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Tue, 27 Jun 2017 12:44:06 -0400 Received: from b01cxnp23034.gho.pok.ibm.com (9.57.198.29) by e13.ny.us.ibm.com (146.89.104.200) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Tue, 27 Jun 2017 12:44:04 -0400 Received: from b01ledav005.gho.pok.ibm.com (b01ledav005.gho.pok.ibm.com [9.57.199.110]) by b01cxnp23034.gho.pok.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id v5RGi4X526870000; Tue, 27 Jun 2017 16:44:04 GMT Received: from b01ledav005.gho.pok.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 0E51EAE03B; Tue, 27 Jun 2017 12:44:06 -0400 (EDT) Received: from ragesh3a (unknown [9.85.194.99]) by b01ledav005.gho.pok.ibm.com (Postfix) with ESMTP id 7D71EAE03C; Tue, 27 Jun 2017 12:44:05 -0400 (EDT) Subject: [PATCH rs6000] remove implicit static var outputs of toc_relative_expr_p From: Aaron Sawdey To: gcc-patches@gcc.gnu.org Cc: Segher Boessenkool , David Edelsohn , Bill Schmidt Date: Tue, 27 Jun 2017 11:43:57 -0500 Mime-Version: 1.0 X-TM-AS-GCONF: 00 x-cbid: 17062716-0008-0000-0000-0000024E8F20 X-IBM-SpamModules-Scores: X-IBM-SpamModules-Versions: BY=3.00007286; HX=3.00000241; KW=3.00000007; PH=3.00000004; SC=3.00000214; SDB=6.00879503; UDB=6.00438349; IPR=6.00659657; BA=6.00005445; NDR=6.00000001; ZLA=6.00000005; ZF=6.00000009; ZB=6.00000000; ZP=6.00000000; ZH=6.00000000; ZU=6.00000002; MB=3.00015977; XFM=3.00000015; UTC=2017-06-27 16:44:05 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 17062716-0009-0000-0000-000035D1E5C6 Message-Id: <1498581837.6219.12.camel@linux.vnet.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:, , definitions=2017-06-27_10:, , signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 suspectscore=1 malwarescore=0 phishscore=0 adultscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1703280000 definitions=main-1706270269 X-IsSubscribed: yes So, this is to set things up so I can in a future patch separate out the code that deals with optimizing byte swapping for LE on P8 into a separate file. The function toc_relative_expr_p implicitly sets two static vars (tocrel_base and tocrel_offset) that are declared in rs6000.c. The real purpose of this is to communicate between print_operand/print_operand_address and rs6000_output_addr_const_extra, which is called through the asm_out hook vector by something in the call tree under output_addr_const. This patch changes toc_relative_expr_p to make tocrel_base and tocrel_offset be explicit const_rtx * args. All of the calls other than print_operand/print_operand_address are changed to have local const_rtx vars that are passed in. The statics in rs6000.c are now called tocrel_base_oac and tocrel_offset_oac to reflect their use to communicate across output_addr_const, and that is now the only thing they are used for. Bootstrap and regtest passes in trunk 249639 (to avoid the bootstrap fail), ok for trunk? 2017-06-27  Aaron Sawdey   * config/rs6000/rs6000.c (toc_relative_expr_p): Make tocrel_base and tocrel_offset be pointer args rather than implicitly using static versions. (legitimate_constant_pool_address_p, rs6000_emit_move, const_load_sequence_p, adjust_vperm): Add local tocrel_base and tocrel_offset and use in toc_relative_expr_p call. (print_operand, print_operand_address): Use static tocrel_base_oac and tocrel_offset_oac. (rs6000_output_addr_const_extra): Use static tocrel_base_oac and tocrel_offset_oac. Index: gcc/config/rs6000/rs6000-protos.h =================================================================== --- gcc/config/rs6000/rs6000-protos.h (revision 249639) +++ gcc/config/rs6000/rs6000-protos.h (working copy) @@ -40,7 +40,7 @@ extern int small_data_operand (rtx, machine_mode); extern bool mem_operand_gpr (rtx, machine_mode); extern bool mem_operand_ds_form (rtx, machine_mode); -extern bool toc_relative_expr_p (const_rtx, bool); +extern bool toc_relative_expr_p (const_rtx, bool, const_rtx *, const_rtx *); extern void validate_condition_mode (enum rtx_code, machine_mode); extern bool legitimate_constant_pool_address_p (const_rtx, machine_mode, bool); Index: gcc/config/rs6000/rs6000.c =================================================================== --- gcc/config/rs6000/rs6000.c (revision 249639) +++ gcc/config/rs6000/rs6000.c (working copy) @@ -8628,18 +8628,25 @@ && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (base), Pmode)); } -static const_rtx tocrel_base, tocrel_offset; +/* These are only used to pass through from print_operand/print_operand_address + * to rs6000_output_addr_const_extra over the intervening function + * output_addr_const which is not target code. */ +static const_rtx tocrel_base_oac, tocrel_offset_oac; /* Return true if OP is a toc pointer relative address (the output of create_TOC_reference). If STRICT, do not match non-split - -mcmodel=large/medium toc pointer relative addresses. */ + -mcmodel=large/medium toc pointer relative addresses. Places base + and offset pieces in TOCREL_BASE and TOCREL_OFFSET respectively. */ bool -toc_relative_expr_p (const_rtx op, bool strict) +toc_relative_expr_p (const_rtx op, bool strict, const_rtx *tocrel_base, + const_rtx *tocrel_offset) { if (!TARGET_TOC) return false; + gcc_assert (tocrel_base != NULL && tocrel_offset != NULL); + if (TARGET_CMODEL != CMODEL_SMALL) { /* When strict ensure we have everything tidy. */ @@ -8655,16 +8662,16 @@ op = XEXP (op, 1); } - tocrel_base = op; - tocrel_offset = const0_rtx; + *tocrel_base = op; + *tocrel_offset = const0_rtx; if (GET_CODE (op) == PLUS && add_cint_operand (XEXP (op, 1), GET_MODE (op))) { - tocrel_base = XEXP (op, 0); - tocrel_offset = XEXP (op, 1); + *tocrel_base = XEXP (op, 0); + *tocrel_offset = XEXP (op, 1); } - return (GET_CODE (tocrel_base) == UNSPEC - && XINT (tocrel_base, 1) == UNSPEC_TOCREL); + return (GET_CODE (*tocrel_base) == UNSPEC + && XINT (*tocrel_base, 1) == UNSPEC_TOCREL); } /* Return true if X is a constant pool address, and also for cmodel=medium @@ -8674,7 +8681,8 @@ legitimate_constant_pool_address_p (const_rtx x, machine_mode mode, bool strict) { - return (toc_relative_expr_p (x, strict) + const_rtx tocrel_base, tocrel_offset; + return (toc_relative_expr_p (x, strict, &tocrel_base, &tocrel_offset) && (TARGET_CMODEL != CMODEL_MEDIUM || constant_pool_expr_p (XVECEXP (tocrel_base, 0, 0)) || mode == QImode @@ -11055,6 +11063,7 @@ /* If this is a SYMBOL_REF that refers to a constant pool entry, and we have put it in the TOC, we just need to make a TOC-relative reference to it. */ + const_rtx tocrel_base, tocrel_offset; if (TARGET_TOC && GET_CODE (operands[1]) == SYMBOL_REF && use_toc_relative_ref (operands[1], mode)) @@ -11069,7 +11078,7 @@ > (TARGET_CMODEL != CMODEL_SMALL ? 3 : 2))) || (GET_CODE (operands[0]) == REG && FP_REGNO_P (REGNO (operands[0])))) - && !toc_relative_expr_p (operands[1], false) + && !toc_relative_expr_p (operands[1], false, &tocrel_base, &tocrel_offset) && (TARGET_CMODEL == CMODEL_SMALL || can_create_pseudo_p () || (REG_P (operands[0]) @@ -21812,7 +21821,7 @@ } else { - if (toc_relative_expr_p (x, false)) + if (toc_relative_expr_p (x, false, &tocrel_base_oac, &tocrel_offset_oac)) /* This hack along with a corresponding hack in rs6000_output_addr_const_extra arranges to output addends where the assembler expects to find them. eg. @@ -21819,7 +21828,7 @@ (plus (unspec [(symbol_ref ("x")) (reg 2)] tocrel) 4) without this hack would be output as "x@toc+4". We want "x+4@toc". */ - output_addr_const (file, CONST_CAST_RTX (tocrel_base)); + output_addr_const (file, CONST_CAST_RTX (tocrel_base_oac)); else output_addr_const (file, x); } @@ -21886,7 +21895,7 @@ fprintf (file, "@l(%s)", reg_names[ REGNO (XEXP (x, 0)) ]); } #endif - else if (toc_relative_expr_p (x, false)) + else if (toc_relative_expr_p (x, false, &tocrel_base_oac, &tocrel_offset_oac)) { /* This hack along with a corresponding hack in rs6000_output_addr_const_extra arranges to output addends @@ -21895,17 +21904,17 @@ . (plus (unspec [(symbol_ref ("x")) (reg 2)] tocrel) 8)) without this hack would be output as "x@toc+8@l(9)". We want "x+8@toc@l(9)". */ - output_addr_const (file, CONST_CAST_RTX (tocrel_base)); + output_addr_const (file, CONST_CAST_RTX (tocrel_base_oac)); if (GET_CODE (x) == LO_SUM) fprintf (file, "@l(%s)", reg_names[REGNO (XEXP (x, 0))]); else - fprintf (file, "(%s)", reg_names[REGNO (XVECEXP (tocrel_base, 0, 1))]); + fprintf (file, "(%s)", reg_names[REGNO (XVECEXP (tocrel_base_oac, 0, 1))]); } else gcc_unreachable (); } -/* Implement TARGET_OUTPUT_ADDR_CONST_EXTRA. */ +/* Implement TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA. */ static bool rs6000_output_addr_const_extra (FILE *file, rtx x) @@ -21918,11 +21927,11 @@ && REG_P (XVECEXP (x, 0, 1)) && REGNO (XVECEXP (x, 0, 1)) == TOC_REGISTER); output_addr_const (file, XVECEXP (x, 0, 0)); - if (x == tocrel_base && tocrel_offset != const0_rtx) + if (x == tocrel_base_oac && tocrel_offset_oac != const0_rtx) { - if (INTVAL (tocrel_offset) >= 0) + if (INTVAL (tocrel_offset_oac) >= 0) fprintf (file, "+"); - output_addr_const (file, CONST_CAST_RTX (tocrel_offset)); + output_addr_const (file, CONST_CAST_RTX (tocrel_offset_oac)); } if (!TARGET_AIX || (TARGET_ELF && TARGET_MINIMAL_TOC)) { @@ -39312,6 +39321,8 @@ if (!insn_entry[uid].is_swap || insn_entry[uid].is_load) return false; + const_rtx tocrel_base, tocrel_offset; + /* Find the unique use in the swap and locate its def. If the def isn't unique, punt. */ struct df_insn_info *insn_info = DF_INSN_INFO_GET (insn); @@ -39357,7 +39368,7 @@ rtx tocrel_expr = SET_SRC (tocrel_body); if (GET_CODE (tocrel_expr) == MEM) tocrel_expr = XEXP (tocrel_expr, 0); - if (!toc_relative_expr_p (tocrel_expr, false)) + if (!toc_relative_expr_p (tocrel_expr, false, &tocrel_base, &tocrel_offset)) return false; split_const (XVECEXP (tocrel_base, 0, 0), &base, &offset); if (GET_CODE (base) != SYMBOL_REF || !CONSTANT_POOL_ADDRESS_P (base)) @@ -40118,11 +40129,12 @@ to set tocrel_base; otherwise it would be unnecessary as we've already established it will return true. */ rtx base, offset; + const_rtx tocrel_base, tocrel_offset; rtx tocrel_expr = SET_SRC (PATTERN (tocrel_insn)); /* There is an extra level of indirection for small/large code models. */ if (GET_CODE (tocrel_expr) == MEM) tocrel_expr = XEXP (tocrel_expr, 0); - if (!toc_relative_expr_p (tocrel_expr, false)) + if (!toc_relative_expr_p (tocrel_expr, false, &tocrel_base, &tocrel_offset)) gcc_unreachable (); split_const (XVECEXP (tocrel_base, 0, 0), &base, &offset); rtx const_vector = get_pool_constant (base);