From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-ej1-x630.google.com (mail-ej1-x630.google.com [IPv6:2a00:1450:4864:20::630]) by sourceware.org (Postfix) with ESMTPS id 9807F3858D28 for ; Mon, 17 Oct 2022 14:45:39 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 9807F3858D28 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-ej1-x630.google.com with SMTP id d26so25423201eje.10 for ; Mon, 17 Oct 2022 07:45:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=16+w4MlFzJOQeFqNBCXxhuVPRNqlvbN8CGLDNpwm0oI=; b=LHOPG37vxaJhxZ8AHq8CZUYGc6olIaAM4ELgCL6rNUMWnt4kdVUbP6vPNcAqWSSW3w hS606n6Clv9SuQvIgOxxMSZ2vLkwLsHFPKivtxOMW8vTPd6wiq6SF4KfGJpORnzhG24L +nWYq0oPg/uFatNwe8zcRm3pZER1HkisgcAXdTVfOc0cKy50xuN06lHXrukuFcIy5Sy7 OAuI4Wnq+xg/sG1Jcnf3llo4YaZYOBWsL/4psL1Sxn96bMYI0wGzHkqjfj2023UpnLfE PlV+hywybQOZP5H/v18tZa6vfZyCs7oH4idoJ66JG6YokrROmyQ9ZG4kj7oWas/H3d/b stYA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; 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=16+w4MlFzJOQeFqNBCXxhuVPRNqlvbN8CGLDNpwm0oI=; b=6Sda+zIGJo5nv4f12H/a9mitUrsjTiarPzq7cd+JV9GMSJSNF6bwdttlfG7BvG/iFi 28K6PdZmuA+tY2pXaxX3uRpz2U/RqiljSZlYghvGyAK6wX2l0dsvuZt45dYHGSwu+CFd IDSoIgWlCH/7ikLETtSydTEgTzn51rsDkdk+n/r22ZcaJsJnzsdsCHOgr5l71jpve9Pz XvNtkq+59La3/WDdEOm+qW5kqi4Yqi6HJammk5amfSO7NBIQIz1xkCjpsvtewXLZtCEi qI23y9ppTX7mxFKPVG8PAVvCk2V1r6ODtvm5egE/4apfWHPfdaJSd1DluWmhg/bfPNFy IBaA== X-Gm-Message-State: ACrzQf28XqbT0pSkxeLToh6KsR4jSLNdNnJvJUFGSzZL45oa7W/StU1K bDK4yHZAsx218IEjGuLS5SyKMVqJGKo= X-Google-Smtp-Source: AMsMyM4YwzhQjKXOlcJabz0ptZHLKvACt4kRtzz+5G0z+1wIoqqxDTzR7E1u1zJBFikR2cyQ3d4XBg== X-Received: by 2002:a17:906:8447:b0:78d:776f:c544 with SMTP id e7-20020a170906844700b0078d776fc544mr9161031ejy.405.1666017938148; Mon, 17 Oct 2022 07:45:38 -0700 (PDT) Received: from server.. (138.sub226.ddfr.nl. [217.27.226.138]) by smtp.gmail.com with ESMTPSA id f19-20020a056402195300b00459cd13fd34sm7507723edz.85.2022.10.17.07.45.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 17 Oct 2022 07:45:37 -0700 (PDT) From: "J.W. Jagersma" To: gcc-patches@gcc.gnu.org Cc: "J.W. Jagersma" Subject: [PATCH] i386: Allow setting target attribute from conditional expression Date: Mon, 17 Oct 2022 16:44:37 +0200 Message-Id: <20221017144437.157424-1-jwjagersma@gmail.com> X-Mailer: git-send-email 2.35.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-17.5 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,GIT_PATCH_0,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 List-Id: Recently I tried to set a function's target attribute conditionally based on template parameters, eg.: template [[gnu::target (enable_sse ? "sse" : "")]] void func () { /* ... */ } I then discovered that this is currently not possible. This small patch resolves that. A possible alternative solution is to do this globally, eg. in decl_attributes. But doing so would trigger empty-string warnings from handle_target_attribute, and I don't know how safe it is to remove that. There likely isn't much use for this with other attributes, anyway. 2022-10-17 Jan W. Jagersma gcc/ChangeLog: * config/i386/i386-options.cc (ix86_valid_target_attribute_inner_p): Dereference args string from ADDR_EXPR. gcc/testsuite/ChangeLog: * g++.target/i386/target-attr-conditional.C: New test. --- gcc/config/i386/i386-options.cc | 9 ++++ .../g++.target/i386/target-attr-conditional.C | 53 +++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 gcc/testsuite/g++.target/i386/target-attr-conditional.C diff --git a/gcc/config/i386/i386-options.cc b/gcc/config/i386/i386-options.cc index acb2291e70f..915f3b0c1f0 100644 --- a/gcc/config/i386/i386-options.cc +++ b/gcc/config/i386/i386-options.cc @@ -1123,6 +1123,15 @@ ix86_valid_target_attribute_inner_p (tree fndecl, tree args, char *p_strings[], = fndecl == NULL ? UNKNOWN_LOCATION : DECL_SOURCE_LOCATION (fndecl); const char *attr_name = target_clone_attr ? "target_clone" : "target"; + args = tree_strip_nop_conversions (args); + + if (TREE_CODE (args) == ADDR_EXPR) + { + /* Attribute string is given by a constexpr function or conditional + expression. Dereference ADDR_EXPR, operand should be a STRING_CST. */ + args = TREE_OPERAND (args, 0); + } + /* If this is a list, recurse to get the options. */ if (TREE_CODE (args) == TREE_LIST) { diff --git a/gcc/testsuite/g++.target/i386/target-attr-conditional.C b/gcc/testsuite/g++.target/i386/target-attr-conditional.C new file mode 100644 index 00000000000..2d418ed90bf --- /dev/null +++ b/gcc/testsuite/g++.target/i386/target-attr-conditional.C @@ -0,0 +1,53 @@ +/* { dg-do compile } */ +/* { dg-options "-Wno-psabi -m32 -march=i386 -std=c++20" } */ + +#pragma GCC push_options +#pragma GCC target("sse") + +typedef int __m64 __attribute__ ((__vector_size__ (8), __may_alias__)); +typedef short __v4hi __attribute__ ((__vector_size__ (8))); + +extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__)) +_mm_extract_pi16 (__m64 const __A, int const __N) +{ + return (unsigned short) __builtin_ia32_vec_ext_v4hi ((__v4hi)__A, __N); +} + +#pragma GCC pop_options + +consteval const char* +target_string (bool enable_sse) +{ + return enable_sse ? "sse" : ""; +} + +// Via consteval function +template +[[gnu::target (target_string (enable_sse))]] +int +extract1 (__m64 const src) +{ + if constexpr (enable_sse) + return _mm_extract_pi16 (src, 0); + else + return reinterpret_cast<__v4hi>(src)[1]; +} + +// Via ternary operator +template +[[gnu::target (enable_sse ? "sse" : "")]] +int +extract2 (__m64 const src) +{ + if constexpr (enable_sse) + return _mm_extract_pi16 (src, 2); + else + return reinterpret_cast<__v4hi>(src)[3]; +} + +int +test (__m64 const src) +{ + return extract1(src) + extract1(src) + + extract2(src) + extract2(src); +} -- 2.35.1