From patchwork Fri Apr 26 23:10:12 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christophe Lyon X-Patchwork-Id: 89070 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 D2CF9384AB45 for ; Fri, 26 Apr 2024 23:10:52 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mail-oi1-x22d.google.com (mail-oi1-x22d.google.com [IPv6:2607:f8b0:4864:20::22d]) by sourceware.org (Postfix) with ESMTPS id 7399B3858C42 for ; Fri, 26 Apr 2024 23:10:17 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 7399B3858C42 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=linaro.org ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 7399B3858C42 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2607:f8b0:4864:20::22d ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1714173019; cv=none; b=r9hV30VcjL5OoL/zSOhVUVow0Fo7YIL/wMOQKKjdh4w6a7nysPtIg5FlmD9l5tWdu0ETk0F9qsjHgD/dx+XlU7nheBZFukNOq6/3vG64mI8W2B9zlv0mwjNFOa3/EkVS7cE3GPEgPNW+afC+KbycH8SG+IPIAVh7dlWGFReGJLU= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1714173019; c=relaxed/simple; bh=Gmr+bvwWWvJ913DKW+PQoMxGIXlOC/z80v/r6w5BgsI=; h=DKIM-Signature:From:To:Subject:Date:Message-Id:MIME-Version; b=BdTaRHTZwIqfYZNvzSeQaTsHMoKE3181hWOsAXpga+Fm1LwG0qnOpGBi4rBy0TZtCmNFMj3nm0kuUFSSCre22t/gTc2OAfDn165DF+A+jXUX8jxl2fs1edIkItpOUhNdg+0wwoYkiPBu9vqWiyMHM0WPobvzyoxfd/2yNEqb2kU= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-oi1-x22d.google.com with SMTP id 5614622812f47-3c74a75d9adso1816446b6e.0 for ; Fri, 26 Apr 2024 16:10:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1714173016; x=1714777816; darn=gcc.gnu.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=5WtCGyhpZ+O7mKHuIlRLvR3PmEplAbGagIQ0Y2PdgJc=; b=o+fVs3BY7sLzN1kJpbrFrkbBW6KalYBJBKQgGlxJu7GWDuUtC9oaZUstH5sTZOvV1B ya9Rty/U4wjyRgpNESycTu4wbM0BAqWjCEIiCqkmMuAr87nmbGWwgn3uwyyDD4amdhzt JAhev2pTrl/jsbvSp0IgOTfIqv9A/RAUxoF3N4HlgD46do9nNQMxrb09vdt3CG05uQbN Y+ZiAfDV08fIsJeHPxM4ipwtjEgXhIWJfM0jzAfoYYPTgskn+DNg17+qEcJxaKc8+yU2 ofjZxFaDp+scb0ugnelqGkYskFdx6nJzsn6sLRGsGtfSilOchkMcEzv5ziTKTlgosLrK 42dQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1714173016; x=1714777816; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=5WtCGyhpZ+O7mKHuIlRLvR3PmEplAbGagIQ0Y2PdgJc=; b=g4jneZYInHJPoWTgdKR9yc9DlrwUX+/gtOTsmNBccURfm99lilMv5Tv3Gu361jl3NZ 7dHya6UbnsQ9ssXay/ts4We5AzwM6pX3V7QTGATZneBZSk3YJxkshf3nRWwRDJ2bwrlf HzKi3nkN7ifyQvTgSQWdGQJ3Hicx4doGWccWr17x1kQfqVrRjIIqP0gOZOKInzNHRfgS pCw9ctmdifmE2vZ9G7ri7wGv1tpGn0bxH3ednX788DUOLA+J/r5MYCdh45Ciei3SU6FP 93Uw40unTie+qzKDfpUgZRg9qE9iGPcBALCiJwJwH2jmaymwoNPaoG5UakR7lkUFcryk 9N1Q== X-Gm-Message-State: AOJu0YzUbxPd0FEtXdpidU84EMcnm4JcVJuaiE3Ayga36DdvsLdgNbBX mG6Yif6E7GWo74kMSKqzl31DUqb/7t9lzj7DaS5E4f4C5Z/S5FUyPVBbiN7ZK+A9rClB1MoRkHR b1eY= X-Google-Smtp-Source: AGHT+IHEJiK9mq/IqLXS08xIMW1v5/KBmCCUEIqBppDnqWu72daUxWUQtOLim7pUPX68EEvaeBPkoA== X-Received: by 2002:a05:6870:9449:b0:23b:dd9b:79e4 with SMTP id e9-20020a056870944900b0023bdd9b79e4mr2645084oal.3.1714173015916; Fri, 26 Apr 2024 16:10:15 -0700 (PDT) Received: from localhost.localdomain ([139.178.84.207]) by smtp.gmail.com with ESMTPSA id hz12-20020a05687153cc00b0023be82cde3fsm230401oac.20.2024.04.26.16.10.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 26 Apr 2024 16:10:15 -0700 (PDT) From: Christophe Lyon To: gcc-patches@gcc.gnu.org, richard.sandiford@arm.com, richard.earnshaw@arm.com, jakub@redhat.com Cc: Christophe Lyon Subject: [PATCH] arm: [MVE intrinsics] Fix support for predicate constants [PR target/114801] Date: Fri, 26 Apr 2024 23:10:12 +0000 Message-Id: <20240426231012.2588918-1-christophe.lyon@linaro.org> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 X-Spam-Status: No, score=-12.6 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org In this PR, we have to handle a case where MVE predicates are supplied as a const_int, where individual predicates have illegal boolean values (such as 0xc for a 4-bit boolean predicate). To avoid the ICE, we canonicalize them, replacing a non-null value with -1. 2024-04-26 Christophe Lyon Jakub Jelinek PR target/114801 gcc/ * config/arm/arm-mve-builtins.cc (function_expander::add_input_operand): Handle CONST_INT predicates. gcc/testsuite/ * gcc.target/arm/mve/pr114801.c: New test. --- gcc/config/arm/arm-mve-builtins.cc | 21 +++++++++++- gcc/testsuite/gcc.target/arm/mve/pr114801.c | 36 +++++++++++++++++++++ 2 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.target/arm/mve/pr114801.c diff --git a/gcc/config/arm/arm-mve-builtins.cc b/gcc/config/arm/arm-mve-builtins.cc index 6a5775c67e5..f338ab36434 100644 --- a/gcc/config/arm/arm-mve-builtins.cc +++ b/gcc/config/arm/arm-mve-builtins.cc @@ -43,6 +43,7 @@ #include "stringpool.h" #include "attribs.h" #include "diagnostic.h" +#include "rtx-vector-builder.h" #include "arm-protos.h" #include "arm-builtins.h" #include "arm-mve-builtins.h" @@ -2205,7 +2206,25 @@ function_expander::add_input_operand (insn_code icode, rtx x) mode = GET_MODE (x); } else if (VALID_MVE_PRED_MODE (mode)) - x = gen_lowpart (mode, x); + { + if (CONST_INT_P (x) && (mode == V8BImode || mode == V4BImode)) + { + /* In V8BI or V4BI each element has 2 or 4 bits, if those + bits aren't all the same, it is UB and gen_lowpart might + ICE. Canonicalize all the 2 or 4 bits to all ones if any + of them is non-zero. */ + unsigned HOST_WIDE_INT xi = UINTVAL (x); + xi |= ((xi & 0x5555) << 1) | ((xi & 0xaaaa) >> 1); + if (mode == V4BImode) + xi |= ((xi & 0x3333) << 2) | ((xi & 0xcccc) >> 2); + x = gen_int_mode (xi, HImode); + } + else if (SUBREG_P (x)) + /* gen_lowpart on a SUBREG can ICE. */ + x = force_reg (GET_MODE (x), x); + + x = gen_lowpart (mode, x); + } m_ops.safe_grow (m_ops.length () + 1, true); create_input_operand (&m_ops.last (), x, mode); diff --git a/gcc/testsuite/gcc.target/arm/mve/pr114801.c b/gcc/testsuite/gcc.target/arm/mve/pr114801.c new file mode 100644 index 00000000000..676b109f9b8 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/mve/pr114801.c @@ -0,0 +1,36 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target arm_v8_1m_mve_ok } */ +/* { dg-add-options arm_v8_1m_mve } */ +/* { dg-final { check-function-bodies "**" "" "" } } */ + +#include + +/* +** test_32: +**... +** mov r[0-9]+, #65535 @ movhi +**... +*/ +uint32x4_t test_32() { + return vdupq_m_n_u32(vdupq_n_u32(0), 0, 0xcccc); +} + +/* +** test_16: +**... +** mov r[0-9]+, #52428 @ movhi +**... +*/ +uint16x8_t test_16() { + return vdupq_m_n_u16(vdupq_n_u16(0), 0, 0xcccc); +} + +/* +** test_8: +**... +** mov r[0-9]+, #52428 @ movhi +**... +*/ +uint8x16_t test_8() { + return vdupq_m_n_u8(vdupq_n_u8(0), 0, 0xcccc); +}