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: 1562635 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.a=rsa-sha256 header.s=default header.b=VEQsFJ7b; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=8.43.85.97; helo=sourceware.org; envelope-from=gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Received: from sourceware.org (server2.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4J4Xns3z0Zz9s0r for ; Thu, 2 Dec 2021 21:51:43 +1100 (AEDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 24C9E3857C78 for ; Thu, 2 Dec 2021 10:51:40 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 24C9E3857C78 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1638442300; bh=6QdB2tDXJSyhNpm4FqB94L0EVFNGiCI6MFGRVTWivMU=; h=Date:Subject:To:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=VEQsFJ7bhvCzRRka0pCYSwGvgk+BsPAXMzMmTC1XJqFG/pc2MtKWM1jET+kfLY5aJ LdWmIPop/3r5D8//JTnXlaJHg2RzUxWfQQK0BqiZUgl/AuoLqOUwskLGJozG5lmspD LFvwQXkx4C5+Wyx5kHuhRg5Maq1LWB8OVefVH1mw= 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+incoming=patchwork.ozlabs.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