llvm/llvm-project

[x86] Eliminate `movzx` when upper part of register is irrelevant or overwritten

Open

#168.828 geöffnet am 20. Nov. 2025

Auf GitHub ansehen
 (16 Kommentare) (0 Reaktionen) (1 zugewiesene Person)C++ (10.782 Forks)batch import
backend:X86good first issuellvm:SelectionDAGmissed-optimization

Repository-Metriken

Stars
 (26.378 Stars)
PR-Merge-Metriken
 (Durchschn. Merge 1T 2h) (1.000 gemergte PRs in 30 T)

Beschreibung

export fn foo(x: u8) u32 {
    return @ctz(x >> 1);
}
foo:
        shr     dil
        movzx   eax, dil
        or      eax, 256
        tzcnt   eax, eax
        ret

Could be:

foo:
        shr     dil
        or      edi, 256
        tzcnt   eax, edi
        ret

The compiler could also look for things like or eax, -256 and eliminate movzx eax, al since the relevant bits are overwritten anyway.

Contributor Guide