{"id":2232494,"url":"http://patchwork.ozlabs.org/api/1.1/patches/2232494/?format=json","web_url":"http://patchwork.ozlabs.org/project/gcc/patch/CAFULd4a86+wdgVt34CdSmNmfP6mzKN4KFQT=YmnLxyUZV-J97A@mail.gmail.com/","project":{"id":17,"url":"http://patchwork.ozlabs.org/api/1.1/projects/17/?format=json","name":"GNU Compiler Collection","link_name":"gcc","list_id":"gcc-patches.gcc.gnu.org","list_email":"gcc-patches@gcc.gnu.org","web_url":null,"scm_url":null,"webscm_url":null},"msgid":"<CAFULd4a86+wdgVt34CdSmNmfP6mzKN4KFQT=YmnLxyUZV-J97A@mail.gmail.com>","date":"2026-05-04T15:35:39","name":"[pushed] i386: Relax predicates in BT splitters","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"a50c311ca8d5e2864c2f369a5de4f88c0ad39114","submitter":{"id":808,"url":"http://patchwork.ozlabs.org/api/1.1/people/808/?format=json","name":"Uros Bizjak","email":"ubizjak@gmail.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/gcc/patch/CAFULd4a86+wdgVt34CdSmNmfP6mzKN4KFQT=YmnLxyUZV-J97A@mail.gmail.com/mbox/","series":[{"id":502684,"url":"http://patchwork.ozlabs.org/api/1.1/series/502684/?format=json","web_url":"http://patchwork.ozlabs.org/project/gcc/list/?series=502684","date":"2026-05-04T15:35:39","name":"[pushed] i386: Relax predicates in BT splitters","version":1,"mbox":"http://patchwork.ozlabs.org/series/502684/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2232494/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2232494/checks/","tags":{},"headers":{"Return-Path":"<gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org>","X-Original-To":["incoming@patchwork.ozlabs.org","gcc-patches@gcc.gnu.org"],"Delivered-To":["patchwork-incoming@legolas.ozlabs.org","gcc-patches@gcc.gnu.org"],"Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256\n header.s=20251104 header.b=Wk8D35Qp;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org\n (client-ip=2620:52:6:3111::32; helo=vm01.sourceware.org;\n envelope-from=gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org;\n receiver=patchwork.ozlabs.org)","sourceware.org;\n\tdkim=pass (2048-bit key,\n unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256\n header.s=20251104 header.b=Wk8D35Qp","sourceware.org;\n dmarc=pass (p=none dis=none) header.from=gmail.com","sourceware.org; spf=pass smtp.mailfrom=gmail.com","server2.sourceware.org;\n arc=pass smtp.remote-ip=2a00:1450:4864:20::22b"],"Received":["from vm01.sourceware.org (vm01.sourceware.org\n [IPv6:2620:52:6:3111::32])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4g8QjP6mwPz1yJ0\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 05 May 2026 01:36:24 +1000 (AEST)","from vm01.sourceware.org (localhost [127.0.0.1])\n\tby sourceware.org (Postfix) with ESMTP id A16EB4BAD171\n\tfor <incoming@patchwork.ozlabs.org>; Mon,  4 May 2026 15:36:22 +0000 (GMT)","from mail-lj1-x22b.google.com (mail-lj1-x22b.google.com\n [IPv6:2a00:1450:4864:20::22b])\n by sourceware.org (Postfix) with ESMTPS id 8C6554BAD15A\n for <gcc-patches@gcc.gnu.org>; Mon,  4 May 2026 15:35:54 +0000 (GMT)","by mail-lj1-x22b.google.com with SMTP id\n 38308e7fff4ca-3937ac12828so16562891fa.0\n for <gcc-patches@gcc.gnu.org>; Mon, 04 May 2026 08:35:54 -0700 (PDT)"],"DKIM-Filter":["OpenDKIM Filter v2.11.0 sourceware.org A16EB4BAD171","OpenDKIM Filter v2.11.0 sourceware.org 8C6554BAD15A"],"DMARC-Filter":"OpenDMARC Filter v1.4.2 sourceware.org 8C6554BAD15A","ARC-Filter":"OpenARC Filter v1.0.0 sourceware.org 8C6554BAD15A","ARC-Seal":["i=2; a=rsa-sha256; d=sourceware.org; s=key; t=1777908954; cv=pass;\n b=FpLfxONZM1xImgPu9RsSLvX7+weuGVBDOpkZC/6vZPd3XYg7HAA15GP3XwXkkFX4cWXT+k7p2xTHWy3YsArMYn2F87ZS1hLHYdmaE4RWVhZKNN43NE7LQ5DC7XrUhcOqYW/S14CzOPS0le6lLrQwJojNocbg2KjyAI1ooRFUBgw=","i=1; a=rsa-sha256; t=1777908953; cv=none;\n d=google.com; s=arc-20240605;\n b=ASCGtUTESQwHSrY9OCUp/n5dMnCco/Vj6l7OkVrZlmJ6hx36tB31S46W5YGTM6VpKu\n 2NovbuOLqW9CDfWpiIsOSo2teFGJgEqi2EKS93jldwzP4X1uk+YtRY0hrbma77+UxL4n\n uIare/BJPFWFezLXIBL5tHrXTsYRUGyEBTtf7FKxjyXpeE04hkdOoGtk1yNeY7s3jdhC\n Z/VG/hoCXUUHqi9YuddIpDRAJPZEur+rIDpNImeaK3636zYcgYVSOUksYqvK4IKt2y6Y\n NWvRrAh1vBYoLMcIC0GosY34kYeFO+ovT9t29UgJeXsNdJX6XiB++wzm/7olYhKEsJxU\n DyWw=="],"ARC-Message-Signature":["i=2; a=rsa-sha256; d=sourceware.org; s=key;\n t=1777908954; c=relaxed/simple;\n bh=Jh6ZhibKcRvXuwSgHdbKxHQXI+/y453Y3zKE03Wlywo=;\n h=DKIM-Signature:MIME-Version:From:Date:Message-ID:Subject:To;\n b=cZulV22p3XbRVrTlMTjUFXaA4L0qT5PyjKJtc3rtzUDsk92zhEDHnkpfSRTyYqkQqWTBhJu5p3H4yn41BcWQBLyu5yGSN11aoQcgI4w61IlEUF95SIW1H29C7EL/t62r9tUL+M+fEov4LsuLSVNeN3Dq3zIMlFAEvF8Vu/w4BDg=","i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com;\n s=arc-20240605;\n h=to:subject:message-id:date:from:mime-version:dkim-signature;\n bh=o0324qLCH60z80OQNXoH9EfIuULzlL+2u5SppyVpwHI=;\n fh=XNn3asQvIblazGK92GBt13dVv+YmGV3pBS0JC29ZQco=;\n b=WHpJL4uSSJAYrDQ6sPkBJEeT0fxzje916O5lFm+LEiNUlp0IZrvjBWbdkDsG/TPxWZ\n Zlfhu5+wlNRY1hixhJqDdnXwGV1qlD5+uy2zSOSPQL9xAEnTEdO7GoG7P8TOshCz/OfW\n I+ow6fzuaLab2G07XmiG5ZUPbcZKMzCkFTl7d4a/Q/fzdMmut0gK1NRkKWHp6bbpUY+D\n nk7LpqK+Hm3hgg1tUZ4oxMZx04l658apZnuFoZxeaREHbU0i7uzkvg6cqXCETiLce1mx\n w7bsGbKxLlMWoFV6ejoMLb/SSRceoQw8x+7uZ7DCcsBnGN+jhhfVHO7mB/IOqI9e0RJV\n hnYA==; darn=gcc.gnu.org"],"ARC-Authentication-Results":["i=2; server2.sourceware.org","i=1; mx.google.com; arc=none"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=gmail.com; s=20251104; t=1777908953; x=1778513753; darn=gcc.gnu.org;\n h=to:subject:message-id:date:from:mime-version:from:to:cc:subject\n :date:message-id:reply-to;\n bh=o0324qLCH60z80OQNXoH9EfIuULzlL+2u5SppyVpwHI=;\n b=Wk8D35Qpf8v1/cipsJ+arP3KQXfOGKXqL38HiUpcnziMMewaz5glI2yyyDm+tOYYGI\n Al9eaxSJVUPg4Ms2CSNOVw4K+MPiDPp/pEXeuk2t1u3zqFROC118VTIm6Ip6lW9eaqo8\n 71/feyclrOB4U+YMP3kEAfz/MF9rZQ/ip1UPnbtFfk+7LQa59Qhn3z2fq5m0mhKSdoMl\n dJ4kc/OJDvZpC+uebHkvB7PYkaCJ7AXQyz6g/wVzMOssNJQvKwCNKSnJIlRuQ8zjncVS\n CXwJwa2eTfMVDv+28BD632dfUYnPpQcQHnO4FX/mrHTbygI9GzuF27+VJD2m8WteB+/p\n Vb3Q==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1777908953; x=1778513753;\n h=to:subject:message-id:date:from:mime-version:x-gm-gg\n :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to;\n bh=o0324qLCH60z80OQNXoH9EfIuULzlL+2u5SppyVpwHI=;\n b=BMcnJCFCGDW6lTqF6jfpl34OqXYLp85FLQM42831gtj32NLdaxHsyY6tLMaGTdmL7x\n mX1cRN7RCJoJrAVAs9GGD6KH3tcHypxgnhktgZYtWwWRoev5s9PqKwNeD69dDtCLFxNe\n n+cgyHJx7lUzmjMxaxnG/axvx+25MNkqfnxFTF/aYK0QBjhrTP/peRpplXXFe3D/CoKz\n v4rvouoEit8954ADbCah1TQLMVI62aHu2PGjRllL6NXd5JDotchXMUvDYk8tDoupaNjq\n 0Fnfje+9MMDOpncdejCZGLp6UwYqqU6ognXkc30gysM/o0Xl2ibwp9Cy0rtb+w1l7VG0\n nnWQ==","X-Gm-Message-State":"AOJu0YyaFgrj6sWmM8OmvIb/ytCcYSFO/B9fpE6bfskYQLwnaKvfY8WJ\n KTaDYrtCbEohKw740zgpta5q2h/0ni8WdVLUVFn38LgUlHaH78YCt1xq12QSFvo/dIfyminGU1s\n NWhzdAs6aaOm4PK22FbEij7Nxopk/EuI17qAdRQY=","X-Gm-Gg":"AeBDietpV7R9fNcZYAxtF2rRFRWQ/FLxPGKZaxFrs0ArVAxs/cYa0e6Q3RxZfsAY5T5\n eG31YZU4nR2SAco0I2Ux5crKPLUTzQgEX3vco0JaF17+aguHeQxLElzwEDWoJAeF7CL39d5dX8E\n Q58zKBlxw8Gf8AHgrhg65iLV+5EyT7w3kR9SEz+eG0rHHGNV8bpydnrfOwbrTQ01EOULQWSyj4+\n iVEiUSZE60QCqukFgFIHWviYw+b/pmy2ejhcc2JEQ5mBmrRSDAL73k0LyM7jCyhmZ0YbwBxhl5F\n Hdx4uUMMVqcxTnu+J5qkNA2WFm8VUBR0nNo10Mdd7EzH4VmudzJg4V/i0Fe5yLlqw2HUdG3gK1r\n 4WpReQiN/22wXx8gHyeWgebUIu9hrNHtZmm3SOa6AFQMuwA==","X-Received":"by 2002:a05:651c:4418:10b0:38e:96c4:9244 with SMTP id\n 38308e7fff4ca-393b2999bcfmr137621fa.9.1777908952294; Mon, 04 May 2026\n 08:35:52 -0700 (PDT)","MIME-Version":"1.0","From":"Uros Bizjak <ubizjak@gmail.com>","Date":"Mon, 4 May 2026 17:35:39 +0200","X-Gm-Features":"AVHnY4LFBY0neHGktN7fDxn9JyrEDOlSL9aryaOeBfUwdBXusIYy0N44EqnSQNE","Message-ID":"\n <CAFULd4a86+wdgVt34CdSmNmfP6mzKN4KFQT=YmnLxyUZV-J97A@mail.gmail.com>","Subject":"[pushed] i386: Relax predicates in BT splitters","To":"\"gcc-patches@gcc.gnu.org\" <gcc-patches@gcc.gnu.org>","Content-Type":"multipart/mixed; boundary=\"0000000000008b82aa0650ffafe1\"","X-BeenThere":"gcc-patches@gcc.gnu.org","X-Mailman-Version":"2.1.30","Precedence":"list","List-Id":"Gcc-patches mailing list <gcc-patches.gcc.gnu.org>","List-Unsubscribe":"<https://gcc.gnu.org/mailman/options/gcc-patches>,\n <mailto:gcc-patches-request@gcc.gnu.org?subject=unsubscribe>","List-Archive":"<https://gcc.gnu.org/pipermail/gcc-patches/>","List-Post":"<mailto:gcc-patches@gcc.gnu.org>","List-Help":"<mailto:gcc-patches-request@gcc.gnu.org?subject=help>","List-Subscribe":"<https://gcc.gnu.org/mailman/listinfo/gcc-patches>,\n <mailto:gcc-patches-request@gcc.gnu.org?subject=subscribe>","Errors-To":"gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org"},"content":"Allow QImode subregs of AND results in HImode and SImode (and DImode\non 64-bit targets).  Also allow memory operands for the BT base operand\nto increase combine opportunities and enable better insn propagation.\n\nThe BT insn is slow when using a memory base with a variable bit index,\nbut the register allocator can reload a memory operand into a register to\nsatisfy BT pattern constraints.\n\nThe patch improves code generation for the included testcase from:\n\nmask_get_flag:\n        movl    %esi, %ecx\n        movl    $1, %eax\n        salq    %cl, %rax\n        testq   %rdi, %rax\n        setne   %al\n        ret\nto:\n\nmask_get_flag:\n        xorl    %eax, %eax\n        btq     %rsi, %rdi\n        setc    %al\n        ret\n\ngcc/ChangeLog:\n\n    * config/i386/i386.md (*bt<SWI48:mode>_mask): Use\n    int248_register_operand for operand 1 predicate.\n    (*jcc_bt<mode>_mask): Use nonimmediate_operand for operand 1 predicate.\n    (*jcc_bt<SWI48:mode>_mask_1): Use nonimmediate_operand for operand 1\n    predicate and int248_register_operand for operand 2 predicate.\n    (BT followed by CMOV splitter): Use nonimmediate_operand\n    for operand 1 predicate.\n    (*bt<mode>_setcqi): Ditto.\n    (*bt<mode>_setncqi): Ditto.\n    (*bt<mode>_setnc<mode>): Ditto.\n    (*bt<mode>_setncqi_2): Ditto.\n    (*bt<mode>_setc<mode>_mask): Use nonimmediate_operand for operand 1\n    predicate and int248_register_operand for operand 2 predicate.\n\ngcc/testsuite/ChangeLog:\n\n    * gcc.target/i386/bt-8.c: New test.\n\nBootstrapped and regression tested on x86_64-linux-gnu {,-m32}.\n\nUros.","diff":"diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md\nindex e514809453d..b0990294b9a 100644\n--- a/gcc/config/i386/i386.md\n+++ b/gcc/config/i386/i386.md\n@@ -19573,8 +19573,8 @@ (define_insn_and_split \"*bt<SWI48:mode>_mask\"\n             (match_operand:SWI48 0 \"nonimmediate_operand\" \"r,m\")\n             (const_int 1)\n \t    (subreg:QI\n-\t      (and:SWI248\n-\t\t(match_operand:SWI248 1 \"register_operand\")\n+\t      (and\n+\t\t(match_operand 1 \"int248_register_operand\")\n \t\t(match_operand 2 \"const_int_operand\")) 0))))]\n   \"TARGET_USE_BT\n    && (INTVAL (operands[2]) & (GET_MODE_BITSIZE (<SWI48:MODE>mode)-1))\n@@ -19629,7 +19629,7 @@ (define_insn_and_split \"*jcc_bt<mode>_mask\"\n   [(set (pc)\n   \t(if_then_else (match_operator 0 \"bt_comparison_operator\"\n \t\t\t[(zero_extract:SWI48\n-\t\t\t   (match_operand:SWI48 1 \"register_operand\")\n+\t\t\t   (match_operand:SWI48 1 \"nonimmediate_operand\")\n \t\t\t   (const_int 1)\n \t\t\t   (and:QI\n \t\t\t     (match_operand:QI 2 \"register_operand\")\n@@ -19665,11 +19665,11 @@ (define_insn_and_split \"*jcc_bt<SWI48:mode>_mask_1\"\n   [(set (pc)\n   \t(if_then_else (match_operator 0 \"bt_comparison_operator\"\n \t\t\t[(zero_extract:SWI48\n-\t\t\t   (match_operand:SWI48 1 \"register_operand\")\n+\t\t\t   (match_operand:SWI48 1 \"nonimmediate_operand\")\n \t\t\t   (const_int 1)\n \t\t\t   (subreg:QI\n-\t\t\t     (and:SWI248\n-\t\t\t       (match_operand:SWI248 2 \"register_operand\")\n+\t\t\t     (and\n+\t\t\t       (match_operand 2 \"int248_register_operand\")\n \t\t\t       (match_operand 3 \"const_int_operand\")) 0))\n \t\t\t (const_int 0)])\n \t\t      (label_ref (match_operand 4))\n@@ -19704,7 +19704,7 @@ (define_split\n \t(if_then_else:SWI248\n \t (match_operator 5 \"bt_comparison_operator\"\n \t  [(zero_extract:SWI48\n-\t    (match_operand:SWI48 1 \"register_operand\")\n+\t    (match_operand:SWI48 1 \"nonimmediate_operand\")\n \t    (const_int 1)\n \t    (match_operand:QI 2 \"register_operand\"))\n \t   (const_int 0)])\n@@ -19730,7 +19730,7 @@ (define_split\n (define_insn_and_split \"*bt<mode>_setcqi\"\n   [(set (subreg:SWI48 (match_operand:QI 0 \"register_operand\") 0)\n         (zero_extract:SWI48\n-         (match_operand:SWI48 1 \"register_operand\")\n+         (match_operand:SWI48 1 \"nonimmediate_operand\")\n          (const_int 1)\n          (match_operand:QI 2 \"register_operand\")))\n    (clobber (reg:CC FLAGS_REG))]\n@@ -19750,7 +19750,7 @@ (define_insn_and_split \"*bt<mode>_setncqi\"\n \t(and:QI\n \t (not:QI\n \t  (subreg:QI\n-\t   (lshiftrt:SWI48 (match_operand:SWI48 1 \"register_operand\")\n+\t   (lshiftrt:SWI48 (match_operand:SWI48 1 \"nonimmediate_operand\")\n \t\t\t   (match_operand:QI 2 \"register_operand\")) 0))\n \t (const_int 1)))\n    (clobber (reg:CC FLAGS_REG))]\n@@ -19768,7 +19768,7 @@ (define_insn_and_split \"*bt<mode>_setnc<mode>\"\n   [(set (match_operand:SWI48 0 \"register_operand\")\n \t(and:SWI48\n \t (not:SWI48\n-\t  (lshiftrt:SWI48 (match_operand:SWI48 1 \"register_operand\")\n+\t  (lshiftrt:SWI48 (match_operand:SWI48 1 \"nonimmediate_operand\")\n \t\t\t  (match_operand:QI 2 \"register_operand\")))\n \t (const_int 1)))\n    (clobber (reg:CC FLAGS_REG))]\n@@ -19789,7 +19789,7 @@ (define_insn_and_split \"*bt<mode>_setncqi_2\"\n   [(set (match_operand:QI 0 \"register_operand\")\n \t(eq:QI\n \t  (zero_extract:SWI48\n- \t    (match_operand:SWI48 1 \"register_operand\")\n+\t    (match_operand:SWI48 1 \"nonimmediate_operand\")\n \t    (const_int 1)\n \t    (match_operand:QI 2 \"register_operand\"))\n \t  (const_int 0)))\n@@ -19808,11 +19808,11 @@ (define_insn_and_split \"*bt<mode>_setncqi_2\"\n (define_insn_and_split \"*bt<mode>_setc<mode>_mask\"\n   [(set (match_operand:SWI48 0 \"register_operand\")\n \t(zero_extract:SWI48\n- \t  (match_operand:SWI48 1 \"register_operand\")\n+\t  (match_operand:SWI48 1 \"nonimmediate_operand\")\n \t  (const_int 1)\n \t  (subreg:QI\n-\t    (and:SWI48\n-\t      (match_operand:SWI48 2 \"register_operand\")\n+\t    (and\n+\t      (match_operand 2 \"int248_register_operand\")\n \t      (match_operand 3 \"const_int_operand\")) 0)))\n    (clobber (reg:CC FLAGS_REG))]\n   \"TARGET_USE_BT\ndiff --git a/gcc/testsuite/gcc.target/i386/bt-8.c b/gcc/testsuite/gcc.target/i386/bt-8.c\nnew file mode 100644\nindex 00000000000..3cd75c850b4\n--- /dev/null\n+++ b/gcc/testsuite/gcc.target/i386/bt-8.c\n@@ -0,0 +1,10 @@\n+/* { dg-do compile } */\n+/* { dg-options \"-O2 -mtune=core2\" } */\n+\n+_Bool mask_get_flag(long mask, int offset)\n+{\n+  return mask & 1ul << (offset % (__SIZEOF_LONG__ * __CHAR_BIT__));\n+}\n+\n+/* { dg-final { scan-assembler \"bt\\[lq\\]\\[ \\t\\]\" } } */\n+/* { dg-final { scan-assembler-not \"sal\\[lq\\]\\[ \\t\\]\" } } */\n","prefixes":["pushed"]}