From patchwork Fri Nov 27 14:24:15 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nathan Sidwell X-Patchwork-Id: 549475 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 B40B3140319 for ; Sat, 28 Nov 2015 01:24:42 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b=Gky/EosZ; 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:to :from:subject:message-id:date:mime-version:content-type; q=dns; s=default; b=NkICzyrx3PBbR3g0q6oxX+CPjb93pt5+JNC3AvAhhQKz1mLC5x wod+TrA8c+hO0KktdrhwFjzkzq0C1TDReOg0IZNdwZdgPxDGnz8jma6VLD98hheW XmU7WGd/CplICqJT2Q7zyDenWdC9lgC0e03SC/fJhKmyHL3M59To2fZTI= 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:to :from:subject:message-id:date:mime-version:content-type; s= default; bh=SaNnYormr0T6FVXkxXgTujn2nEY=; b=Gky/EosZwFX0gieHHoes h/iWIN3xiKDexMHkj7EfVkTkunzLqrM/+TaK2wEG29J+Y1D4CfVT7HBVdr1paBv/ CBI8qHWmwZilcIe/LCMGM8rp1EFf1uiR4tdyqHhnsI6MQf62AJ3u9MTsYdFyL7oD oHxCPVp72UruSI4Lzn5g2UM= Received: (qmail 116164 invoked by alias); 27 Nov 2015 14:24:24 -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 116096 invoked by uid 89); 27 Nov 2015 14:24:20 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=1.6 required=5.0 tests=BAYES_20, FREEMAIL_FROM, KAM_ASCII_DIVIDERS, KAM_STOCKGEN, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=no version=3.3.2 X-HELO: mail-qk0-f170.google.com Received: from mail-qk0-f170.google.com (HELO mail-qk0-f170.google.com) (209.85.220.170) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Fri, 27 Nov 2015 14:24:19 +0000 Received: by qkda6 with SMTP id a6so36658896qkd.3 for ; Fri, 27 Nov 2015 06:24:17 -0800 (PST) X-Received: by 10.55.214.83 with SMTP id t80mr54251047qki.98.1448634257236; Fri, 27 Nov 2015 06:24:17 -0800 (PST) Received: from ?IPv6:2601:181:c000:c497:a2a8:cdff:fe3e:b48? ([2601:181:c000:c497:a2a8:cdff:fe3e:b48]) by smtp.googlemail.com with ESMTPSA id a64sm9471356qka.47.2015.11.27.06.24.16 (version=TLSv1/SSLv3 cipher=OTHER); Fri, 27 Nov 2015 06:24:16 -0800 (PST) To: GCC Patches From: Nathan Sidwell Subject: [PTX] address space patch Message-ID: <5658678F.8010101@acm.org> Date: Fri, 27 Nov 2015 09:24:15 -0500 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.3.0 MIME-Version: 1.0 I've committed this cleanup of some of the address space machinery. As with the fn recording helpers, the address space helper was accepting many things that were not symbols. Changed the two callers to only pass a symbol -- one of them had already done the symbol extraction anyway. Also, the prototype is not needed externally. nathan 2015-11-27 Nathan Sidwell * config/nvptx/nvptx-protos.h (nvptx_addr_space_from_address): Don't declare. * config/nvptx/nvptx.c (nvptx_addr_space_from_sym): New. (nvptx_maybe_convert_symbolic_operand): Simplify. (nvptx_addr_space_from_address): Delete. (nvptx_print_operand): Adjust 'A' case. Index: config/nvptx/nvptx-protos.h =================================================================== --- config/nvptx/nvptx-protos.h (revision 231015) +++ config/nvptx/nvptx-protos.h (working copy) @@ -41,7 +41,6 @@ extern const char *nvptx_output_return ( extern machine_mode nvptx_underlying_object_mode (rtx); extern const char *nvptx_section_from_addr_space (addr_space_t); extern bool nvptx_hard_regno_mode_ok (int, machine_mode); -extern addr_space_t nvptx_addr_space_from_address (rtx); extern rtx nvptx_maybe_convert_symbolic_operand (rtx); #endif #endif Index: config/nvptx/nvptx.c =================================================================== --- config/nvptx/nvptx.c (revision 231015) +++ config/nvptx/nvptx.c (working copy) @@ -206,6 +206,24 @@ nvptx_ptx_type_from_mode (machine_mode m } } +/* Determine the address space to use for SYMBOL_REF SYM. */ + +static addr_space_t +nvptx_addr_space_from_sym (rtx sym) +{ + tree decl = SYMBOL_REF_DECL (sym); + if (decl == NULL_TREE || TREE_CODE (decl) == FUNCTION_DECL) + return ADDR_SPACE_GENERIC; + + bool is_const = (CONSTANT_CLASS_P (decl) + || TREE_CODE (decl) == CONST_DECL + || TREE_READONLY (decl)); + if (is_const) + return ADDR_SPACE_CONST; + + return ADDR_SPACE_GLOBAL; +} + /* If MODE should be treated as two registers of an inner mode, return that inner mode. Otherwise return VOIDmode. */ @@ -1359,22 +1377,25 @@ nvptx_gen_wcast (rtx reg, propagate_mask original operand, or the converted one. */ rtx -nvptx_maybe_convert_symbolic_operand (rtx orig_op) +nvptx_maybe_convert_symbolic_operand (rtx op) { - if (GET_MODE (orig_op) != Pmode) - return orig_op; + if (GET_MODE (op) != Pmode) + return op; + + rtx sym = op; + if (GET_CODE (sym) == CONST) + sym = XEXP (sym, 0); + if (GET_CODE (sym) == PLUS) + sym = XEXP (sym, 0); - rtx op = orig_op; - while (GET_CODE (op) == PLUS || GET_CODE (op) == CONST) - op = XEXP (op, 0); - if (GET_CODE (op) != SYMBOL_REF) - return orig_op; + if (GET_CODE (sym) != SYMBOL_REF) + return op; - nvptx_maybe_record_fnsym (op); + nvptx_maybe_record_fnsym (sym); - addr_space_t as = nvptx_addr_space_from_address (op); + addr_space_t as = nvptx_addr_space_from_sym (sym); if (as == ADDR_SPACE_GENERIC) - return orig_op; + return op; enum unspec code; code = (as == ADDR_SPACE_GLOBAL ? UNSPEC_FROM_GLOBAL @@ -1382,9 +1403,10 @@ nvptx_maybe_convert_symbolic_operand (rt : as == ADDR_SPACE_SHARED ? UNSPEC_FROM_SHARED : as == ADDR_SPACE_CONST ? UNSPEC_FROM_CONST : UNSPEC_FROM_PARAM); + rtx dest = gen_reg_rtx (Pmode); - emit_insn (gen_rtx_SET (dest, gen_rtx_UNSPEC (Pmode, gen_rtvec (1, orig_op), - code))); + emit_insn (gen_rtx_SET (dest, + gen_rtx_UNSPEC (Pmode, gen_rtvec (1, op), code))); return dest; } @@ -1465,29 +1487,6 @@ nvptx_section_for_decl (const_tree decl) return ".global"; } -/* Look for a SYMBOL_REF in ADDR and return the address space to be used - for the insn referencing this address. */ - -addr_space_t -nvptx_addr_space_from_address (rtx addr) -{ - while (GET_CODE (addr) == PLUS || GET_CODE (addr) == CONST) - addr = XEXP (addr, 0); - if (GET_CODE (addr) != SYMBOL_REF) - return ADDR_SPACE_GENERIC; - - tree decl = SYMBOL_REF_DECL (addr); - if (decl == NULL_TREE || TREE_CODE (decl) == FUNCTION_DECL) - return ADDR_SPACE_GENERIC; - - bool is_const = (CONSTANT_CLASS_P (decl) - || TREE_CODE (decl) == CONST_DECL - || TREE_READONLY (decl)); - if (is_const) - return ADDR_SPACE_CONST; - - return ADDR_SPACE_GLOBAL; -} /* Machinery to output constant initializers. When beginning an initializer, we decide on a chunk size (which is visible in ptx in the type used), and @@ -1945,7 +1944,17 @@ nvptx_print_operand (FILE *file, rtx x, { case 'A': { - addr_space_t as = nvptx_addr_space_from_address (XEXP (x, 0)); + addr_space_t as = ADDR_SPACE_GENERIC; + rtx sym = XEXP (x, 0); + + if (GET_CODE (sym) == CONST) + sym = XEXP (sym, 0); + if (GET_CODE (sym) == PLUS) + sym = XEXP (sym, 0); + + if (GET_CODE (sym) == SYMBOL_REF) + as = nvptx_addr_space_from_sym (sym); + fputs (nvptx_section_from_addr_space (as), file); } break;