From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 48) id AE4CC38323D6; Fri, 29 Sep 2023 14:43:19 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org AE4CC38323D6 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1695998599; bh=E99j6SbSEWvpc01zmcAIJDdw3pUQTGAy7eEV4pq9Okc=; h=From:To:Subject:Date:From; b=dZi4+cHKb57GTNpEEkR8wkZkrqY4c/9JPiTfCk8L1TnJiNJjeLL/BD3yLMPVgA34W kPJr6OMLDRGG9tL2CvSs87eXyIqIGOuJ4l+Km+L4LRT0A63Xl1MyfYoc6eCz6Md3Zi wJa3/NL42Zn8x/vnZF4EyQrha/qEmvGWnR/8aj6Y= From: "652023330028 at smail dot nju.edu.cn" To: gcc-bugs@gcc.gnu.org Subject: [Bug tree-optimization/111640] New: Missed optimization of Loop Unswitch (Simple loops) Date: Fri, 29 Sep 2023 14:43:19 +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: 14.0 X-Bugzilla-Keywords: X-Bugzilla-Severity: normal X-Bugzilla-Who: 652023330028 at smail dot nju.edu.cn 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=3D111640 Bug ID: 111640 Summary: Missed optimization of Loop Unswitch (Simple loops) Product: gcc Version: 14.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: 652023330028 at smail dot nju.edu.cn Target Milestone: --- Hello, we found some optimizations (regarding Loop Unswitch) that GCC may h= ave missed.=20 The control flow graph for this code is simple. At the same time, even with --param max-unswitch-insns, this code will not optimize as expected. We would greatly appreicate if you can take a look and let us know you thin= k. https://godbolt.org/z/M3b61qqno Given the following code:=20 extern int var_8; extern int var_9; extern int var_10; extern int var_11; extern int var_12; extern int var_15; extern int var_17; extern int var_18; extern int var_22; extern int var_25; extern int var_26; extern int var_27; extern int var_30; extern int var_34; extern int var_37; extern int var_39; extern int var_45; void test(int var_0, int var_1, int var_2, int var_3, int var_4) { for (int i_0 =3D 0; i_0 < 4 + -1986643035 + 1 - 1 + 1986643054; i_0 += =3D var_3 - var_1 - var_3 - var_10 + var_10 + -636989219 + var_2 - 691490232 - 1995983094) { var_11 +=3D 691490244 + 1118573265 - 1740428269 - -15 + var_1 - var= _1 + var_3 - var_1; var_12 +=3D var_2 - var_9 + var_4 - var_2 + 1349088205; var_2 +=3D 691490244 - var_2 + var_9 - var_4 + 524287 + var_0 - 130= 944 + var_8; var_2 +=3D var_1 - var_2 + -1278891492 + var_0 + var_10 / var_2 - 1060987095 / var_10; if (var_4) { var_15 +=3D var_3 + var_2 + var_12 - var_10 + var_4 - var_10 + = var_2 + var_0; var_0 +=3D -1 - -2147483648 + -1106137664 + 653639923 + 2993316= 79; var_17 +=3D 691490241 + var_2 + var_4 - 1 + -691490244; var_18 +=3D 7; } var_0 +=3D var_2 + var_2 + var_17 - var_11 + 908521917 + 691490232 + var_18 + var_2; var_3 +=3D -2147483627 - var_15 + var_4 - -4 - 1026228299; var_3 +=3D 524287 + var_2 - var_1 - var_12 - var_15; var_22 +=3D var_0 << -1630330270 + 1630330281 - 11 + -691490226 + v= ar_2 - 917504 - var_2 + var_1 + var_0; var_0 +=3D var_22 - var_11 + var_2 + var_0 + var_17 + var_2 - var_3= - var_10; var_3 +=3D -2147483644 + 1859189279 + var_10 + var_3 + var_10 - var= _4 + var_12 - -2147483648; var_25 +=3D var_3 / var_0 / var_10 / var_9 * 28 / var_0 / var_8 / v= ar_3; var_26 +=3D var_4 - 416142146 - -754359525 + 2147483647 - 691490244= + var_8 + 359765153 + var_1; var_27 +=3D var_4 ^ 66977792 | -1275910637 & 543545229 - -524287 + = var_0 + var_2 + var_4; var_0 +=3D var_4 | var_15 & var_0 | 12 | 13 ^ var_2 ^ var_2 & var_1= 0; var_1 +=3D 524287 + var_2 + 2147483632 + var_2 + 75252783 + 1 - 587589943; var_30 +=3D 383955870 - var_4 - -1693411264 + var_0 + var_3 + var_0= - var_3 + var_0; var_1 +=3D -524267 + 65535 + var_9 + var_0 - var_2 - var_4; var_0 +=3D 142220097 + var_3 - var_1 - var_4 + 2147483632 - var_18 - var_4; var_3 +=3D -691490232; var_2 +=3D -307713567 & var_1 ^ var_4 - var_2 + -691490245 + 24 + v= ar_25; var_3 +=3D var_4 + 983040 - var_0 - var_17 + var_1 - 68189835 + var= _25 + var_0; var_45 +=3D -2147483643; } } Because `var_4` is a loop invariant so we can hoist the if condition out of= the loop, but gcc-trunk -O3 dose not (main parts): .L5: mov DWORD PTR [rsp-56], eax .L3: ... cmp r8d, -1099697352 je .L2 ... .L2: ... jle .L5 ... Thank you very much for your time and effort! We look forward to hearing fr= om you.=