From patchwork Thu Jul 13 08:59:28 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Sandiford X-Patchwork-Id: 787610 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 3x7VDF2Dh0z9ryv for ; Thu, 13 Jul 2017 19:01:17 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b="NsMpNiZk"; 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:from :to:subject:references:date:in-reply-to:message-id:mime-version :content-type; q=dns; s=default; b=Kp43mYFqDyWIBEFWI5FFESErwvzxz HpALwgyZ1pyuK/WpIozYlF3R1ExZjk7JXFVaQxy7B5sUmFxwj8sesd27RHz5NDSL mqagAQWJPUtICQbd1shnQKJT/LVW+OZVfV7CW2AcYrKTiPmKp5oF4Pz+Y0IzsMAR Xw6A0ual1SzJDY= 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:subject:references:date:in-reply-to:message-id:mime-version :content-type; s=default; bh=KBQDMocJtywRP9I/td6hxubdf0E=; b=NsM pNiZkb81rF7CScbQOcywxQFpuJ2MZkFKtHgszt5qkmn96qYVBQ60sS+8VfGCNOR6 KcjFLzCMQOfKXMnB4rFieISFndz8P8fBzjzEeSBcGzAuyVMzKvj9jmqOb1KLnEmD qp/JtBUObUJwkzltpVPAUxXqMcyVQ6ad1uYPK5bc= Received: (qmail 61069 invoked by alias); 13 Jul 2017 08:59:39 -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 60474 invoked by uid 89); 13 Jul 2017 08:59:38 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-11.1 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_2, GIT_PATCH_3, KAM_ASCII_DIVIDERS, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy=2224 X-HELO: mail-wm0-f47.google.com Received: from mail-wm0-f47.google.com (HELO mail-wm0-f47.google.com) (74.125.82.47) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 13 Jul 2017 08:59:33 +0000 Received: by mail-wm0-f47.google.com with SMTP id i127so18472036wma.0 for ; Thu, 13 Jul 2017 01:59:33 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:mail-followup-to:subject:references:date :in-reply-to:message-id:user-agent:mime-version; bh=iwx0HNW3J7X5veneHYiXEN94h5NtC//2wggvibhyKvU=; b=gV+QbcPBPxSytt9X6y6nx5ECqFScBMhwpjer/MKKo1pvulnicaPNhgXrassNxRTdA4 yLwYDqu2OiqL2JQS2mr/HfQtCVHvK+/O2cDTAW4gz80LVfnWMsfCy9PhqLcgecmwyi1P kj9KRjnPHIg+oDNz/RxswuLXbiCp0tlsyHcCsEYTo3ddbTpBQSNrVaS07Tfmz5us7N+M L57p0TBKHEXMx6Sn5nn3cAxL1xTvHVaM9RW5iDFQM37Ydy2lpzGoiMx+5Ql/mDlKYGNm 8qDvoJCq9PqLueJ2KCOdLqJwBAD40UMKNPpoCzWy+PtTOB4yx4MAq7qCeTycUUlKdvjd TqnQ== X-Gm-Message-State: AIVw111aPV6kk0uSpPJrcq4ZpdegTOvfwx8gFtoPdG3/nRqaGM+SjMbR renSEHpOBqbOz4bnnv4YmA== X-Received: by 10.28.141.142 with SMTP id p136mr1294940wmd.125.1499936371222; Thu, 13 Jul 2017 01:59:31 -0700 (PDT) Received: from localhost (92.40.249.184.threembb.co.uk. [92.40.249.184]) by smtp.gmail.com with ESMTPSA id e17sm4376286wma.19.2017.07.13.01.59.30 for (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 13 Jul 2017 01:59:30 -0700 (PDT) From: Richard Sandiford To: gcc-patches@gcc.gnu.org Mail-Followup-To: gcc-patches@gcc.gnu.org, richard.sandiford@linaro.org Subject: [59/77] Add a rtx_jump_table_data::get_data_mode helper References: <8760ewohsv.fsf@linaro.org> Date: Thu, 13 Jul 2017 09:59:28 +0100 In-Reply-To: <8760ewohsv.fsf@linaro.org> (Richard Sandiford's message of "Thu, 13 Jul 2017 09:35:44 +0100") Message-ID: <8737a0emq7.fsf@linaro.org> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.2 (gnu/linux) MIME-Version: 1.0 This patch adds a helper function to get the mode of the addresses or offsets in a jump table. It also changes the final.c code to use rtx_jump_table_data over rtx or rtx_insn in cases where it needed to use the new helper. This in turn meant adding a safe_dyn_cast equivalent of safe_as_a, to cope with null NEXT_INSNs. 2017-07-13 Richard Sandiford Alan Hayward David Sherwood gcc/ * is-a.h (safe_dyn_cast): New function. * rtl.h (rtx_jump_table_data::get_data_mode): New function. (jump_table_for_label): Likewise. * final.c (final_addr_vec_align): Take an rtx_jump_table_data * instead of an rtx_insn *. (shorten_branches): Use dyn_cast instead of LABEL_P and JUMP_TABLE_DATA_P. Use jump_table_for_label and rtx_jump_table_data::get_data_mode. (final_scan_insn): Likewise. Index: gcc/is-a.h =================================================================== --- gcc/is-a.h 2017-02-23 19:54:02.000000000 +0000 +++ gcc/is-a.h 2017-07-13 09:18:49.947900834 +0100 @@ -103,6 +103,11 @@ TYPE dyn_cast (pointer) Note that we have converted two sets of assertions in the calls to varpool into safe and efficient use of a variable. +TYPE safe_dyn_cast (pointer) + + Like dyn_cast (pointer), except that it accepts null pointers + and returns null results for them. + If you use these functions and get a 'inline function not defined' or a 'missing symbol' error message for 'is_a_helper<....>::test', it means that @@ -222,4 +227,13 @@ dyn_cast (U *p) return static_cast (0); } +/* Similar to dyn_cast, except that the pointer may be null. */ + +template +inline T +safe_dyn_cast (U *p) +{ + return p ? dyn_cast (p) : 0; +} + #endif /* GCC_IS_A_H */ Index: gcc/rtl.h =================================================================== --- gcc/rtl.h 2017-07-13 09:18:46.226190608 +0100 +++ gcc/rtl.h 2017-07-13 09:18:49.948900757 +0100 @@ -634,6 +634,7 @@ class GTY(()) rtx_jump_table_data : publ This method gets the underlying vec. */ inline rtvec get_labels () const; + inline scalar_int_mode get_data_mode () const; }; class GTY(()) rtx_barrier : public rtx_insn @@ -1477,6 +1478,24 @@ inline rtvec rtx_jump_table_data::get_la return XVEC (pat, 1); /* presumably an ADDR_DIFF_VEC */ } +/* Return the mode of the data in the table, which is always a scalar + integer. */ + +inline scalar_int_mode +rtx_jump_table_data::get_data_mode () const +{ + return as_a (GET_MODE (PATTERN (this))); +} + +/* If LABEL is followed by a jump table, return the table, otherwise + return null. */ + +inline rtx_jump_table_data * +jump_table_for_label (const rtx_code_label *label) +{ + return safe_dyn_cast (NEXT_INSN (label)); +} + #define RTX_FRAME_RELATED_P(RTX) \ (RTL_FLAG_CHECK6 ("RTX_FRAME_RELATED_P", (RTX), DEBUG_INSN, INSN, \ CALL_INSN, JUMP_INSN, BARRIER, SET)->frame_related) Index: gcc/final.c =================================================================== --- gcc/final.c 2017-06-07 07:42:15.423295833 +0100 +++ gcc/final.c 2017-07-13 09:18:49.947900834 +0100 @@ -217,9 +217,6 @@ static void leaf_renumber_regs (rtx_insn #if HAVE_cc0 static int alter_cond (rtx); #endif -#ifndef ADDR_VEC_ALIGN -static int final_addr_vec_align (rtx_insn *); -#endif static int align_fuzz (rtx, rtx, int, unsigned); static void collect_fn_hard_reg_usage (void); static tree get_call_fndecl (rtx_insn *); @@ -517,9 +514,9 @@ default_jump_align_max_skip (rtx_insn *i #ifndef ADDR_VEC_ALIGN static int -final_addr_vec_align (rtx_insn *addr_vec) +final_addr_vec_align (rtx_jump_table_data *addr_vec) { - int align = GET_MODE_SIZE (GET_MODE (PATTERN (addr_vec))); + int align = GET_MODE_SIZE (addr_vec->get_data_mode ()); if (align > BIGGEST_ALIGNMENT / BITS_PER_UNIT) align = BIGGEST_ALIGNMENT / BITS_PER_UNIT; @@ -936,45 +933,41 @@ #define MAX_CODE_ALIGN 16 if (INSN_P (insn)) continue; - if (LABEL_P (insn)) + if (rtx_code_label *label = dyn_cast (insn)) { - rtx_insn *next; - bool next_is_jumptable; - /* Merge in alignments computed by compute_alignments. */ - log = LABEL_TO_ALIGNMENT (insn); + log = LABEL_TO_ALIGNMENT (label); if (max_log < log) { max_log = log; - max_skip = LABEL_TO_MAX_SKIP (insn); + max_skip = LABEL_TO_MAX_SKIP (label); } - next = next_nonnote_insn (insn); - next_is_jumptable = next && JUMP_TABLE_DATA_P (next); - if (!next_is_jumptable) + rtx_jump_table_data *table = jump_table_for_label (label); + if (!table) { - log = LABEL_ALIGN (insn); + log = LABEL_ALIGN (label); if (max_log < log) { max_log = log; - max_skip = targetm.asm_out.label_align_max_skip (insn); + max_skip = targetm.asm_out.label_align_max_skip (label); } } /* ADDR_VECs only take room if read-only data goes into the text section. */ if ((JUMP_TABLES_IN_TEXT_SECTION || readonly_data_section == text_section) - && next_is_jumptable) + && table) { - log = ADDR_VEC_ALIGN (next); + log = ADDR_VEC_ALIGN (table); if (max_log < log) { max_log = log; - max_skip = targetm.asm_out.label_align_max_skip (insn); + max_skip = targetm.asm_out.label_align_max_skip (label); } } - LABEL_TO_ALIGNMENT (insn) = max_log; - LABEL_TO_MAX_SKIP (insn) = max_skip; + LABEL_TO_ALIGNMENT (label) = max_log; + LABEL_TO_MAX_SKIP (label) = max_skip; max_log = 0; max_skip = 0; } @@ -1130,7 +1123,7 @@ #define MAX_CODE_ALIGN 16 continue; body = PATTERN (insn); - if (JUMP_TABLE_DATA_P (insn)) + if (rtx_jump_table_data *table = dyn_cast (insn)) { /* This only takes room if read-only data goes into the text section. */ @@ -1138,7 +1131,7 @@ #define MAX_CODE_ALIGN 16 || readonly_data_section == text_section) insn_lengths[uid] = (XVECLEN (body, GET_CODE (body) == ADDR_DIFF_VEC) - * GET_MODE_SIZE (GET_MODE (body))); + * GET_MODE_SIZE (table->get_data_mode ())); /* Alignment is handled by ADDR_VEC_ALIGN. */ } else if (GET_CODE (body) == ASM_INPUT || asm_noperands (body) >= 0) @@ -1218,28 +1211,27 @@ #define MAX_CODE_ALIGN 16 uid = INSN_UID (insn); - if (LABEL_P (insn)) + if (rtx_code_label *label = dyn_cast (insn)) { - int log = LABEL_TO_ALIGNMENT (insn); + int log = LABEL_TO_ALIGNMENT (label); #ifdef CASE_VECTOR_SHORTEN_MODE /* If the mode of a following jump table was changed, we may need to update the alignment of this label. */ - rtx_insn *next; - bool next_is_jumptable; - next = next_nonnote_insn (insn); - next_is_jumptable = next && JUMP_TABLE_DATA_P (next); - if ((JUMP_TABLES_IN_TEXT_SECTION - || readonly_data_section == text_section) - && next_is_jumptable) + if (JUMP_TABLES_IN_TEXT_SECTION + || readonly_data_section == text_section) { - int newlog = ADDR_VEC_ALIGN (next); - if (newlog != log) + rtx_jump_table_data *table = jump_table_for_label (label); + if (table) { - log = newlog; - LABEL_TO_ALIGNMENT (insn) = log; - something_changed = 1; + int newlog = ADDR_VEC_ALIGN (table); + if (newlog != log) + { + log = newlog; + LABEL_TO_ALIGNMENT (insn) = log; + something_changed = 1; + } } } #endif @@ -1270,6 +1262,7 @@ #define MAX_CODE_ALIGN 16 && JUMP_TABLE_DATA_P (insn) && GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC) { + rtx_jump_table_data *table = as_a (insn); rtx body = PATTERN (insn); int old_length = insn_lengths[uid]; rtx_insn *rel_lab = @@ -1365,13 +1358,14 @@ #define MAX_CODE_ALIGN 16 max_addr - rel_addr, body); if (!increasing || (GET_MODE_SIZE (vec_mode) - >= GET_MODE_SIZE (GET_MODE (body)))) + >= GET_MODE_SIZE (table->get_data_mode ()))) PUT_MODE (body, vec_mode); if (JUMP_TABLES_IN_TEXT_SECTION || readonly_data_section == text_section) { insn_lengths[uid] - = (XVECLEN (body, 1) * GET_MODE_SIZE (GET_MODE (body))); + = (XVECLEN (body, 1) + * GET_MODE_SIZE (table->get_data_mode ())); insn_current_address += insn_lengths[uid]; if (insn_lengths[uid] != old_length) something_changed = 1; @@ -2190,6 +2184,7 @@ final_scan_insn (rtx_insn *insn, FILE *f rtx set; #endif rtx_insn *next; + rtx_jump_table_data *table; insn_counter++; @@ -2447,11 +2442,11 @@ final_scan_insn (rtx_insn *insn, FILE *f app_disable (); - next = next_nonnote_insn (insn); /* If this label is followed by a jump-table, make sure we put the label in the read-only section. Also possibly write the label and jump table together. */ - if (next != 0 && JUMP_TABLE_DATA_P (next)) + table = jump_table_for_label (as_a (insn)); + if (table) { #if defined(ASM_OUTPUT_ADDR_VEC) || defined(ASM_OUTPUT_ADDR_DIFF_VEC) /* In this case, the case vector is being moved by the @@ -2466,7 +2461,7 @@ final_scan_insn (rtx_insn *insn, FILE *f (current_function_decl)); #ifdef ADDR_VEC_ALIGN - log_align = ADDR_VEC_ALIGN (next); + log_align = ADDR_VEC_ALIGN (table); #else log_align = exact_log2 (BIGGEST_ALIGNMENT / BITS_PER_UNIT); #endif @@ -2476,8 +2471,7 @@ final_scan_insn (rtx_insn *insn, FILE *f switch_to_section (current_function_section ()); #ifdef ASM_OUTPUT_CASE_LABEL - ASM_OUTPUT_CASE_LABEL (file, "L", CODE_LABEL_NUMBER (insn), - next); + ASM_OUTPUT_CASE_LABEL (file, "L", CODE_LABEL_NUMBER (insn), table); #else targetm.asm_out.internal_label (file, "L", CODE_LABEL_NUMBER (insn)); #endif