Skip to content

[x86-64 BMI2] Missed BLSR emit when AND is factored out of ternary conditional #133848

@Validark

Description

@Validark

Godbolt link

#include <stdint.h>

uint64_t blsr_test_cmove(uint64_t rdi, uint64_t rsi) {
    uint64_t rax = rdi & (rdi - 1);
    return (rsi != 0) ? rax : rdi;
}

Emits:

blsr_test_cmove:
        cmp     rsi, 1
        lea     rcx, [rdi - 1]
        sbb     rax, rax
        or      rax, rcx
        and     rax, rdi
        ret

Should be:

blsr_test_cmove:
        blsr    rax, rdi
        test    rsi, rsi
        cmove   rax, rdi
        ret

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions