public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug tree-optimization/111640] New: Missed optimization of Loop Unswitch (Simple loops)
@ 2023-09-29 14:43 652023330028 at smail dot nju.edu.cn
  2023-09-29 15:38 ` [Bug tree-optimization/111640] " pinskia at gcc dot gnu.org
  2023-09-29 15:41 ` pinskia at gcc dot gnu.org
  0 siblings, 2 replies; 3+ messages in thread
From: 652023330028 at smail dot nju.edu.cn @ 2023-09-29 14:43 UTC (permalink / raw)
  To: gcc-bugs

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.

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [Bug tree-optimization/111640] Missed optimization of Loop Unswitch (Simple loops)
  2023-09-29 14:43 [Bug tree-optimization/111640] New: Missed optimization of Loop Unswitch (Simple loops) 652023330028 at smail dot nju.edu.cn
@ 2023-09-29 15:38 ` pinskia at gcc dot gnu.org
  2023-09-29 15:41 ` pinskia at gcc dot gnu.org
  1 sibling, 0 replies; 3+ messages in thread
From: pinskia at gcc dot gnu.org @ 2023-09-29 15:38 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111640

--- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> ---

Induction variable (int) var_45_lsm.67_240 + -2147483643 + -2147483643 *
iteration does not wrap in statement _153 = var_45_lsm.67_226 + -2147483643;
 in loop 1.
Statement _153 = var_45_lsm.67_226 + -2147483643;
 is executed at most 1 (bounded by 1) + 1 times in loop 1.
Reducing loop iteration estimate by 1; undefined statement must be executed at
the last iteration.
/app/example.cpp:20:27: note: Not unswitching, loop is not expected to iterate


So ....

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [Bug tree-optimization/111640] Missed optimization of Loop Unswitch (Simple loops)
  2023-09-29 14:43 [Bug tree-optimization/111640] New: Missed optimization of Loop Unswitch (Simple loops) 652023330028 at smail dot nju.edu.cn
  2023-09-29 15:38 ` [Bug tree-optimization/111640] " pinskia at gcc dot gnu.org
@ 2023-09-29 15:41 ` pinskia at gcc dot gnu.org
  1 sibling, 0 replies; 3+ messages in thread
From: pinskia at gcc dot gnu.org @ 2023-09-29 15:41 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111640

Andrew Pinski <pinskia at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
         Resolution|---                         |INVALID
             Status|UNCONFIRMED                 |RESOLVED

--- Comment #2 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
If we change the for loop to be:
for (int i_0 = 0; i_0 < 4 + -1; i_0 +=  1)

Then it unswitches.

Or just use  -fwrapv which makes the undefined code to become defined.

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2023-09-29 15:41 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-09-29 14:43 [Bug tree-optimization/111640] New: Missed optimization of Loop Unswitch (Simple loops) 652023330028 at smail dot nju.edu.cn
2023-09-29 15:38 ` [Bug tree-optimization/111640] " pinskia at gcc dot gnu.org
2023-09-29 15:41 ` pinskia at gcc dot gnu.org

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).