Skip to content

(Constant <OP> a) & b & ~c should compile to (Constant <OP> a) & (b & ~c) #161630

@Validark

Description

@Validark

This code: (C Godbolt Zig Godbolt, LLVM Godbolt)

const C: u64 = 1234;

fn foo(a: u64, b: u64, c: u64) u64 {
    return (C ^ a) & b & ~c;
}

Compiles to:

foo:
        xor     rdi, 1234
        and     rdi, rsi
        andn    rax, rdx, rdi
        ret

Should be:

foo:
        xor     rdi, 1234
        andn    rax, rdx, rsi ; Can be done in parallel to xor!
        and     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