[llvm-bugs] [Bug 34797] New: Memory allocation is not omitted in simple case

via llvm-bugs llvm-bugs at lists.llvm.org
Mon Oct 2 02:54:33 PDT 2017


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

            Bug ID: 34797
           Summary: Memory allocation is not omitted in simple case
           Product: clang
           Version: trunk
          Hardware: PC
                OS: Linux
            Status: NEW
          Severity: enhancement
          Priority: P
         Component: C++14
          Assignee: unassignedclangbugs at nondot.org
          Reporter: antoshkka at gmail.com
                CC: llvm-bugs at lists.llvm.org

For the following function


unsigned lame_zero(unsigned count) {
    unsigned res = 0;

    // erase `count +` for omitting `call operator new`
    unsigned *p = new unsigned[count + 1]();

    res = p[0]; // or erase this line for omitting `call operator new`

    delete[] p;
    return res;
}


clang generates calls to `operator new` even in C++1z mode:

lame_zero(unsigned int): # @lame_zero(unsigned int)
  push r14
  push rbx
  push rax
  mov ebx, edi
  inc ebx
  shl rbx, 2
  mov rdi, rbx
  call operator new[](unsigned long)
  mov r14, rax
  xor esi, esi
  mov rdi, r14
  mov rdx, rbx
  call memset
  mov ebx, dword ptr [r14]
  mov rdi, r14
  call operator delete[](void*)
  mov eax, ebx
  add rsp, 8
  pop rbx
  pop r14
  ret

This seems suboptimal and affects common code, like std::stable_sort usages:


#include <algorithm>
#include <array>

std::array<unsigned, 6> my_sorted_array() {
    std::array<unsigned, 6> data = {1, 2, 7, 7, 7, 0};

    // Multiple calls to operator new[] are not omitted
    std::stable_sort(data.begin(), data.end());

    return data;
}

-- 
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20171002/7f7b2549/attachment.html>


More information about the llvm-bugs mailing list