[PATCH] D103009: [DSE] Transform memset + malloc --> calloc (PR25892)

Alexander Kornienko via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 19 14:58:58 PDT 2021


alexfh added a comment.

In D103009#2954485 <https://reviews.llvm.org/D103009#2954485>, @xbolva00 wrote:

> In D103009#2954430 <https://reviews.llvm.org/D103009#2954430>, @alexfh wrote:
>
>> This commit seems to cause memory usage (rss) increase in MariaDB's mysqld by a factor of 4. Looking back into the history, I found that the previous commit here caused the same regression, but we quickly picked up the revert and moved on. Now I'm trying to isolate the problem, but it's taking time.
>> So far, my sole hypothesis is that malloc + memset of a smaller size can still be converted to calloc. But I have no evidence so far. Naive attempts to synthetically reproduce this didn't work. Maybe this only happens when some UB is in place, but again, I have nothing to back this up.
>>
>> Given this is a quite serious regression, can we roll this back while I'm investigating?
>
> You should be able to use flag -fno-builtin-calloc to disable this transformation.
>
> This transformation is correct and valid; GCC does it as well. No reason to revert, not justified. You should check asm diffs w and w/o patch for any surprises.

I found and reduced a test case that shows a too eager replacement of malloc with calloc:

https://gcc.godbolt.org/z/dTjonof74

  $ cat test.cc
  #include <stdlib.h>
  #include <string.h>
  
  void *my_malloc(size_t size, int my_flags)
  {
    void* point = malloc(size);
    if (my_flags & 32) memset(point, 0, size);
    return point;
  }
  
  $ clang -O2 -o test.o -save-temps -c test.cc  && cat test.s
          .text
          .file   "test.cc"
          .globl  _Z9my_mallocmi                  # -- Begin function _Z9my_mallocmi
          .p2align        4, 0x90
          .type   _Z9my_mallocmi, at function
  _Z9my_mallocmi:                         # @_Z9my_mallocmi
          .cfi_startproc
  # %bb.0:
          pushq   %rax
          .cfi_def_cfa_offset 16
          movq    %rdi, %rsi
          movl    $1, %edi
          callq   calloc at PLT
          popq    %rcx
          .cfi_def_cfa_offset 8
          retq
  .Lfunc_end0:
          .size   _Z9my_mallocmi, .Lfunc_end0-_Z9my_mallocmi
          .cfi_endproc
                                          # -- End function
          .ident  "clang version trunk (45ac5f5441818afa1b0ee4a3734583c8cc915a79)"
          .section        ".note.GNU-stack","", at progbits
          .addrsig

This is quite a serious problem. Would you please revert while working on a fix?


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D103009/new/

https://reviews.llvm.org/D103009



More information about the llvm-commits mailing list