From patchwork Fri Nov 17 09:19:29 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Sandiford X-Patchwork-Id: 119106 Delivered-To: patch@linaro.org Received: by 10.140.22.164 with SMTP id 33csp282159qgn; Fri, 17 Nov 2017 01:20:49 -0800 (PST) X-Google-Smtp-Source: AGs4zMYzGiS3HsdwQojvevlfCCrGxO+0kMwAZMhH0aQhQZwKlu5CH3jBKe0jBkh4yftfv4FdYX6E X-Received: by 10.84.130.6 with SMTP id 6mr4745609plc.402.1510910449111; Fri, 17 Nov 2017 01:20:49 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1510910449; cv=none; d=google.com; s=arc-20160816; b=xSzAyk1sqb4P9YzBtpI0Nql+6fL26oO+0tq6q33jsUgkRkHnKrDCuwo5pSB4gub57a ID3gr/JzqzzfRGvsgpSmAPiPOIlvMiZwOrjyvyOEGm7LIB5Fc7q46yKm4pYGbQC7LoTu OQszY07Ngcimk0L0H8qLPbLWmCqQchbKFMR3ATVdkBNySxWJYCKbvR062NfsgwSDvDQm 10PevI9KZJemSPmLZoIQ3eSGADOkk/eSKmIodDsCawK559acOOwb4IZq+Q/eDd3Ayrl0 iDcVQkGJlxG0CET+ywvH0f4O+LJtnrYqAjWdXOyiV/EANw1bWcRUANuFOP23McX8SRX6 J2fw== 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=jqExs+fIDINSdmFXJdV1MMhRiaC8MxGnaqrzcUBlQgk=; b=sGSHJ2lJQZbt7+Zj18uNAldLDppOQ5soyFEEkd7m79dfTvhNIV89/ev8uilahvZ63D kB9v5dN+hy7G3mqRu9uY5T6/xKmV2zjEDgNeBTxg1lJ5NMgbuMbxuxQuQ6DSSq8ZSMAa jB+Or3aLvfY6rSdKfjT9s7MR3vLM5+yC1wtg7FoOzZAx2L1n7AcIDB0K3vmZ+Hw6Z/1M j2iViHzBhxPgJiXMb4iI6l0F/TgvcmtcjmOYm0FV7Xo8IDbcF8T4mbOdQUCkngG/P1Fq GVdbEtamEc58bscAV2/61KdEERH0eDIidMxCVhKyxAzw0A/g5uouo+xyDBzmxdNrZ++I XLoA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b=a8xxiObL; spf=pass (google.com: domain of gcc-patches-return-467099-patch=linaro.org@gcc.gnu.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=gcc-patches-return-467099-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 h185si2386612pgc.724.2017.11.17.01.20.48 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 17 Nov 2017 01:20:49 -0800 (PST) Received-SPF: pass (google.com: domain of gcc-patches-return-467099-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=a8xxiObL; spf=pass (google.com: domain of gcc-patches-return-467099-patch=linaro.org@gcc.gnu.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=gcc-patches-return-467099-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=UDRS4VoC88S2eFJ+s7WYXtyPXSUS6 mhNVCbq9mibolGTV3Oi5sSvL3WEIrrgFQZ0gnPgYURDcDDerFEfmFw8Py3uoxU1e wFRed/v1LuQpRnT7EyQMo305FHMriljzbGOoBnydqdqTOZRroiy/JrlrI4pKfh0n f/JnMDeDFL2qus= 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=8NdxIpWvI/iJVd145zTCASjDb34=; b=a8x xiObLlMgLvP6IK34o2i2LRxd1s2XhR24dpYa3HDG7Ngwf7iAKBuT5S2woqnGtPcP Zhfc6XeLTMtLF8WJ71Pf3oWxMn7pOPZ+vRbMOyu6NdBMitql1uzPhFycZd2PrQ3O HAjUZVhDjcxn0w84P5ZG5RsIWn0gGhP/SGGcornA= Received: (qmail 119579 invoked by alias); 17 Nov 2017 09:19:33 -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 119531 invoked by uid 89); 17 Nov 2017 09:19:33 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-11.5 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_2, GIT_PATCH_3, KB_WAM_FROM_NAME_SINGLEWORD, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy= X-HELO: mail-wr0-f172.google.com Received: from mail-wr0-f172.google.com (HELO mail-wr0-f172.google.com) (209.85.128.172) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 17 Nov 2017 09:19:31 +0000 Received: by mail-wr0-f172.google.com with SMTP id o14so1504312wrf.9 for ; Fri, 17 Nov 2017 01:19:30 -0800 (PST) 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=jqExs+fIDINSdmFXJdV1MMhRiaC8MxGnaqrzcUBlQgk=; b=XTqakcYkhKJmQ/kkwQoSslv8hMTrO3e/d9uVzqen4SrgtvywRVfbwxOKgtlXentJIx FjSpuVymXEQ1uwa/kydjWq2+h/CBZh/bFcNWEICLeQ8ljSSA3C2R1YT5YE/sR9C8YbV2 PaBGdsUkJXb3sNeSdGhjWanr88S9LMsJHj7QPDRxIYaB79TSug2dIJTGEVLnpJ8vBwyF WEAq47X7ovQPLahbCrDSVsW4qg7hlTutsxjEfnLBGpMdejWXdZNvypwiBjIv2P470/NC bGIej2M8xZzK/OW69B7ixguU8oEegvVNbqeG3skU2xFC/Pa0vE3dc+dsFgUOYL/xtsCf jRJQ== X-Gm-Message-State: AJaThX6kpq6TowDI7lElF/YTtUQ+n1gflp7Un4e25/QylG26PXsgVUyf Ftg9m124bdBlPAC8LKCaUrYnWkqYB3s= X-Received: by 10.223.163.143 with SMTP id l15mr4113422wrb.149.1510910368976; Fri, 17 Nov 2017 01:19:28 -0800 (PST) Received: from localhost ([2.25.234.120]) by smtp.gmail.com with ESMTPSA id m8sm2310130wrg.55.2017.11.17.01.19.28 for (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Fri, 17 Nov 2017 01:19:28 -0800 (PST) From: Richard Sandiford To: gcc-patches@gcc.gnu.org Mail-Followup-To: gcc-patches@gcc.gnu.org, richard.sandiford@linaro.org Subject: [5/7] Split out gather load mask building References: <87375d2rkr.fsf@linaro.org> Date: Fri, 17 Nov 2017 09:19:29 +0000 In-Reply-To: <87375d2rkr.fsf@linaro.org> (Richard Sandiford's message of "Fri, 17 Nov 2017 09:16:20 +0000") Message-ID: <87h8tt1cv2.fsf@linaro.org> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.3 (gnu/linux) MIME-Version: 1.0 This patch splits out the code to build an all-bits-one or all-bits-zero input to a gather load. The catch is that both masks can have floating-point type, in which case they are implicitly treated in the same way as an integer bitmask. Richard 2017-11-17 Richard Sandiford gcc/ * tree-vect-stmts.c (vect_build_all_ones_mask) (vect_build_zero_merge_argument): New functions, split out from... (vectorizable_load): ...here. Index: gcc/tree-vect-stmts.c =================================================================== --- gcc/tree-vect-stmts.c 2017-11-17 09:06:53.395522598 +0000 +++ gcc/tree-vect-stmts.c 2017-11-17 09:06:56.444527585 +0000 @@ -2140,6 +2140,59 @@ vect_check_store_rhs (gimple *stmt, tree return true; } +/* Build an all-ones vector mask of type MASKTYPE while vectorizing STMT. + Note that we support masks with floating-point type, in which case the + floats are interpreted as a bitmask. */ + +static tree +vect_build_all_ones_mask (gimple *stmt, tree masktype) +{ + if (TREE_CODE (masktype) == INTEGER_TYPE) + return build_int_cst (masktype, -1); + else if (TREE_CODE (TREE_TYPE (masktype)) == INTEGER_TYPE) + { + tree mask = build_int_cst (TREE_TYPE (masktype), -1); + mask = build_vector_from_val (masktype, mask); + return vect_init_vector (stmt, mask, masktype, NULL); + } + else if (SCALAR_FLOAT_TYPE_P (TREE_TYPE (masktype))) + { + REAL_VALUE_TYPE r; + long tmp[6]; + for (int j = 0; j < 6; ++j) + tmp[j] = -1; + real_from_target (&r, tmp, TYPE_MODE (TREE_TYPE (masktype))); + tree mask = build_real (TREE_TYPE (masktype), r); + mask = build_vector_from_val (masktype, mask); + return vect_init_vector (stmt, mask, masktype, NULL); + } + gcc_unreachable (); +} + +/* Build an all-zero merge value of type VECTYPE while vectorizing + STMT as a gather load. */ + +static tree +vect_build_zero_merge_argument (gimple *stmt, tree vectype) +{ + tree merge; + if (TREE_CODE (TREE_TYPE (vectype)) == INTEGER_TYPE) + merge = build_int_cst (TREE_TYPE (vectype), 0); + else if (SCALAR_FLOAT_TYPE_P (TREE_TYPE (vectype))) + { + REAL_VALUE_TYPE r; + long tmp[6]; + for (int j = 0; j < 6; ++j) + tmp[j] = 0; + real_from_target (&r, tmp, TYPE_MODE (TREE_TYPE (vectype))); + merge = build_real (TREE_TYPE (vectype), r); + } + else + gcc_unreachable (); + merge = build_vector_from_val (vectype, merge); + return vect_init_vector (stmt, merge, vectype, NULL); +} + /* Function vectorizable_mask_load_store. Check if STMT performs a conditional load or store that can be vectorized. @@ -6990,45 +7043,9 @@ vectorizable_load (gimple *stmt, gimple_ /* Currently we support only unconditional gather loads, so mask should be all ones. */ - if (TREE_CODE (masktype) == INTEGER_TYPE) - mask = build_int_cst (masktype, -1); - else if (TREE_CODE (TREE_TYPE (masktype)) == INTEGER_TYPE) - { - mask = build_int_cst (TREE_TYPE (masktype), -1); - mask = build_vector_from_val (masktype, mask); - mask = vect_init_vector (stmt, mask, masktype, NULL); - } - else if (SCALAR_FLOAT_TYPE_P (TREE_TYPE (masktype))) - { - REAL_VALUE_TYPE r; - long tmp[6]; - for (j = 0; j < 6; ++j) - tmp[j] = -1; - real_from_target (&r, tmp, TYPE_MODE (TREE_TYPE (masktype))); - mask = build_real (TREE_TYPE (masktype), r); - mask = build_vector_from_val (masktype, mask); - mask = vect_init_vector (stmt, mask, masktype, NULL); - } - else - gcc_unreachable (); - + mask = vect_build_all_ones_mask (stmt, masktype); scale = build_int_cst (scaletype, gs_info.scale); - - if (TREE_CODE (TREE_TYPE (rettype)) == INTEGER_TYPE) - merge = build_int_cst (TREE_TYPE (rettype), 0); - else if (SCALAR_FLOAT_TYPE_P (TREE_TYPE (rettype))) - { - REAL_VALUE_TYPE r; - long tmp[6]; - for (j = 0; j < 6; ++j) - tmp[j] = 0; - real_from_target (&r, tmp, TYPE_MODE (TREE_TYPE (rettype))); - merge = build_real (TREE_TYPE (rettype), r); - } - else - gcc_unreachable (); - merge = build_vector_from_val (rettype, merge); - merge = vect_init_vector (stmt, merge, rettype, NULL); + merge = vect_build_zero_merge_argument (stmt, rettype); prev_stmt_info = NULL; for (j = 0; j < ncopies; ++j)