From patchwork Sun Aug 3 14:38:05 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Sandiford X-Patchwork-Id: 376057 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 69E3114009B for ; Mon, 4 Aug 2014 00:38:17 +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=lCV4toFdn5zzhdldidHVznu22r3i/ XbEsDjoebwbAYzXh9PN0lNuAnVT2ciZ19ZwJPZRsrvmWMvsoFKmGYgMnSW8NHFgg hgJMlX9Pg+3SSI0Xvwydw0jKBM5pDF5f8dSRStbLkd0+Ra5/3jwH+5wfznYwNGZL Bbga0FdECCExM4= 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=OQByw8PMYUZ3eDi4mj6Yu6m5MiY=; b=rLl ol+qdXAUes03VLzaYGYKglEhdkrebpP8YLLDMivKhADCIhtnmMizuyvRXII6/CcQ 93jRPOZDTit0XHxbcKYCrnQ0qlZ+VP9yC1dX5s/G9L3tbz3ZmKjpI/L87Q+3S3SX q2cffgzw0rccyRBuub6LicizkycpIBDhkZqs5e2Y= Received: (qmail 22333 invoked by alias); 3 Aug 2014 14:38:11 -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 22323 invoked by uid 89); 3 Aug 2014 14:38:10 -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-f51.google.com Received: from mail-wg0-f51.google.com (HELO mail-wg0-f51.google.com) (74.125.82.51) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-SHA encrypted) ESMTPS; Sun, 03 Aug 2014 14:38:09 +0000 Received: by mail-wg0-f51.google.com with SMTP id b13so6476239wgh.10 for ; Sun, 03 Aug 2014 07:38:06 -0700 (PDT) X-Received: by 10.180.108.1 with SMTP id hg1mr22970392wib.25.1407076685999; Sun, 03 Aug 2014 07:38:05 -0700 (PDT) Received: from localhost ([95.145.138.172]) by mx.google.com with ESMTPSA id eh10sm30535601wic.0.2014.08.03.07.38.05 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 03 Aug 2014 07:38:05 -0700 (PDT) From: Richard Sandiford To: gcc-patches@gcc.gnu.org Mail-Followup-To: gcc-patches@gcc.gnu.org, rdsandiford@googlemail.com Subject: [PATCH 46/50] var-tracking.c:use_narrower_mode_test References: <87y4v5d77q.fsf@googlemail.com> Date: Sun, 03 Aug 2014 15:38:05 +0100 In-Reply-To: <87y4v5d77q.fsf@googlemail.com> (Richard Sandiford's message of "Sun, 03 Aug 2014 14:38:01 +0100") Message-ID: <87fvhd63le.fsf@googlemail.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3 (gnu/linux) MIME-Version: 1.0 gcc/ * var-tracking.c (use_narrower_mode_test): Turn from being a for_each_rtx callback to being a function that examines each subrtx itself. (adjust_mems): Update accordingly. Index: gcc/var-tracking.c =================================================================== --- gcc/var-tracking.c 2014-08-03 11:25:32.786180320 +0100 +++ gcc/var-tracking.c 2014-08-03 11:25:33.067183098 +0100 @@ -953,41 +953,41 @@ struct adjust_mem_data rtx side_effects; }; -/* Helper for adjust_mems. Return 1 if *loc is unsuitable for - transformation of wider mode arithmetics to narrower mode, - -1 if it is suitable and subexpressions shouldn't be - traversed and 0 if it is suitable and subexpressions should - be traversed. Called through for_each_rtx. */ +/* Helper for adjust_mems. Return true if X is suitable for + transformation of wider mode arithmetics to narrower mode. */ -static int -use_narrower_mode_test (rtx *loc, void *data) +static bool +use_narrower_mode_test (rtx x, const_rtx subreg) { - rtx subreg = (rtx) data; - - if (CONSTANT_P (*loc)) - return -1; - switch (GET_CODE (*loc)) + subrtx_var_iterator::array_type array; + FOR_EACH_SUBRTX_VAR (iter, array, x, NONCONST) { - case REG: - if (cselib_lookup (*loc, GET_MODE (SUBREG_REG (subreg)), 0, VOIDmode)) - return 1; - if (!validate_subreg (GET_MODE (subreg), GET_MODE (*loc), - *loc, subreg_lowpart_offset (GET_MODE (subreg), - GET_MODE (*loc)))) - return 1; - return -1; - case PLUS: - case MINUS: - case MULT: - return 0; - case ASHIFT: - if (for_each_rtx (&XEXP (*loc, 0), use_narrower_mode_test, data)) - return 1; + rtx x = *iter; + if (CONSTANT_P (x)) + iter.skip_subrtxes (); else - return -1; - default: - return 1; + switch (GET_CODE (x)) + { + case REG: + if (cselib_lookup (x, GET_MODE (SUBREG_REG (subreg)), 0, VOIDmode)) + return false; + if (!validate_subreg (GET_MODE (subreg), GET_MODE (x), x, + subreg_lowpart_offset (GET_MODE (subreg), + GET_MODE (x)))) + return false; + break; + case PLUS: + case MINUS: + case MULT: + break; + case ASHIFT: + iter.substitute (XEXP (x, 0)); + break; + default: + return false; + } } + return true; } /* Transform X into narrower mode MODE from wider mode WMODE. */ @@ -1148,7 +1148,7 @@ adjust_mems (rtx loc, const_rtx old_rtx, && GET_MODE_SIZE (GET_MODE (tem)) < GET_MODE_SIZE (GET_MODE (SUBREG_REG (tem))) && subreg_lowpart_p (tem) - && !for_each_rtx (&SUBREG_REG (tem), use_narrower_mode_test, tem)) + && use_narrower_mode_test (SUBREG_REG (tem), tem)) return use_narrower_mode (SUBREG_REG (tem), GET_MODE (tem), GET_MODE (SUBREG_REG (tem))); return tem;