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

            Bug ID: 106078
           Summary: Invalid loop invariant motion with non-call-exceptions
           Product: gcc
           Version: 13.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: middle-end
          Assignee: unassigned at gcc dot gnu.org
          Reporter: hubicka at gcc dot gnu.org
  Target Milestone: ---

Here I think it is invalid to move *b out of the loop with
-fnon-call-exceptions:

int array[10000];
int test(short *b,int e, int f)
{
        for (int i = 0; i<10000;i++)
          {
            e/=f;
            array[i]+=*b+e;
          }
}

jan@localhost:~> more t.s
        .text
        .file   "t.c"
        .globl  _Z4testPsii                     # -- Begin function _Z4testPsii
        .p2align        4, 0x90
        .type   _Z4testPsii,@function
_Z4testPsii:                            # @_Z4testPsii
        .cfi_startproc
# %bb.0:
        movl    %edx, %ecx
        movl    %esi, %eax
        movswl  (%rdi), %esi
        xorl    %edi, %edi
        .p2align        4, 0x90
.LBB0_1:                                # =>This Inner Loop Header: Depth=1
        cltd
        idivl   %ecx
        movl    %eax, %edx
        addl    %esi, %edx
        addl    %edx, array(,%rdi,4)
        addq    $1, %rdi
        jmp     .LBB0_1
.Lfunc_end0:

compiled code will segfault instead dividing by zero.

Reply via email to