From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 48) id 876F03858D35; Sat, 10 Jun 2023 12:37:43 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 876F03858D35 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1686400663; bh=5KfbPo4zvryTVS0I1rQxGviHkWTGZmXArOzM542YFYo=; h=From:To:Subject:Date:From; b=qPCJCTj+9Qx7VMXIm87ToZvL/dRVs7RStr9JpFOYsmVUj8UCTTINjXvvacnOLQozz o3nksNKTboGf32SuGFEPlzlwgwHOQEOC7SU/w3MiNwvk9UtZHYIOxVEbTidUihQWld sxPESEBw/iKPEDzHsK7dUViQ0DL9drbT+N8oybog= From: "llvm at rifkin dot dev" To: gcc-bugs@gcc.gnu.org Subject: [Bug tree-optimization/110203] New: Sum should optimize to closed form Date: Sat, 10 Jun 2023 12:37:43 +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: 13.1.0 X-Bugzilla-Keywords: X-Bugzilla-Severity: normal X-Bugzilla-Who: llvm at rifkin dot dev 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 List-Id: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=3D110203 Bug ID: 110203 Summary: Sum should optimize to closed form Product: gcc Version: 13.1.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: llvm at rifkin dot dev Target Milestone: --- For both of int foo(int num) { if(num =3D=3D 1) return 1; return num + foo(num - 1); } int bar(int num) { int sum =3D 0; for(int i =3D 1; i <=3D num; i++) { sum +=3D i; } return sum; } GCC emits loops: foo(int): xor eax, eax cmp edi, 1 je .L8 .L2: mov edx, edi sub edi, 1 add eax, edx cmp edi, 1 jne .L2 add eax, 1 ret .L8: mov eax, 1 ret bar(int): test edi, edi jle .L12 add edi, 1 mov eax, 1 xor edx, edx .L11: add edx, eax add eax, 1 cmp eax, edi jne .L11 mov eax, edx ret .L12: xor edx, edx mov eax, edx ret GCC should optimize this to the closed form. There is precedent for this transformation, llvm does it https://godbolt.org/z/Kfffe5aPz.=