Skip to content

Can't optimize loop assignment into memset #45466

Closed
@quininer

Description

@quininer

https://godbolt.org/g/9uWCF8

pub fn memzero(data: &mut [u8]) {
    for i in 0..data.len() {
        data[i] = 0;
    }
}
example::memzero:
  push rbp
  mov rbp, rsp
  test rsi, rsi
  je .LBB0_13
  cmp rsi, 31
  jbe .LBB0_2
  mov rax, rsi
  and rax, -32
  je .LBB0_2
  lea r8, [rax - 32]
  mov ecx, r8d
  shr ecx, 5
  inc ecx
  and rcx, 7
  je .LBB0_5
  neg rcx
  xor edx, edx
  xorps xmm0, xmm0
.LBB0_7:
  movups xmmword ptr [rdi + rdx], xmm0
  movups xmmword ptr [rdi + rdx + 16], xmm0
  add rdx, 32
  inc rcx
  jne .LBB0_7
  jmp .LBB0_8
.LBB0_2:
  xor eax, eax
.LBB0_12:
  mov byte ptr [rdi + rax], 0
  inc rax
  cmp rax, rsi
  jb .LBB0_12
.LBB0_13:
  pop rbp
  ret
.LBB0_5:
  xor edx, edx
.LBB0_8:
  cmp r8, 224
  jb .LBB0_11
  mov rcx, rax
  sub rcx, rdx
  lea rdx, [rdi + rdx + 240]
  xorps xmm0, xmm0
.LBB0_10:
  movups xmmword ptr [rdx - 240], xmm0
  movups xmmword ptr [rdx - 224], xmm0
  movups xmmword ptr [rdx - 208], xmm0
  movups xmmword ptr [rdx - 192], xmm0
  movups xmmword ptr [rdx - 176], xmm0
  movups xmmword ptr [rdx - 160], xmm0
  movups xmmword ptr [rdx - 144], xmm0
  movups xmmword ptr [rdx - 128], xmm0
  movups xmmword ptr [rdx - 112], xmm0
  movups xmmword ptr [rdx - 96], xmm0
  movups xmmword ptr [rdx - 80], xmm0
  movups xmmword ptr [rdx - 64], xmm0
  movups xmmword ptr [rdx - 48], xmm0
  movups xmmword ptr [rdx - 32], xmm0
  movups xmmword ptr [rdx - 16], xmm0
  movups xmmword ptr [rdx], xmm0
  add rdx, 256
  add rcx, -256
  jne .LBB0_10
.LBB0_11:
  cmp rax, rsi
  jne .LBB0_12
  jmp .LBB0_13

This is normal before rustc 1.20, which is a performance regression.

Metadata

Metadata

Assignees

No one assigned

    Labels

    C-enhancementCategory: An issue proposing an enhancement or a PR with one.I-slowIssue: Problems and improvements with respect to performance of generated code.P-highHigh priorityT-compilerRelevant to the compiler team, which will review and decide on the PR/issue.regression-from-stable-to-stablePerformance or correctness regression from one stable version to another.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions