public inbox for gcc-bugs@sourceware.org help / color / mirror / Atom feed
From: "zero at smallinteger dot com" <gcc-bugzilla@gcc.gnu.org> To: gcc-bugs@gcc.gnu.org Subject: [Bug target/105778] New: Rotate by register --- unnecessary AND instruction Date: Mon, 30 May 2022 21:21:30 +0000 [thread overview] Message-ID: <bug-105778-4@http.gcc.gnu.org/bugzilla/> (raw) https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105778 Bug ID: 105778 Summary: Rotate by register --- unnecessary AND instruction Product: gcc Version: 12.1.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: zero at smallinteger dot com Target Milestone: --- Created attachment 53053 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=53053&action=edit Sample code With -O2, some x86 shift-by-register instructions are preceded by an unnecessary AND instruction. The AND instruction is unnecessary because the shift-by-register instructions already mask the register containing the variable shift. In the sample code, the #if 0 branch produces the code mov rax, rdi mov ecx, edi shr rax, cl ret but the #if 1 branch produces the code mov rcx, rdi mov rax, rdi and ecx, 63 shr rax, cl ret even though the code has the same behavior. Note that the and ecx, 63 is unnecessary here because shr rax, cl will already operate on the bottom 6 bits of ecx anyway, as per the Intel manual. As notated in the code's comments, some explicit masks other than 0x3f may produce even more inefficient code, e.g.: movabs rcx, 35184372088831 mov rax, rdi and rcx, rdi shr rax, cl ret while some other masks like 0xff and 0xffff eliminate the explicit and altogether. Found with gcc (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0. Verified with godbolt for all gcc versions from 9.4.0 through trunk. For the sake of completeness, I could not get clang to reproduce this problem. The latest classic ICC compiler available in Godbolt (2021.5.0) can emit code with MOVABS as above. However, the newer ICX Intel compiler behaves like clang (this seems reasonable).
next reply other threads:[~2022-05-30 21:21 UTC|newest] Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top 2022-05-30 21:21 zero at smallinteger dot com [this message] 2022-05-30 22:42 ` [Bug target/105778] Shift " jakub at gcc dot gnu.org 2022-05-31 13:19 ` jakub at gcc dot gnu.org 2022-05-31 13:44 ` ubizjak at gmail dot com 2022-05-31 13:50 ` jakub at gcc dot gnu.org 2022-05-31 14:41 ` jakub at gcc dot gnu.org 2022-05-31 18:53 ` ubizjak at gmail dot com 2022-06-02 8:41 ` cvs-commit at gcc dot gnu.org 2022-06-02 8:44 ` jakub at gcc dot gnu.org 2022-10-24 17:44 ` pinskia at gcc dot gnu.org
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=bug-105778-4@http.gcc.gnu.org/bugzilla/ \ --to=gcc-bugzilla@gcc.gnu.org \ --cc=gcc-bugs@gcc.gnu.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).