https://bugs.llvm.org/show_bug.cgi?id=35745

            Bug ID: 35745
           Summary: Ignoring to directly use EAX register while preserving
                    it for the same return value
           Product: libraries
           Version: trunk
          Hardware: PC
                OS: Windows NT
            Status: NEW
          Severity: enhancement
          Priority: P
         Component: Backend: X86
          Assignee: unassignedb...@nondot.org
          Reporter: mrrr...@gmail.com
                CC: llvm-bugs@lists.llvm.org

Created attachment 19602
  --> https://bugs.llvm.org/attachment.cgi?id=19602&action=edit
Same testcase as on god bolt link

Here is the god bolt link with the short testcase https://godbolt.org/g/KZCFUC

    struct mrgl_hashmap_node* pNode = pMainNode->pNext;

    while(pNode != NULL){
        if(pNode->key == key){
            return pNode;
        }
        pNode = pNode->pNext;
    }

    return pNode;



  mov edx, dword ptr [edx + esi + 12]
  xor eax, eax
  test edx, edx
  jne .LBB0_3
  jmp .LBB0_5
.LBB0_6: # in Loop: Header=BB0_3 Depth=1
  mov edx, dword ptr [edx + 4]
  test edx, edx
  je .LBB0_5
.LBB0_3: # =>This Inner Loop Header: Depth=1
  cmp dword ptr [edx], ecx
  jne .LBB0_6
  mov eax, edx
.LBB0_5:
  pop esi
  ret

Instead of loading pointer in edx, codegen could use eax directly so we will
not need to "xor eax, eax" and "mov eax, edx" which is clang did perfectly with
previous if statement (row 44) in test case where is mask used directly as
return result. Gcc 7.2.0 does perfect job with it and use eax directly.

-- 
You are receiving this mail because:
You are on the CC list for the bug.
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to