Skip to content

Make constant vector <i64 poison, i64 -9223372036854775808> able to reuse <i64 0, i64 -9223372036854775808> #141706

Open
@Validark

Description

@Validark

Here's some LLVM IR:

define dso_local <8 x i64> @bar(<8 x i64> %0) local_unnamed_addr {
Entry:
  %1 = shufflevector <8 x i64> <i64 poison, i64 poison, i64 poison, i64 poison, i64 poison, i64 poison, i64 poison, i64 -9223372036854775808>, <8 x i64> %0, <8 x i32> <i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14>
  %2 = tail call <8 x i64> @llvm.fshl.v8i64(<8 x i64> %0, <8 x i64> %1, <8 x i64> splat (i64 1))
  %3 = xor <8 x i64> %2, <i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 -9223372036854775808>
  ret <8 x i64> %3
}

declare <8 x i64> @llvm.fshl.v8i64(<8 x i64>, <8 x i64>, <8 x i64>) #1

This currently gives (for znver5): Godbolt link

.LCPI0_0:
        .quad   -9223372036854775808
.LCPI0_1:
        .quad   0
        .quad   0
        .quad   0
        .quad   0
        .quad   0
        .quad   0
        .quad   0
        .quad   -9223372036854775808
bar:
        valignq zmm1, zmm0, qword ptr [rip + .LCPI0_0]{1to8}, 7
        vpshldq zmm0, zmm0, zmm1, 1
        vpxorq  zmm0, zmm0, zmmword ptr [rip + .LCPI0_1]
        ret

Could be:

.LCPI0_0:
        .quad   0
        .quad   0
        .quad   0
        .quad   0
        .quad   0
        .quad   0
        .quad   0
        .quad   -9223372036854775808
bar:
        vmovdqa64       zmm2, zmmword ptr [rip + .LCPI0_0]
        valignq zmm1, zmm0, zmm2, 7
        vpshldq zmm0, zmm0, zmm1, 1
        vpxorq  zmm0, zmm0, zmm2
        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