From patchwork Mon Oct 23 11:27:18 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Sandiford X-Patchwork-Id: 116704 Delivered-To: patch@linaro.org Received: by 10.140.22.164 with SMTP id 33csp4531802qgn; Mon, 23 Oct 2017 04:27:38 -0700 (PDT) X-Received: by 10.84.242.74 with SMTP id c10mr10420978pll.141.1508758058247; Mon, 23 Oct 2017 04:27:38 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1508758058; cv=none; d=google.com; s=arc-20160816; b=nA2vPg4/CuP7IY4JdAdueZXoG8zqjpmrMKScOOgUpXSQUHPbWyCvoFciMRRlYg7EoY jD3Rfij3PAlAaYtiesbi4s/K87OhbUiV5SfZ5ZPH7l01lFkHXFJ0TqDliFwm5Z35ZfgP hx9JlXLfPfa8IQpwYLvakQ5O1XoVgIfhrlrLGJFiSL7+sA0RVomvk8wdeJQB2FqlyDgH ot9cVCxx8yMKUubD3/12YV1HfZ4WQ45DjzwbTlWOV/Ll83KxWSurzLtrmjqltlknrh4h ZGhaNp5ll4EWedlEdYl4c/eqC+l5kIAHJH59hMpT36QroAyVKp7bfuKo3E213tK5NbGG 9Djw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=mime-version:user-agent:message-id:in-reply-to:date:references :subject:mail-followup-to:to:from:delivered-to:sender:list-help :list-post:list-archive:list-unsubscribe:list-id:precedence :mailing-list:dkim-signature:domainkey-signature :arc-authentication-results; bh=474dzS6apyyL7se9em8eekZBlhD6uCId4qUM2ZR/4Ec=; b=diYAlXW9lKcbxyubZi6sUeoDXLQW5aNV/tF+FSGW7/ka3iSnowNYKIj8TGHZdE7GRL 6ZYC0zP+ptYO7ik5GWalPnc6kAc8ASMG+hLFziy0ZxC0cS9mFVwxO6fTwny56th6o5y2 UvI1h9cxN4Rw/ueAIp1a5JZcZ7fasng8KtyPRI0eKJEQV6uGTwSfq/JqLKDSEWcFHI2h 9WyR2dwS6O0vi+NRL08r+8wHfRLZH6ivaej/WaM0wHC6+HcPlnyl127RceuUYzyORvhY 1QeqgU7gBidwrHO2u7FOXDaxyuTtiyEki30HiWTXK3YzPIGRdHt6RLc3sKr7JOa5ghYW nGRw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b=qZhhFNnb; spf=pass (google.com: domain of gcc-patches-return-464743-patch=linaro.org@gcc.gnu.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=gcc-patches-return-464743-patch=linaro.org@gcc.gnu.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id c3si3945835pld.233.2017.10.23.04.27.37 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 23 Oct 2017 04:27:38 -0700 (PDT) Received-SPF: pass (google.com: domain of gcc-patches-return-464743-patch=linaro.org@gcc.gnu.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Authentication-Results: mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b=qZhhFNnb; spf=pass (google.com: domain of gcc-patches-return-464743-patch=linaro.org@gcc.gnu.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=gcc-patches-return-464743-patch=linaro.org@gcc.gnu.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org 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=PGNERjKJueDT2XYE2a1NzDX9hlkSs 594vu4DJEnxmk0d2UnCOOJTGJUgKbDmT1L9UIoeFHy1SWhaOgiCiEWNpKz/WlyzH BXHeZe8WrWmJOUij2YgFWZqvOl139JNDk5kMiP106whJrCfQ+ZHLy6T9LaMS6sK3 Sfg8s+Xa6U82Rc= 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=T/U1URZxKfQ2jbG0DiEbFesj0wc=; b=qZh hFNnbxQTmA7qrXJ4VT7kNmelnXEwA3e82TKe5gNFyQM0EH7OVNAlIwWY9ZiimIUD ZL8FPQxpaEpzaTXI33bLOFHp/YU3J04CCz5d8QE4tp7kCE9nVAomQ58/dusOdwPW 9jdKEEr3LTYbJwTXR38A9oAVsV0ZaMvGgEv/rWBk= Received: (qmail 82453 invoked by alias); 23 Oct 2017 11:27:25 -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 82440 invoked by uid 89); 23 Oct 2017 11:27:25 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-11.2 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, RCVD_IN_SORBS_SPAM, SPF_PASS autolearn=ham version=3.3.2 spammy= X-HELO: mail-wm0-f49.google.com Received: from mail-wm0-f49.google.com (HELO mail-wm0-f49.google.com) (74.125.82.49) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 23 Oct 2017 11:27:22 +0000 Received: by mail-wm0-f49.google.com with SMTP id p75so8834628wmg.3 for ; Mon, 23 Oct 2017 04:27:22 -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=474dzS6apyyL7se9em8eekZBlhD6uCId4qUM2ZR/4Ec=; b=duWn5VwwqeULoh0i9WLR9/G5jUCqSDh+dDG7ud+mNwaHdSupHPAkcHs9qm9nNESeUu ZKAKmylbjlq6FIw5SvtwpWJLE6doOofJ/n/DESE04NefcDWPEvlr7aeEDUB4sDdQRdMO SxykJ2MxXiLOamWMfMdDmwwA5rAa1RMQLFugn769WY8dXR8gnjV6E9LRVOMFkfyxoleG x7tQyAQ0uG0Pdu+ciPuHf/AE43391JCKsSHO+cCHYoFSOGpXSjGkMLOpOSwBysNo+lbr c4y0bv03Rso87ShpANQhtusnFgCiYgcrmoP7Nk7u10ORGY0kZlKzUp1ZHD0iZT9U8D76 6AAA== X-Gm-Message-State: AMCzsaX4WE/QwekurcZheNtftFvre/YyQXr6ssJKHHchenjaAbSHE5zv fNPDs2M/G4k/IZJ0r8rpW2ZjwiW1O/U= X-Google-Smtp-Source: ABhQp+REY85xtbHB0ivIoHZ+2+p9ke5wVMXenSJuGqJ41oTJQP049bziZVtLLNMraIdCy8tfruP7HQ== X-Received: by 10.28.19.73 with SMTP id 70mr5151058wmt.87.1508758040116; Mon, 23 Oct 2017 04:27:20 -0700 (PDT) Received: from localhost ([2.26.27.199]) by smtp.gmail.com with ESMTPSA id c37sm19462058wra.73.2017.10.23.04.27.18 for (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 23 Oct 2017 04:27:19 -0700 (PDT) From: Richard Sandiford To: gcc-patches@gcc.gnu.org Mail-Followup-To: gcc-patches@gcc.gnu.org, richard.sandiford@linaro.org Subject: [16/nn] Factor out the mode handling in lower-subreg.c References: <87wp3mxgir.fsf@linaro.org> Date: Mon, 23 Oct 2017 12:27:18 +0100 In-Reply-To: <87wp3mxgir.fsf@linaro.org> (Richard Sandiford's message of "Mon, 23 Oct 2017 12:14:36 +0100") Message-ID: <87zi8iumsp.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 routine (interesting_mode_p) to lower-subreg.c, to make the decision about whether a mode can be split and, if so, calculate the number of bytes and words in the mode. At present this function always returns true; a later patch will add cases in which it can return false. 2017-10-23 Richard Sandiford Alan Hayward David Sherwood gcc/ * lower-subreg.c (interesting_mode_p): New function. (compute_costs, find_decomposable_subregs, decompose_register) (simplify_subreg_concatn, can_decompose_p, resolve_simple_move) (resolve_clobber, dump_choices): Use it. Index: gcc/lower-subreg.c =================================================================== --- gcc/lower-subreg.c 2017-10-23 11:47:11.274393237 +0100 +++ gcc/lower-subreg.c 2017-10-23 11:47:23.555013148 +0100 @@ -103,6 +103,18 @@ #define twice_word_mode \ #define choices \ this_target_lower_subreg->x_choices +/* Return true if MODE is a mode we know how to lower. When returning true, + store its byte size in *BYTES and its word size in *WORDS. */ + +static inline bool +interesting_mode_p (machine_mode mode, unsigned int *bytes, + unsigned int *words) +{ + *bytes = GET_MODE_SIZE (mode); + *words = CEIL (*bytes, UNITS_PER_WORD); + return true; +} + /* RTXes used while computing costs. */ struct cost_rtxes { /* Source and target registers. */ @@ -199,10 +211,10 @@ compute_costs (bool speed_p, struct cost for (i = 0; i < MAX_MACHINE_MODE; i++) { machine_mode mode = (machine_mode) i; - int factor = GET_MODE_SIZE (mode) / UNITS_PER_WORD; - if (factor > 1) + unsigned int size, factor; + if (interesting_mode_p (mode, &size, &factor) && factor > 1) { - int mode_move_cost; + unsigned int mode_move_cost; PUT_MODE (rtxes->target, mode); PUT_MODE (rtxes->source, mode); @@ -469,10 +481,10 @@ find_decomposable_subregs (rtx *loc, enu continue; } - outer_size = GET_MODE_SIZE (GET_MODE (x)); - inner_size = GET_MODE_SIZE (GET_MODE (inner)); - outer_words = (outer_size + UNITS_PER_WORD - 1) / UNITS_PER_WORD; - inner_words = (inner_size + UNITS_PER_WORD - 1) / UNITS_PER_WORD; + if (!interesting_mode_p (GET_MODE (x), &outer_size, &outer_words) + || !interesting_mode_p (GET_MODE (inner), &inner_size, + &inner_words)) + continue; /* We only try to decompose single word subregs of multi-word registers. When we find one, we return -1 to avoid iterating @@ -507,7 +519,7 @@ find_decomposable_subregs (rtx *loc, enu } else if (REG_P (x)) { - unsigned int regno; + unsigned int regno, size, words; /* We will see an outer SUBREG before we see the inner REG, so when we see a plain REG here it means a direct reference to @@ -527,7 +539,8 @@ find_decomposable_subregs (rtx *loc, enu regno = REGNO (x); if (!HARD_REGISTER_NUM_P (regno) - && GET_MODE_SIZE (GET_MODE (x)) > UNITS_PER_WORD) + && interesting_mode_p (GET_MODE (x), &size, &words) + && words > 1) { switch (*pcmi) { @@ -567,15 +580,15 @@ find_decomposable_subregs (rtx *loc, enu decompose_register (unsigned int regno) { rtx reg; - unsigned int words, i; + unsigned int size, words, i; rtvec v; reg = regno_reg_rtx[regno]; regno_reg_rtx[regno] = NULL_RTX; - words = GET_MODE_SIZE (GET_MODE (reg)); - words = (words + UNITS_PER_WORD - 1) / UNITS_PER_WORD; + if (!interesting_mode_p (GET_MODE (reg), &size, &words)) + gcc_unreachable (); v = rtvec_alloc (words); for (i = 0; i < words; ++i) @@ -599,25 +612,29 @@ decompose_register (unsigned int regno) simplify_subreg_concatn (machine_mode outermode, rtx op, unsigned int byte) { - unsigned int inner_size; + unsigned int outer_size, outer_words, inner_size, inner_words; machine_mode innermode, partmode; rtx part; unsigned int final_offset; + innermode = GET_MODE (op); + if (!interesting_mode_p (outermode, &outer_size, &outer_words) + || !interesting_mode_p (innermode, &inner_size, &inner_words)) + gcc_unreachable (); + gcc_assert (GET_CODE (op) == CONCATN); - gcc_assert (byte % GET_MODE_SIZE (outermode) == 0); + gcc_assert (byte % outer_size == 0); - innermode = GET_MODE (op); - gcc_assert (byte < GET_MODE_SIZE (innermode)); - if (GET_MODE_SIZE (outermode) > GET_MODE_SIZE (innermode)) + gcc_assert (byte < inner_size); + if (outer_size > inner_size) return NULL_RTX; - inner_size = GET_MODE_SIZE (innermode) / XVECLEN (op, 0); + inner_size /= XVECLEN (op, 0); part = XVECEXP (op, 0, byte / inner_size); partmode = GET_MODE (part); final_offset = byte % inner_size; - if (final_offset + GET_MODE_SIZE (outermode) > inner_size) + if (final_offset + outer_size > inner_size) return NULL_RTX; /* VECTOR_CSTs in debug expressions are expanded into CONCATN instead of @@ -801,9 +818,10 @@ can_decompose_p (rtx x) if (HARD_REGISTER_NUM_P (regno)) { - unsigned int byte, num_bytes; + unsigned int byte, num_bytes, num_words; - num_bytes = GET_MODE_SIZE (GET_MODE (x)); + if (!interesting_mode_p (GET_MODE (x), &num_bytes, &num_words)) + return false; for (byte = 0; byte < num_bytes; byte += UNITS_PER_WORD) if (simplify_subreg_regno (regno, GET_MODE (x), byte, word_mode) < 0) return false; @@ -826,14 +844,15 @@ resolve_simple_move (rtx set, rtx_insn * rtx src, dest, real_dest; rtx_insn *insns; machine_mode orig_mode, dest_mode; - unsigned int words; + unsigned int orig_size, words; bool pushing; src = SET_SRC (set); dest = SET_DEST (set); orig_mode = GET_MODE (dest); - words = (GET_MODE_SIZE (orig_mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD; + if (!interesting_mode_p (orig_mode, &orig_size, &words)) + gcc_unreachable (); gcc_assert (words > 1); start_sequence (); @@ -964,7 +983,7 @@ resolve_simple_move (rtx set, rtx_insn * { unsigned int i, j, jinc; - gcc_assert (GET_MODE_SIZE (orig_mode) % UNITS_PER_WORD == 0); + gcc_assert (orig_size % UNITS_PER_WORD == 0); gcc_assert (GET_CODE (XEXP (dest, 0)) != PRE_MODIFY); gcc_assert (GET_CODE (XEXP (dest, 0)) != POST_MODIFY); @@ -1059,7 +1078,7 @@ resolve_clobber (rtx pat, rtx_insn *insn { rtx reg; machine_mode orig_mode; - unsigned int words, i; + unsigned int orig_size, words, i; int ret; reg = XEXP (pat, 0); @@ -1067,8 +1086,8 @@ resolve_clobber (rtx pat, rtx_insn *insn return false; orig_mode = GET_MODE (reg); - words = GET_MODE_SIZE (orig_mode); - words = (words + UNITS_PER_WORD - 1) / UNITS_PER_WORD; + if (!interesting_mode_p (orig_mode, &orig_size, &words)) + gcc_unreachable (); ret = validate_change (NULL_RTX, &XEXP (pat, 0), simplify_gen_subreg_concatn (word_mode, reg, @@ -1332,12 +1351,13 @@ dump_shift_choices (enum rtx_code code, static void dump_choices (bool speed_p, const char *description) { - unsigned int i; + unsigned int size, factor, i; fprintf (dump_file, "Choices when optimizing for %s:\n", description); for (i = 0; i < MAX_MACHINE_MODE; i++) - if (GET_MODE_SIZE ((machine_mode) i) > UNITS_PER_WORD) + if (interesting_mode_p ((machine_mode) i, &size, &factor) + && factor > 1) fprintf (dump_file, " %s mode %s for copy lowering.\n", choices[speed_p].move_modes_to_split[i] ? "Splitting"