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

            Bug ID: 64622
           Summary: convoluted loop codegen for __strcspn_c1
           Product: gcc
           Version: 5.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: hubicka at gcc dot gnu.org

Compiling
extern __inline long                                                          
__strcspn_c1 (__const char *__s, int __reject)                                  
{                                                                               
  register long __result = 0;                                                 
  while (__s[__result] != '\0' && __s[__result] != __reject)                    
    ++__result;                                                                 
  return __result;                                                              
}                                                                               

With -O2 gives:
__strcspn_c1:
.LFB0:
        .cfi_startproc
        movsbl  (%rdi), %eax
        testb   %al, %al
        je      .L4
        cmpl    %eax, %esi
        movl    $0, %eax
        jne     .L3
        jmp     .L2
        .p2align 4,,10
        .p2align 3
.L12:
        cmpl    %esi, %edx
        je      .L11
.L3:
        addq    $1, %rax
        movsbl  (%rdi,%rax), %edx
        testb   %dl, %dl
        jne     .L12
.L2:
        rep ret
        .p2align 4,,10
        .p2align 3
.L11:
        rep ret
.L4:
        xorl    %eax, %eax
        ret


Whilie clang produces:
__strcspn_c1:                           # @__strcspn_c1
        .cfi_startproc
# BB#0:
        movq    $-1, %rax
        .align  16, 0x90
.LBB0_1:                                # =>This Inner Loop Header: Depth=1
        movsbl  1(%rdi,%rax), %ecx
        incq    %rax
        testl   %ecx, %ecx
        je      .LBB0_3
# BB#2:                                 #   in Loop: Header=BB0_1 Depth=1
        cmpl    %esi, %ecx
        jne     .LBB0_1
.LBB0_3:                                # %.critedge
        retq

Reply via email to