From patchwork Thu Dec 2 10:50:40 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Prathamesh Kulkarni X-Patchwork-Id: 48388 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 191993858D3C for ; Thu, 2 Dec 2021 10:51:49 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 191993858D3C DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1638442309; bh=6QdB2tDXJSyhNpm4FqB94L0EVFNGiCI6MFGRVTWivMU=; h=Date:Subject:To:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=U+L7ahkveXaSdmNGn4Cc9WppCxfiMCD1LARigbkQWwNjmUiwFf1ipQuybQR0E5MQi 0vjzYerfLNtL/XBhg5om/R2rD2T2zbsnSxKG0Es0U79bjn5rkxER/xOsRWd7JtLjzC 5IOG7ihO+065b1bsEvojIn/aaXO5bAE6D6+Wt0wY= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mail-ed1-x531.google.com (mail-ed1-x531.google.com [IPv6:2a00:1450:4864:20::531]) by sourceware.org (Postfix) with ESMTPS id 9E6523858D28 for ; Thu, 2 Dec 2021 10:51:17 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 9E6523858D28 Received: by mail-ed1-x531.google.com with SMTP id v1so114044320edx.2 for ; Thu, 02 Dec 2021 02:51:17 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=6QdB2tDXJSyhNpm4FqB94L0EVFNGiCI6MFGRVTWivMU=; b=8HElwyK1fUZraOdwJNRTY0p/66SxD8hVAkjoXmynp1mm7fAFdLGOU5J8yFJkJu1jVR EJkU7qTj9NYHiSxEDDzAXowzl3P34jnE7bP19S4QCARQYOKdIbVjwPqUp/EkeKzXcWFg diqRAOZcxvlQhJ19GFmlGHWKsCieO3ZVZV7+7L5wJnIzrcS/TuJ66I5Cgy6W19D2prU0 r0IEbj4zhAGGXVzLcvVAo1iZfG3nhH3q+Y/iOfSPBmo6ofxmj1UEvwWT02rzNjQO1g6j AZIrmsLJWVFo/ri3U4TU4bAlpxHu6NMQHmFNe7rJ5scNxWvfvRBeAKGhdCcg6b2763RL ywZQ== X-Gm-Message-State: AOAM532bBffeGEFbrmsyWbo+Mcxb72QhnHiFGV7g5dPESBUz8rr8Y4Us 0bHBOeXY17cewee5USAzVe8AVgpxJjcFqtZPBZWF+AbqZZw= X-Google-Smtp-Source: ABdhPJzFUIDTdTKEjb9b9BEgJp3YeRv0uUrd74o01+yeI8ntaBmAo8ONn2ZUhPgpEyiKkydA1KJ9msYEgZTBkaW4Bu0= X-Received: by 2002:a17:906:b51:: with SMTP id v17mr14882220ejg.262.1638442276261; Thu, 02 Dec 2021 02:51:16 -0800 (PST) MIME-Version: 1.0 Date: Thu, 2 Dec 2021 16:20:40 +0530 Message-ID: Subject: [SVE] PR96463 - Optimise svld1rq from vectors To: gcc Patches , Richard Sandiford X-Spam-Status: No, score=-9.0 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Prathamesh Kulkarni via Gcc-patches From: Prathamesh Kulkarni Reply-To: Prathamesh Kulkarni Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" Hi Richard, I have attached a WIP untested patch for PR96463. IIUC, the PR suggests to transform lhs = svld1rq ({-1, -1, ...}, &v[0]) into: lhs = vec_perm_expr if v is vector of 4 elements, and each element is 32 bits on little endian target ? I am sorry if this sounds like a silly question, but I am not sure how to convert a vector of type int32x4_t into svint32_t ? In the patch, I simply used NOP_EXPR (which I expected to fail), and gave type error during gimple verification: svint32_t foo (int32x4_t x) { return svld1rq (svptrue_b8 (), &x[0]); } transformed to: EMERGENCY DUMP: svint32_t foo (int32x4_t x) { svint32_t _3; __Int32x4_t _4; : _4 = VEC_PERM_EXPR ; _3 = (svint32_t) _4; return _3; } and ICE's with: pr96463.c:8:1: error: invalid vector types in nop conversion 8 | } | ^ svint32_t __Int32x4_t _3 = (svint32_t) _4; during GIMPLE pass: ccp Could you please suggest how to proceed ? Thanks, Prathamesh diff --git a/gcc/config/aarch64/aarch64-sve-builtins-base.cc b/gcc/config/aarch64/aarch64-sve-builtins-base.cc index 02e42a71e5e..3834f33443a 100644 --- a/gcc/config/aarch64/aarch64-sve-builtins-base.cc +++ b/gcc/config/aarch64/aarch64-sve-builtins-base.cc @@ -44,6 +44,13 @@ #include "aarch64-sve-builtins-shapes.h" #include "aarch64-sve-builtins-base.h" #include "aarch64-sve-builtins-functions.h" +#include "print-tree.h" +#include "gimple-pretty-print.h" + +/* ??? Including tree-ssanames.h requires including other header dependencies. + Just including the prototype for now. */ +extern tree make_ssa_name_fn (struct function *, tree, gimple *, + unsigned int version = 0); using namespace aarch64_sve; @@ -1207,6 +1214,52 @@ public: insn_code icode = code_for_aarch64_sve_ld1rq (e.vector_mode (0)); return e.use_contiguous_load_insn (icode); } + + gimple * + fold (gimple_folder &f) const OVERRIDE + { + tree arg0 = gimple_call_arg (f.call, 0); + tree arg1 = gimple_call_arg (f.call, 1); + + /* Transform: + lhs = svld1rq ({-1, -1, ... }, &v[0]) + into: + tmp = vec_perm_expr. + lhs = nop_expr tmp + on little endian target. */ + + if (!BYTES_BIG_ENDIAN + && integer_all_onesp (arg0) + && TREE_CODE (arg1) == ADDR_EXPR) + { + tree t = TREE_OPERAND (arg1, 0); + if (TREE_CODE (t) == ARRAY_REF) + { + tree index = TREE_OPERAND (t, 1); + t = TREE_OPERAND (t, 0); + if (integer_zerop (index) && TREE_CODE (t) == VIEW_CONVERT_EXPR) + { + t = TREE_OPERAND (t, 0); + tree vectype = TREE_TYPE (t); + if (VECTOR_TYPE_P (vectype) + && known_eq (TYPE_VECTOR_SUBPARTS (vectype), 4u) + && wi::to_wide (TYPE_SIZE (vectype)) == 128) + { + tree new_temp = ::make_ssa_name_fn (cfun, vectype, NULL); + tree zero_vec = build_vector_from_val (vectype, index); + gimple *g = gimple_build_assign (new_temp, VEC_PERM_EXPR, t, t, zero_vec); + /* ??? How to convert between vector types if gimple_call_lhs (f.call) and + new_temp have different types ? */ + gimple *g2 = gimple_build_assign (gimple_call_lhs (f.call), NOP_EXPR, new_temp); + gsi_insert_before (f.gsi, g, GSI_SAME_STMT); + return g2; + } + } + } + } + + return NULL; + } }; class svld1ro_impl : public load_replicate