From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 48) id 1B6DC385DC1F; Tue, 28 Apr 2020 22:35:22 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 1B6DC385DC1F DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1588113322; bh=ICWlhr7GMDBUn+WSNYKo25G6jqFaCD0yHi4DCc45rps=; h=From:To:Subject:Date:From; b=wgtr9iNOlqmn70Ojo5dFLXOX4aTheOrdRBTp/CEM0iiIIOL06iXBBf+oR9l7+jbux QAKpIyxbR4r2EmTlTmXhA4F0m0g6Oz3rjTtNC4P3Nu3cf4bApq/Wrnw/Ibbcid2Hk0 QeXcc+2BZh1G63KYH7KzJTcpRpHbWqianaB/9p64= From: "gabravier at gmail dot com" To: gcc-bugs@gcc.gnu.org Subject: [Bug tree-optimization/94834] New: Failure to optimize loop bswap pattern Date: Tue, 28 Apr 2020 22:35:21 +0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: new X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: gcc X-Bugzilla-Component: tree-optimization X-Bugzilla-Version: 10.0 X-Bugzilla-Keywords: X-Bugzilla-Severity: normal X-Bugzilla-Who: gabravier at gmail dot com X-Bugzilla-Status: UNCONFIRMED X-Bugzilla-Resolution: X-Bugzilla-Priority: P3 X-Bugzilla-Assigned-To: unassigned at gcc dot gnu.org X-Bugzilla-Target-Milestone: --- X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: bug_id short_desc product version bug_status bug_severity priority component assigned_to reporter target_milestone Message-ID: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Bugzilla-URL: http://gcc.gnu.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 X-BeenThere: gcc-bugs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-bugs mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 28 Apr 2020 22:35:22 -0000 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=3D94834 Bug ID: 94834 Summary: Failure to optimize loop bswap pattern Product: gcc Version: 10.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: gabravier at gmail dot com Target Milestone: --- uint32_t load(const uint8_t* data) { uint32_t val =3D 0; for (int i =3D 0; i < sizeof(val) * CHAR_BIT; i +=3D CHAR_BIT) { val |=3D *data++ << i; } return val; } This can be optimized to a single 32-bit load. LLVM does this transformatio= n, gcc just unrolls the loop and misses the transformation. LLVM gives : load(unsigned char const*): # @load(unsigned char const*) mov eax, dword ptr [rdi] ret GCC gives : load(unsigned char const*): movzx edx, BYTE PTR [rdi+1] movzx eax, BYTE PTR [rdi] sal edx, 8 or edx, eax movzx eax, BYTE PTR [rdi+2] sal eax, 16 or edx, eax movzx eax, BYTE PTR [rdi+3] sal eax, 24 or eax, edx ret See also https://godbolt.org/z/kmYTLZ=