https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111640
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 have missed. 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 think. https://godbolt.org/z/M3b61qqno Given the following code: 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 = 0; i_0 < 4 + -1986643035 + 1 - 1 + 1986643054; i_0 += var_3 - var_1 - var_3 - var_10 + var_10 + -636989219 + var_2 - 691490232 - 1995983094) { var_11 += 691490244 + 1118573265 - 1740428269 - -15 + var_1 - var_1 + var_3 - var_1; var_12 += var_2 - var_9 + var_4 - var_2 + 1349088205; var_2 += 691490244 - var_2 + var_9 - var_4 + 524287 + var_0 - 130944 + var_8; var_2 += var_1 - var_2 + -1278891492 + var_0 + var_10 / var_2 - 1060987095 / var_10; if (var_4) { var_15 += var_3 + var_2 + var_12 - var_10 + var_4 - var_10 + var_2 + var_0; var_0 += -1 - -2147483648 + -1106137664 + 653639923 + 299331679; var_17 += 691490241 + var_2 + var_4 - 1 + -691490244; var_18 += 7; } var_0 += var_2 + var_2 + var_17 - var_11 + 908521917 + 691490232 + var_18 + var_2; var_3 += -2147483627 - var_15 + var_4 - -4 - 1026228299; var_3 += 524287 + var_2 - var_1 - var_12 - var_15; var_22 += var_0 << -1630330270 + 1630330281 - 11 + -691490226 + var_2 - 917504 - var_2 + var_1 + var_0; var_0 += var_22 - var_11 + var_2 + var_0 + var_17 + var_2 - var_3 - var_10; var_3 += -2147483644 + 1859189279 + var_10 + var_3 + var_10 - var_4 + var_12 - -2147483648; var_25 += var_3 / var_0 / var_10 / var_9 * 28 / var_0 / var_8 / var_3; var_26 += var_4 - 416142146 - -754359525 + 2147483647 - 691490244 + var_8 + 359765153 + var_1; var_27 += var_4 ^ 66977792 | -1275910637 & 543545229 - -524287 + var_0 + var_2 + var_4; var_0 += var_4 | var_15 & var_0 | 12 | 13 ^ var_2 ^ var_2 & var_10; var_1 += 524287 + var_2 + 2147483632 + var_2 + 75252783 + 1 - 587589943; var_30 += 383955870 - var_4 - -1693411264 + var_0 + var_3 + var_0 - var_3 + var_0; var_1 += -524267 + 65535 + var_9 + var_0 - var_2 - var_4; var_0 += 142220097 + var_3 - var_1 - var_4 + 2147483632 - var_18 - var_4; var_3 += -691490232; var_2 += -307713567 & var_1 ^ var_4 - var_2 + -691490245 + 24 + var_25; var_3 += var_4 + 983040 - var_0 - var_17 + var_1 - 68189835 + var_25 + var_0; var_45 += -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 from you.