From patchwork Fri Aug 23 01:15:32 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kenneth Zadeck X-Patchwork-Id: 269239 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 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client CN "localhost", Issuer "www.qmailtoaster.com" (not verified)) by ozlabs.org (Postfix) with ESMTPS id D81B82C009A for ; Fri, 23 Aug 2013 11:15:43 +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 :message-id:date:from:mime-version:to:subject:content-type :content-transfer-encoding; q=dns; s=default; b=lwzS/rKxeNCTEsyb DbphT1bYeQkmBsMYx3MHN9tsEP87Q7N8v7CSLzsJIE7sBcAqmUyV6I8O+TMpslQj IHQEss9K2WHBycSXkffZM8+0tGcaIOPInorVD+x/Q/v1w700UwoS8PxkMdYmthnF klAd1/pPir/Xj4JwHMjo/k/7m/8= 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 :message-id:date:from:mime-version:to:subject:content-type :content-transfer-encoding; s=default; bh=gfwkG/EBQMittEma8ZB/HG tVPsU=; b=UpdPadpPPgKnTBdJLmJY/OxHOQ3w2xQNpFYvTkb9ySUhzxotJfvaiv toqyh5J0kcaj2QYRi6BYM3eA9PRL02ZMCqQfxpGdWcCGfeKMlpKDVl9DjRvs4elQ 4wyMxfDp/YngvFLKRHsXOKYVABElz6nRVPaPGg9dHE1zAvRbt6yTU= Received: (qmail 8238 invoked by alias); 23 Aug 2013 01:15:36 -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 8223 invoked by uid 89); 23 Aug 2013 01:15:36 -0000 X-Spam-SWARE-Status: No, score=-2.2 required=5.0 tests=AWL, BAYES_00, KHOP_RCVD_UNTRUST, RCVD_IN_DNSWL_LOW, RCVD_IN_HOSTKARMA_NO, RCVD_IN_HOSTKARMA_YE autolearn=ham version=3.3.2 Received: from mail-ob0-f169.google.com (HELO mail-ob0-f169.google.com) (209.85.214.169) by sourceware.org (qpsmtpd/0.84/v0.84-167-ge50287c) with ESMTP; Fri, 23 Aug 2013 01:15:35 +0000 Received: by mail-ob0-f169.google.com with SMTP id wc20so27204obb.14 for ; Thu, 22 Aug 2013 18:15:34 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-gm-message-state:message-id:date:from:user-agent:mime-version:to :subject:content-type:content-transfer-encoding; bh=Gf/8mGP61Y/h1qficYqzugzrCO6ch5GUtqNu+a8xUJk=; b=M7CJ0Xt3ffdtr/Ad3/JiYgTLB4kThEYbEMrk1DEeBocB8vLqnC3b0cDhEQGhIZ9tZX 23p6vhHmiDAj0EQz9oyUgUbwu8EAhVv3ip4jWzxOpkESGLTTIqLOUbEUjZFLKPgAkrKi XdliPwNUVfoklXI+/RA19aaIwF3UYpiXQKt8H0QJtl8Fr1v0uq05ONDX1UvybQArjx3M dY95kvZyKjMd6CSiZ4xngqgZj0n3ThR6aT2DWFdwDVehhvbNItSFZCfqd7OypUT0APX2 3pBdlIriH5QndMAehYzaXTBbQo2XhNp93OQMq6KfGPokKNmpafmodyKBjD/5VBYS9yLM 09Gw== X-Gm-Message-State: ALoCoQkS/IE8xyFcyOJujvKIT6nzY/v9IUqAIEYpHKZv45n8zOMsF1Lj4B7D/xIhjl7DcYuKllhh X-Received: by 10.50.88.7 with SMTP id bc7mr16918igb.37.1377220534149; Thu, 22 Aug 2013 18:15:34 -0700 (PDT) Received: from moria.site (pool-98-113-157-218.nycmny.fios.verizon.net. [98.113.157.218]) by mx.google.com with ESMTPSA id q4sm402160igp.6.1969.12.31.16.00.00 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Thu, 22 Aug 2013 18:15:33 -0700 (PDT) Message-ID: <5216B7B4.5020407@naturalbridge.com> Date: Thu, 22 Aug 2013 21:15:32 -0400 From: Kenneth Zadeck User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: gcc-patches , Mike Stump , Richard Sandiford Subject: patch for wide-int branch cleaned up version of convert_modes that handles all constants in a uniform manner. This is clean on x86-64. Will test on other platforms tomorrow. kenny /* Converting from integer constant into mode is always equivalent to an subreg operation. */ Index: gcc/expr.c =================================================================== --- gcc/expr.c (revision 201884) +++ gcc/expr.c (working copy) @@ -710,64 +710,32 @@ convert_modes (enum machine_mode mode, e if (mode == oldmode) return x; - /* There is one case that we must handle specially: If we are - converting a CONST_INT into a mode whose size is larger than - HOST_BITS_PER_WIDE_INT and we are to interpret the constant as - unsigned, gen_lowpart will do the wrong if the constant appears - negative. What we want to do is make the high-order word of the - constant zero, not all ones. */ - - if (unsignedp && GET_MODE_CLASS (mode) == MODE_INT - && GET_MODE_BITSIZE (mode) > HOST_BITS_PER_WIDE_INT - && CONST_INT_P (x) && INTVAL (x) < 0) + if (CONST_SCALAR_INT_P (x) + && GET_MODE_CLASS (mode) == MODE_INT + && (oldmode == VOIDmode || GET_MODE_CLASS (oldmode) == MODE_INT)) { - wide_int val = std::make_pair (x, mode); - /* We need to zero extend VAL. */ - if (oldmode != VOIDmode) - val = val.zext (GET_MODE_PRECISION (oldmode)); - - return immed_wide_int_const (val, mode); + wide_int w = std::make_pair (x, mode); + /* If the caller did not tell us the old mode, then there is + not much to do with respect to canonization. */ + if (oldmode != VOIDmode + && GET_MODE_PRECISION (mode) > GET_MODE_PRECISION (oldmode)) + w = w.ext (GET_MODE_PRECISION (oldmode), unsignedp ? UNSIGNED : SIGNED); + return immed_wide_int_const (w, mode); } /* We can do this with a gen_lowpart if both desired and current modes are integer, and this is either a constant integer, a register, or a - non-volatile MEM. Except for the constant case where MODE is no - wider than HOST_BITS_PER_WIDE_INT, we must be narrowing the operand. */ + non-volatile MEM. */ + if (GET_MODE_CLASS (mode) == MODE_INT + && GET_MODE_CLASS (oldmode) == MODE_INT + && GET_MODE_PRECISION (mode) <= GET_MODE_PRECISION (oldmode) + && ((MEM_P (x) && !MEM_VOLATILE_P (x) && direct_load[(int) mode]) + || (REG_P (x) + && (!HARD_REGISTER_P (x) + || HARD_REGNO_MODE_OK (REGNO (x), mode)) + && TRULY_NOOP_TRUNCATION_MODES_P (mode, GET_MODE (x))))) - if ((CONST_INT_P (x) - && GET_MODE_PRECISION (mode) <= HOST_BITS_PER_WIDE_INT) - || (GET_MODE_CLASS (mode) == MODE_INT - && GET_MODE_CLASS (oldmode) == MODE_INT - && (CONST_SCALAR_INT_P (x) - || (GET_MODE_PRECISION (mode) <= GET_MODE_PRECISION (oldmode) - && ((MEM_P (x) && ! MEM_VOLATILE_P (x) - && direct_load[(int) mode]) - || (REG_P (x) - && (! HARD_REGISTER_P (x) - || HARD_REGNO_MODE_OK (REGNO (x), mode)) - && TRULY_NOOP_TRUNCATION_MODES_P (mode, - GET_MODE (x)))))))) - { - /* ?? If we don't know OLDMODE, we have to assume here that - X does not need sign- or zero-extension. This may not be - the case, but it's the best we can do. */ - if (CONST_INT_P (x) && oldmode != VOIDmode - && GET_MODE_PRECISION (mode) > GET_MODE_PRECISION (oldmode)) - { - HOST_WIDE_INT val = INTVAL (x); - - /* We must sign or zero-extend in this case. Start by - zero-extending, then sign extend if we need to. */ - val &= GET_MODE_MASK (oldmode); - if (! unsignedp - && val_signbit_known_set_p (oldmode, val)) - val |= ~GET_MODE_MASK (oldmode); - - return gen_int_mode (val, mode); - } - - return gen_lowpart (mode, x); - } + return gen_lowpart (mode, x);