[{"id":3685356,"web_url":"http://patchwork.ozlabs.org/comment/3685356/","msgid":"<CAMe9rOqRXwnNGArdHaS7A+7tsU-b0PmanJi3TtkA+RNgFrHeEA@mail.gmail.com>","list_archive_url":null,"date":"2026-05-03T06:49:38","subject":"Re: [PATCH v2 3/3] i386: Add peephole2 to convert highpart mul to\n mulx","submitter":{"id":4387,"url":"http://patchwork.ozlabs.org/api/people/4387/","name":"H.J. Lu","email":"hjl.tools@gmail.com"},"content":"On Sun, May 3, 2026 at 1:36 PM <herumi@nifty.com> wrote:\n>\n> From: MITSUNARI Shigeo <herumi@nifty.com>\n>\n> When the register allocator selects the MUL-based highpart pattern\n> (umuldi3_highpart) with the source value already in %rdx, it inserts\n> a redundant mov to %rax before the mul instruction.  Add a peephole2\n> that detects this mov + mul sequence and converts it to a single mulx,\n> eliminating the extra mov.\n>\n> This improves inlined loops that perform multiple unsigned divisions\n> by constants.  For example, a loop with three div-by-constant\n> operations now generates 15 instructions (matching LLVM) instead\n> of 18.\n>\n> Before (loop body excerpt):\n>         mov     rax, rdx\n>         mul     r9\n>\n> After:\n>         mulx    rdx, rax, r9\n\nPlease add a test with check-function-bodies, like\n\n[hjl@gnu-tgl-3 testsuite]$ cat gcc.target/i386/pr14907-3.c\n/* { dg-do compile } */\n/* { dg-options \"-O2 -g0\" } */\n/* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */\n/* { dg-final { check-function-bodies \"x86*\" \"\" \"\" { target *-*-linux*\n*-*-gnu* } {^\\t?\\.} } } */\n\n/*\nx86*c1:\nx86*.LFB0:\nx86* .cfi_startproc\nx86* jmp c2\nx86* .cfi_endproc\nx86*...\n*/\n\nextern char c2 (char);\n\nchar\nc1 (char c)\n{\n  return c2 (c);\n}\n[hjl@gnu-tgl-3 testsuite]$\n\n> gcc/ChangeLog:\n>\n>         * config/i386/i386.md: Add peephole2 to convert\n>         mov + umul_highpart to mulx on BMI2 targets.\n> ---\n>  gcc/config/i386/i386.md | 17 +++++++++++++++++\n>  1 file changed, 17 insertions(+)\n>\n> diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md\n> index 472f9d41332..1c394690b04 100644\n> --- a/gcc/config/i386/i386.md\n> +++ b/gcc/config/i386/i386.md\n> @@ -11522,6 +11522,23 @@\n>     (set_attr \"prefix\" \"vex\")\n>     (set_attr \"mode\" \"<MODE>\")])\n>\n> +;; Convert mov + highpart mul to mulx when the mov source is %rdx.\n> +;; mov %rdx, %rax; mulq %src -> mulx %src, %rax, %out\n> +(define_peephole2\n> +  [(set (match_operand:DWIH 0 \"register_operand\")\n> +       (match_operand:DWIH 1 \"register_operand\"))\n> +   (parallel [(set (match_operand:DWIH 2 \"register_operand\")\n> +                  (umul_highpart:DWIH (match_dup 0)\n> +                       (match_operand:DWIH 3 \"nonimmediate_operand\")))\n> +             (clobber (match_dup 0))\n> +             (clobber (reg:CC FLAGS_REG))])]\n> +  \"TARGET_BMI2\n> +   && REGNO (operands[1]) == DX_REG\n> +   && REGNO (operands[0]) != REGNO (operands[2])\"\n> +  [(parallel [(set (match_dup 2)\n> +                  (umul_highpart:DWIH (match_dup 1) (match_dup 3)))\n> +             (clobber (match_dup 0))])])\n> +\n>  ;; Highpart multiplication patterns\n>  (define_insn \"<s>mul<mode>3_highpart\"\n>    [(set (match_operand:DWIH 0 \"register_operand\" \"=d\")\n> --\n> 2.43.0\n>","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=mEgWAgvR;\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=mEgWAgvR","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=2607:f8b0:4864:20::102d"],"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 4g7b5P5XX3z1yJV\n\tfor <incoming@patchwork.ozlabs.org>; Sun, 03 May 2026 16:50:48 +1000 (AEST)","from vm01.sourceware.org (localhost [127.0.0.1])\n\tby sourceware.org (Postfix) with ESMTP id D37004BB58D8\n\tfor <incoming@patchwork.ozlabs.org>; Sun,  3 May 2026 06:50:44 +0000 (GMT)","from mail-pj1-x102d.google.com (mail-pj1-x102d.google.com\n [IPv6:2607:f8b0:4864:20::102d])\n by sourceware.org (Postfix) with ESMTPS id 495214BA2E20\n for <gcc-patches@gcc.gnu.org>; Sun,  3 May 2026 06:50:16 +0000 (GMT)","by mail-pj1-x102d.google.com with SMTP id\n 98e67ed59e1d1-362bb3260f1so2224324a91.2\n for <gcc-patches@gcc.gnu.org>; Sat, 02 May 2026 23:50:16 -0700 (PDT)"],"DKIM-Filter":["OpenDKIM Filter v2.11.0 sourceware.org D37004BB58D8","OpenDKIM Filter v2.11.0 sourceware.org 495214BA2E20"],"DMARC-Filter":"OpenDMARC Filter v1.4.2 sourceware.org 495214BA2E20","ARC-Filter":"OpenARC Filter v1.0.0 sourceware.org 495214BA2E20","ARC-Seal":["i=2; a=rsa-sha256; d=sourceware.org; s=key; t=1777791016; cv=pass;\n b=B4RujSCMqHEOJvtxy+w8sU1usy3SFru0FuK3+5sWC/yzICOnjnG6zITXuNLySWxYfOMeQ6xoJ9G6lYL8ZqYT2m7AkP1s3aa2y8yjcy3HIyS9CfHz0vfSGWx9ga3SGfSEU2BKvjK1lcCZ1YSu27iKKCFGtyAZQwNOSxXGtMVH3NY=","i=1; a=rsa-sha256; t=1777791015; cv=none;\n d=google.com; s=arc-20240605;\n b=fa/0N/UYKBvZnYHcDfO98RtCYsuDDo9Ju8nagjiF2ra25DW2pCAqfZl5cU0eJmbBsi\n UXA/rKKChbIav4KELPz3aGHr05L0pIQWkNgCKkdkJ5V4YA8VOpvslRLdZ5+AN2rJ8DN0\n uNQPaElKvsmy5og4Krp4rkrpliEaHIEFqUi7j+PcOVlDpQfSnuME/FS5PhJOolVY6RsF\n 8BW6SGau273D13rsiqdHpdU0CFNoC1G8Ky0HXI5xPNrnux2rw3mq5IFfUdEisc0JhpN6\n nnTECrEo904Pxcj/SZHBeEpQBHESYl9BEGbBbvYYlC/JuXOyT9sJq3lq3B4yj9a85qur\n c+cg=="],"ARC-Message-Signature":["i=2; a=rsa-sha256; d=sourceware.org; s=key;\n t=1777791016; c=relaxed/simple;\n bh=g81QvNtn8/l/meXKNHKCBV04FxI+asjeTPi/szFm3LM=;\n h=DKIM-Signature:MIME-Version:From:Date:Message-ID:Subject:To;\n b=Zn5zASOMGqWXMHD9dklFhNlZHB4zrwu8q00s5Mpe7QLHo73TTtj0pGq5H1YcZ49pncND+APrkB+npe+6g8irwRaelVvf4WqJ0rvasrWV+E0CsKkgo21Y2WXWexW7u72q2o7WRrS6avCniuXYO9eVtbvzkmyViEYCrhse1PrCKXI=","i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com;\n s=arc-20240605;\n h=content-transfer-encoding:cc:to:subject:message-id:date:from\n :in-reply-to:references:mime-version:dkim-signature;\n bh=9C5gRZQo2zsEfy7yf+h2hPpl9J4gxA+ZfT7DVeboXdE=;\n fh=ElYDoChHlwCPcmV6d0xiiD39Crd8RA+byJy+8mXh/Yc=;\n b=jWhqCRiTaayssrshKFCwahCXWxd/CujSh8I/dpyFu42rOGtwxD91+1P9uZV/xEHF4/\n eMTftpK2fag+Iq/KtUrGRW4rwPMTuRYIjK6Sbrx89AMjywBgPgj0qHmf7ZUkO2HRipoi\n iaBMWLFWzGygEVungXgw/F8kCYrC5rRl7O+YRmr+KwsO5Wo1tZdKebCsxhXb6GxnIYG7\n ScfTKCwRvZELXSHsrILpKTlTfZEFJ28IM5rH30mfP2dVe0M+84n+1Gbh3jY28PIZck7N\n peUS3gQ4s/n6QCbW2v9rvbYaO8MGlqJN62ny88O54le1k0Jy7vB9KTts6ihxtluaracD\n 9o0Q==; 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=1777791015; x=1778395815; darn=gcc.gnu.org;\n h=content-transfer-encoding:cc:to:subject:message-id:date:from\n :in-reply-to:references:mime-version:from:to:cc:subject:date\n :message-id:reply-to;\n bh=9C5gRZQo2zsEfy7yf+h2hPpl9J4gxA+ZfT7DVeboXdE=;\n b=mEgWAgvRY9cqQs1HxsslL2XN5IFhjCMG/hi1WDNW0OnNBtCyy5RHRT1IZPlDpg4Jbe\n ssrlNIImDEhVfRcOM85XMmMKn9756CHcJWm/UJtbEfCkbGf22SXvAi84f0twIkNNCdpM\n oQkzHKHjdK5t3gtmMHgLJ5uuzQ1MV8YL1W+CR07phzmuwz80/NIMiFfQ5VT5LGSryKSi\n nwLySP8+R3tvXrF3YV/HYH+OJwTxe4QkLMjUlwgTBjBNPxg1ulAq4KI8ucK2QwvAkKzO\n 6j9cpovlUa99O+B8npD3Pn9XmuZGmp0a+b6afcc8gPUx5QQ4ozwjnBTOdhANXSJaHfwy\n gfrQ==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1777791015; x=1778395815;\n h=content-transfer-encoding:cc:to:subject:message-id:date:from\n :in-reply-to:references:mime-version:x-gm-gg:x-gm-message-state:from\n :to:cc:subject:date:message-id:reply-to;\n bh=9C5gRZQo2zsEfy7yf+h2hPpl9J4gxA+ZfT7DVeboXdE=;\n b=tAPEkU+oAYvqsGjVoaESJdhZPf3mb5NDQD9+rmAzykra/Afgu7Imx3Ol92kooWBBAc\n qH/BY0Of54Ivn0HZCQhoMB3+4eIHEKl2arZeDaV64CY/VdsnCC+wlFas3zQ3btEsSbP4\n StmkRfFXBIr7Toqgl3XaaK68MGss1N9vtOMKsgmH0/3wRHgYz/TQfTCx5Uinf230xz+v\n lR0yy0PX5mRE1XOsPqqdvDsa1OVXb/TuQd1IRGV0KnI8BvhpDPPIvQF3umh5ZznKW5mo\n A3k7kFQ8VZjodRTD1rbv7drFS0lMn2Z/6hPCBsVf9MVHIyyZREuTylViqFlKTeXuI0X/\n Oecg==","X-Gm-Message-State":"AOJu0YwdF8NvYwqxahrk0uIwBAeFDVUhckDFMBs2e2Xc5DNmCZ+R1lRZ\n Xjl72tGIn5wt02PHSENEfc4orkUkXdE2Q8mcTSyc+xFSdmmjvY2kkxti17FZ5vQwkTi3TWXXTtb\n Ig3gXCNIwiHhM9pDfpDOPdrjzx51lkWw=","X-Gm-Gg":"AeBDietuzLVAuRGVls2EywJVimPzRVtKx+pf1EmiaorH1JJ1taAIv2+KXXg4pnbMMvR\n dO7rmE/lE8gdgOlsOQa0HetBjf/ANhMDZOU5PMntgyaTr5/xFKyYdpKuqap45DLQHdx7DBXBt2r\n bNimWJHqFSyKp8Kr2cLJ2wxCAJIUEx2OcQtOfkQAs9QrRgtZ9VYrw02y7LbGW2WZvzEDLNDh5KN\n TxW+325reorPOvnrzlfRZ87NABfF8iUR35XJH9ESsuQS0AwxmjeBVyi/yswvEktGkdHVjdhOvs1\n FPaW3Rrkv6S8+ZS1","X-Received":"by 2002:a17:90a:d444:b0:364:6558:99be with SMTP id\n 98e67ed59e1d1-3650ceaab7fmr5132482a91.22.1777791014977; Sat, 02 May 2026\n 23:50:14 -0700 (PDT)","MIME-Version":"1.0","References":"<727728f8-76e5-457b-ab9f-d650550e0702@gmail.com>\n <20260503053451.48504-1-herumi@nifty.com>\n <20260503053451.48504-4-herumi@nifty.com>","In-Reply-To":"<20260503053451.48504-4-herumi@nifty.com>","From":"\"H.J. Lu\" <hjl.tools@gmail.com>","Date":"Sun, 3 May 2026 14:49:38 +0800","X-Gm-Features":"AVHnY4Kwx3uKEXw7mLYlQmcASzicfUZ-WWlzbsPkBiNlqjig1B8qX6mGVbxeotc","Message-ID":"\n <CAMe9rOqRXwnNGArdHaS7A+7tsU-b0PmanJi3TtkA+RNgFrHeEA@mail.gmail.com>","Subject":"Re: [PATCH v2 3/3] i386: Add peephole2 to convert highpart mul to\n mulx","To":"herumi@nifty.com","Cc":"gcc-patches@gcc.gnu.org, rguenther@suse.de, jeffreyalaw@gmail.com,\n ubizjak@gmail.com","Content-Type":"text/plain; charset=\"UTF-8\"","Content-Transfer-Encoding":"quoted-printable","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"}}]