[PATCH] D32971: [scudo] CRC32 optimizations

Kostya Kortchinsky via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon May 8 10:15:52 PDT 2017


cryptoad created this revision.
Herald added subscribers: rengolin, aemerson.

This change optimizes several aspects of the checksum used for chunk headers.

First, there is no point in checking the weak symbol `computeHardwareCRC32`
everytime, it will either be there or not when we start, so check it once
during initialization and set the checksum type accordingly.

Then, the loading of `HashAlgorithm` for SSE versions (and ARM equivalent) was
not optimized out, while not necessary. So I reshuffled that part of the code,
which duplicates a tiny bit of code, but ends up in a much cleaner assembly
(and faster as we avoid an extraneous load and some calls).

The following code is the checksum at the end of `scudoMalloc` for x86_64 with
full SSE 4.2, before:

  mov     rax, 0FFFFFFFFFFFFFFh
  shl     r10, 38h
  mov     edi, dword ptr cs:_ZN7__scudoL6CookieE ; __scudo::Cookie
  and     r14, rax
  lea     rsi, [r13-10h]
  movzx   eax, cs:_ZN7__scudoL13HashAlgorithmE ; __scudo::HashAlgorithm
  or      r14, r10
  mov     rbx, r14
  xor     bx, bx
  call    _ZN7__scudo20computeHardwareCRC32Ejm ; __scudo::computeHardwareCRC32(uint,ulong)
  mov     rsi, rbx
  mov     edi, eax
  call    _ZN7__scudo20computeHardwareCRC32Ejm ; __scudo::computeHardwareCRC32(uint,ulong)
  mov     r14w, ax
  mov     rax, r13
  mov     [r13-10h], r14

After:

  mov     rax, cs:_ZN7__scudoL6CookieE ; __scudo::Cookie
  lea     rcx, [rbx-10h]
  mov     rdx, 0FFFFFFFFFFFFFFh
  and     r14, rdx
  shl     r9, 38h
  or      r14, r9
  crc32   eax, rcx
  mov     rdx, r14
  xor     dx, dx
  mov     eax, eax
  crc32   eax, rdx
  mov     r14w, ax
  mov     rax, rbx
  mov     [rbx-10h], r14


https://reviews.llvm.org/D32971

Files:
  lib/scudo/scudo_allocator.cpp
  lib/scudo/scudo_crc32.cpp
  lib/scudo/scudo_crc32.h
  lib/scudo/scudo_utils.h

-------------- next part --------------
A non-text attachment was scrubbed...
Name: D32971.98183.patch
Type: text/x-patch
Size: 13588 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170508/e9ff0bce/attachment.bin>


More information about the llvm-commits mailing list