From patchwork Sun Aug 3 14:15:19 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Sandiford X-Patchwork-Id: 376040 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 C14361400AA for ; Mon, 4 Aug 2014 00:15:32 +1000 (EST) 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=wrQqPBVBSzULJfQLuCxxOimEMSEX9 K23KQnhiBzp4vAxFY+rkfPA8FkEE6uFB2FN17tY+oEmtBZhplSRK+UzknIKDrrpp jMeFlNRBDswk6fZ5LVvP+2aURRkS4opZhy4hJETiJxG8VA2OYMCQSUs7iB+bI5yp QVzbQi/b/SRC1g= 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=i/BnPpvMXnQkxI+J3+nWRfNq134=; b=iSm lxCbyXMfwvNYTfPPZlWavCdeXouq5CxcIFWi27F3VQHchjbb+a/xz6n6KbKP6s8s 6X9AJCRZr73HAlc2G/TaXAmGZSYB7Kw/yNcONoAxVmBG/nkQJUZ9oSTc84hscx9v dXN/cJUkdSFKD9deoOawM3FStefkUT2SVfF9cgv4= Received: (qmail 23992 invoked by alias); 3 Aug 2014 14:15: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 23812 invoked by uid 89); 3 Aug 2014 14:15:24 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.5 required=5.0 tests=AWL, BAYES_00, FREEMAIL_FROM, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 X-HELO: mail-wg0-f45.google.com Received: from mail-wg0-f45.google.com (HELO mail-wg0-f45.google.com) (74.125.82.45) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-SHA encrypted) ESMTPS; Sun, 03 Aug 2014 14:15:23 +0000 Received: by mail-wg0-f45.google.com with SMTP id x12so6406341wgg.28 for ; Sun, 03 Aug 2014 07:15:20 -0700 (PDT) X-Received: by 10.180.83.8 with SMTP id m8mr22425407wiy.8.1407075320331; Sun, 03 Aug 2014 07:15:20 -0700 (PDT) Received: from localhost ([95.145.138.172]) by mx.google.com with ESMTPSA id kr5sm36120150wjc.27.2014.08.03.07.15.19 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 03 Aug 2014 07:15:19 -0700 (PDT) From: Richard Sandiford To: gcc-patches@gcc.gnu.org Mail-Followup-To: gcc-patches@gcc.gnu.org, rdsandiford@googlemail.com Subject: [PATCH 30/50] lower-subreg.c:resolve_subreg_use References: <87y4v5d77q.fsf@googlemail.com> Date: Sun, 03 Aug 2014 15:15:19 +0100 In-Reply-To: <87y4v5d77q.fsf@googlemail.com> (Richard Sandiford's message of "Sun, 03 Aug 2014 14:38:01 +0100") Message-ID: <87d2ch8xs8.fsf@googlemail.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3 (gnu/linux) MIME-Version: 1.0 gcc/ * lower-subreg.c: Include rtl-iter.h. (resolve_subreg_use): Turn from being a for_each_rtx callback to being a function that examines each subrtx itself. Remove handling of null rtxes. (resolve_reg_notes, resolve_simple_move): Update accordingly. (decompose_multiword_subregs): Likewise. Index: gcc/lower-subreg.c =================================================================== --- gcc/lower-subreg.c 2014-08-03 11:25:09.853953599 +0100 +++ gcc/lower-subreg.c 2014-08-03 11:25:28.502137966 +0100 @@ -40,6 +40,7 @@ Software Foundation; either version 3, o #include "tree-pass.h" #include "df.h" #include "lower-subreg.h" +#include "rtl-iter.h" #ifdef STACK_GROWS_DOWNWARD # undef STACK_GROWS_DOWNWARD @@ -726,46 +727,42 @@ resolve_subreg_p (rtx x) return resolve_reg_p (SUBREG_REG (x)); } -/* This is called via for_each_rtx. Look for SUBREGs which need to be - decomposed. */ +/* Look for SUBREGs in *LOC which need to be decomposed. */ -static int -resolve_subreg_use (rtx *px, void *data) +static bool +resolve_subreg_use (rtx *loc, rtx insn) { - rtx insn = (rtx) data; - rtx x = *px; - - if (x == NULL_RTX) - return 0; - - if (resolve_subreg_p (x)) + subrtx_ptr_iterator::array_type array; + FOR_EACH_SUBRTX_PTR (iter, array, loc, NONCONST) { - x = simplify_subreg_concatn (GET_MODE (x), SUBREG_REG (x), - SUBREG_BYTE (x)); - - /* It is possible for a note to contain a reference which we can - decompose. In this case, return 1 to the caller to indicate - that the note must be removed. */ - if (!x) + rtx *loc = *iter; + rtx x = *loc; + if (resolve_subreg_p (x)) { - gcc_assert (!insn); - return 1; - } + x = simplify_subreg_concatn (GET_MODE (x), SUBREG_REG (x), + SUBREG_BYTE (x)); - validate_change (insn, px, x, 1); - return -1; - } + /* It is possible for a note to contain a reference which we can + decompose. In this case, return 1 to the caller to indicate + that the note must be removed. */ + if (!x) + { + gcc_assert (!insn); + return true; + } - if (resolve_reg_p (x)) - { - /* Return 1 to the caller to indicate that we found a direct - reference to a register which is being decomposed. This can - happen inside notes, multiword shift or zero-extend - instructions. */ - return 1; + validate_change (insn, loc, x, 1); + iter.skip_subrtxes (); + } + else if (resolve_reg_p (x)) + /* Return 1 to the caller to indicate that we found a direct + reference to a register which is being decomposed. This can + happen inside notes, multiword shift or zero-extend + instructions. */ + return true; } - return 0; + return false; } /* This is called via for_each_rtx. Look for SUBREGs which can be @@ -808,7 +805,7 @@ resolve_reg_notes (rtx insn) if (note) { int old_count = num_validated_changes (); - if (for_each_rtx (&XEXP (note, 0), resolve_subreg_use, NULL)) + if (resolve_subreg_use (&XEXP (note, 0), NULL_RTX)) remove_note (insn, note); else if (old_count != num_validated_changes ()) @@ -950,9 +947,9 @@ resolve_simple_move (rtx set, rtx insn) int acg; if (MEM_P (src)) - for_each_rtx (&XEXP (src, 0), resolve_subreg_use, NULL_RTX); + resolve_subreg_use (&XEXP (src, 0), NULL_RTX); if (MEM_P (dest)) - for_each_rtx (&XEXP (dest, 0), resolve_subreg_use, NULL_RTX); + resolve_subreg_use (&XEXP (dest, 0), NULL_RTX); acg = apply_change_group (); gcc_assert (acg); } @@ -1614,9 +1611,7 @@ decompose_multiword_subregs (bool decomp } for (i = recog_data.n_operands - 1; i >= 0; --i) - for_each_rtx (recog_data.operand_loc[i], - resolve_subreg_use, - insn); + resolve_subreg_use (recog_data.operand_loc[i], insn); resolve_reg_notes (insn);