From patchwork Sun Oct 11 10:35:42 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kugan Vivekanandarajah X-Patchwork-Id: 54739 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-wi0-f198.google.com (mail-wi0-f198.google.com [209.85.212.198]) by patches.linaro.org (Postfix) with ESMTPS id 01F1A22DB6 for ; Sun, 11 Oct 2015 10:36:09 +0000 (UTC) Received: by wicgi15 with SMTP id gi15sf40679997wic.2 for ; Sun, 11 Oct 2015 03:36:08 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:delivered-to:mailing-list:precedence:list-id :list-unsubscribe:list-archive:list-post:list-help:sender :delivered-to:subject:to:references:cc:from:message-id:date :user-agent:mime-version:in-reply-to:content-type:x-original-sender :x-original-authentication-results; bh=zQCckYm7xEiGH9rpxGQVjmuB3LDyUgCZvXb7ciYVGeE=; b=VA9ibBTkUNMtDYtazmbCF6ES3y0fycNM4Jgte9Dyjkr0YStgkRrJSg0ZlQ2Y1+o3VJ 4YOB8vNTL9+/m1KJBVCuBFrushmkudDz33bALaY7iIEQJtqFx9kHGSZKJ6lpQawb8Go0 KW4MRcgMFwnhy7PbPZPfN72MnMlYcAnEpstajrR3V3dS9AjEV2QNIJsB65GiTm24oI31 z5hAsmm9mNSwbsRKYqi85LA5Rb5uAyctwXTRwQsuH36kYl5empBxE6/jfoxFjegM+dLe oOA5cQeWPuKPqtS0tnXJerbrncTo7DZ0Pj9Os1NSwRfc896QdyF5HkHiIdUUzbzdtDZl SpCw== X-Gm-Message-State: ALoCoQnIgrbItKIoPPMXjg+8jXoSMjousUIhn8zpyPRFdI4R9wlulkcJocvn9KTaPdmUPWip6A3s X-Received: by 10.180.35.132 with SMTP id h4mr1658661wij.5.1444559768256; Sun, 11 Oct 2015 03:36:08 -0700 (PDT) X-BeenThere: patchwork-forward@linaro.org Received: by 10.25.31.207 with SMTP id f198ls464493lff.31.gmail; Sun, 11 Oct 2015 03:36:08 -0700 (PDT) X-Received: by 10.112.87.69 with SMTP id v5mr10355421lbz.70.1444559768100; Sun, 11 Oct 2015 03:36:08 -0700 (PDT) Received: from mail-lb0-x234.google.com (mail-lb0-x234.google.com. [2a00:1450:4010:c04::234]) by mx.google.com with ESMTPS id pf6si7379186lbc.166.2015.10.11.03.36.08 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 11 Oct 2015 03:36:08 -0700 (PDT) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 2a00:1450:4010:c04::234 as permitted sender) client-ip=2a00:1450:4010:c04::234; Received: by lbwr8 with SMTP id r8so117371855lbw.2 for ; Sun, 11 Oct 2015 03:36:08 -0700 (PDT) X-Received: by 10.112.64.72 with SMTP id m8mr9919262lbs.41.1444559767793; Sun, 11 Oct 2015 03:36:07 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patch@linaro.org Received: by 10.112.59.35 with SMTP id w3csp985371lbq; Sun, 11 Oct 2015 03:36:04 -0700 (PDT) X-Received: by 10.68.181.130 with SMTP id dw2mr27803442pbc.70.1444559764687; Sun, 11 Oct 2015 03:36:04 -0700 (PDT) Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id bz7si17392966pab.40.2015.10.11.03.36.04 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 11 Oct 2015 03:36:04 -0700 (PDT) Received-SPF: pass (google.com: domain of gcc-patches-return-409849-patch=linaro.org@gcc.gnu.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Received: (qmail 87985 invoked by alias); 11 Oct 2015 10:35:52 -0000 Mailing-List: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org Precedence: list 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 87971 invoked by uid 89); 11 Oct 2015 10:35:51 -0000 X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.4 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 X-HELO: mail-pa0-f47.google.com Received: from mail-pa0-f47.google.com (HELO mail-pa0-f47.google.com) (209.85.220.47) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Sun, 11 Oct 2015 10:35:49 +0000 Received: by padhy16 with SMTP id hy16so127524179pad.1 for ; Sun, 11 Oct 2015 03:35:47 -0700 (PDT) X-Received: by 10.66.97.73 with SMTP id dy9mr27556560pab.115.1444559747352; Sun, 11 Oct 2015 03:35:47 -0700 (PDT) Received: from [10.1.1.2] (58-6-183-210.dyn.iinet.net.au. [58.6.183.210]) by smtp.googlemail.com with ESMTPSA id tb9sm12345179pab.13.2015.10.11.03.35.44 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 11 Oct 2015 03:35:46 -0700 (PDT) Subject: Re: [1/7] Add new tree code SEXT_EXPR To: Richard Biener References: <55ECFC2A.7050908@linaro.org> <55ECFC9C.8050204@linaro.org> Cc: "gcc-patches@gcc.gnu.org" From: Kugan Message-ID: <561A3B7E.2060405@linaro.org> Date: Sun, 11 Oct 2015 21:35:42 +1100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.3.0 MIME-Version: 1.0 In-Reply-To: X-IsSubscribed: yes X-Original-Sender: kugan.vivekanandarajah@linaro.org X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 2a00:1450:4010:c04::234 as permitted sender) smtp.mailfrom=patch+caf_=patchwork-forward=linaro.org@linaro.org; dkim=pass header.i=@gcc.gnu.org X-Google-Group-Id: 836684582541 On 15/09/15 23:18, Richard Biener wrote: > On Mon, Sep 7, 2015 at 4:55 AM, Kugan wrote: >> >> This patch adds support for new tree code SEXT_EXPR. > > diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c > index d567a87..bbc3c10 100644 > --- a/gcc/cfgexpand.c > +++ b/gcc/cfgexpand.c > @@ -5071,6 +5071,10 @@ expand_debug_expr (tree exp) > case FMA_EXPR: > return simplify_gen_ternary (FMA, mode, inner_mode, op0, op1, op2); > > + case SEXT_EXPR: > + return op0; > > that looks wrong. Generate (sext:... ) here? > > + case SEXT_EXPR: > + { > + rtx op0 = expand_normal (treeop0); > + rtx temp; > + if (!target) > + target = gen_reg_rtx (TYPE_MODE (TREE_TYPE (treeop0))); > + > + machine_mode inner_mode > + = smallest_mode_for_size (tree_to_shwi (treeop1), > + MODE_INT); > + temp = convert_modes (inner_mode, > + TYPE_MODE (TREE_TYPE (treeop0)), op0, 0); > + convert_move (target, temp, 0); > + return target; > + } > > Humm - is that really how we expand sign extensions right now? No helper > that would generate (sext ...) directly? I wouldn't try using 'target' btw but > simply return (sext:mode op0 op1) or so. But I am no way an RTL expert. > > Note that if we don't disallow arbitrary precision SEXT_EXPRs we have to > fall back to using shifts (and smallest_mode_for_size is simply wrong). > > + case SEXT_EXPR: > + { > + if (!INTEGRAL_TYPE_P (lhs_type) > + || !INTEGRAL_TYPE_P (rhs1_type) > + || TREE_CODE (rhs2) != INTEGER_CST) > > please constrain this some more, with > > || !useless_type_conversion_p (lhs_type, rhs1_type) > > + { > + error ("invalid operands in sext expr"); > + return true; > + } > + return false; > + } > > @@ -3414,6 +3422,9 @@ op_symbol_code (enum tree_code code) > case MIN_EXPR: > return "min"; > > + case SEXT_EXPR: > + return "sext from bit"; > + > > just "sext" please. > > +/* Sign-extend operation. It will sign extend first operand from > + the sign bit specified by the second operand. */ > +DEFTREECODE (SEXT_EXPR, "sext_expr", tcc_binary, 2) > > "from the INTEGER_CST sign bit specified" > > Also add "The type of the result is that of the first operand." > Thanks for the review. Attached patch attempts to address the above comments. Does this look better? Thanks, Kugan >From 2326daf0e7088e01e87574c9824b1c7248395798 Mon Sep 17 00:00:00 2001 From: Kugan Vivekanandarajah Date: Mon, 17 Aug 2015 13:37:15 +1000 Subject: [PATCH 1/7] Add new SEXT_EXPR tree code --- gcc/cfgexpand.c | 10 ++++++++++ gcc/expr.c | 20 ++++++++++++++++++++ gcc/fold-const.c | 4 ++++ gcc/tree-cfg.c | 13 +++++++++++++ gcc/tree-inline.c | 1 + gcc/tree-pretty-print.c | 11 +++++++++++ gcc/tree.def | 5 +++++ 7 files changed, 64 insertions(+) diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c index 58e55d2..dea0e37 100644 --- a/gcc/cfgexpand.c +++ b/gcc/cfgexpand.c @@ -5057,6 +5057,16 @@ expand_debug_expr (tree exp) case FMA_EXPR: return simplify_gen_ternary (FMA, mode, inner_mode, op0, op1, op2); + case SEXT_EXPR: + gcc_assert (CONST_INT_P (op1)); + inner_mode = mode_for_size (INTVAL (op1), MODE_INT, 0); + if (mode != inner_mode) + op0 = simplify_gen_unary (SIGN_EXTEND, + mode, + gen_lowpart_SUBREG (inner_mode, op0), + inner_mode); + return op0; + default: flag_unsupported: #ifdef ENABLE_CHECKING diff --git a/gcc/expr.c b/gcc/expr.c index 0bbfccd..30898a2 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -9296,6 +9296,26 @@ expand_expr_real_2 (sepops ops, rtx target, machine_mode tmode, target = expand_vec_cond_expr (type, treeop0, treeop1, treeop2, target); return target; + case SEXT_EXPR: + { + machine_mode inner_mode = mode_for_size (tree_to_shwi (treeop1), + MODE_INT, 0); + rtx temp, result; + rtx op0 = expand_normal (treeop0); + op0 = force_reg (mode, op0); + if (mode != inner_mode) + { + result = gen_reg_rtx (mode); + temp = simplify_gen_unary (SIGN_EXTEND, mode, + gen_lowpart_SUBREG (inner_mode, op0), + inner_mode); + convert_move (result, temp, 0); + } + else + result = op0; + return result; + } + default: gcc_unreachable (); } diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 7231fd6..d693b42 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -984,6 +984,10 @@ int_const_binop_1 (enum tree_code code, const_tree arg1, const_tree parg2, res = wi::bit_and (arg1, arg2); break; + case SEXT_EXPR: + res = wi::sext (arg1, arg2.to_uhwi ()); + break; + case RSHIFT_EXPR: case LSHIFT_EXPR: if (wi::neg_p (arg2)) diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index 712d8cc..97da2f3 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -3756,6 +3756,19 @@ verify_gimple_assign_binary (gassign *stmt) return false; } + case SEXT_EXPR: + { + if (!INTEGRAL_TYPE_P (lhs_type) + || !useless_type_conversion_p (lhs_type, rhs1_type) + || !INTEGRAL_TYPE_P (rhs1_type) + || TREE_CODE (rhs2) != INTEGER_CST) + { + error ("invalid operands in sext expr"); + return true; + } + return false; + } + case VEC_WIDEN_LSHIFT_HI_EXPR: case VEC_WIDEN_LSHIFT_LO_EXPR: { diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index ac9586e..0975730 100644 --- a/gcc/tree-inline.c +++ b/gcc/tree-inline.c @@ -3884,6 +3884,7 @@ estimate_operator_cost (enum tree_code code, eni_weights *weights, case BIT_XOR_EXPR: case BIT_AND_EXPR: case BIT_NOT_EXPR: + case SEXT_EXPR: case TRUTH_ANDIF_EXPR: case TRUTH_ORIF_EXPR: diff --git a/gcc/tree-pretty-print.c b/gcc/tree-pretty-print.c index 7cd1fe7..efd8d5b 100644 --- a/gcc/tree-pretty-print.c +++ b/gcc/tree-pretty-print.c @@ -1794,6 +1794,14 @@ dump_generic_node (pretty_printer *pp, tree node, int spc, int flags, } break; + case SEXT_EXPR: + pp_string (pp, "SEXT_EXPR <"); + dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false); + pp_string (pp, ", "); + dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false); + pp_greater (pp); + break; + case MODIFY_EXPR: case INIT_EXPR: dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, @@ -3414,6 +3422,9 @@ op_symbol_code (enum tree_code code) case MIN_EXPR: return "min"; + case SEXT_EXPR: + return "sext"; + default: return "<<< ??? >>>"; } diff --git a/gcc/tree.def b/gcc/tree.def index 56580af..48e7413 100644 --- a/gcc/tree.def +++ b/gcc/tree.def @@ -752,6 +752,11 @@ DEFTREECODE (BIT_XOR_EXPR, "bit_xor_expr", tcc_binary, 2) DEFTREECODE (BIT_AND_EXPR, "bit_and_expr", tcc_binary, 2) DEFTREECODE (BIT_NOT_EXPR, "bit_not_expr", tcc_unary, 1) +/* Sign-extend operation. It will sign extend first operand from + the sign bit specified by the second operand. The type of the + result is that of the first operand. */ +DEFTREECODE (SEXT_EXPR, "sext_expr", tcc_binary, 2) + /* ANDIF and ORIF allow the second operand not to be computed if the value of the expression is determined from the first operand. AND, OR, and XOR always compute the second operand whether its value is -- 1.9.1