Skip to content

[SLPVectorizer][X86] Addition no longer vectorized #144276

Open
@nikic

Description

@nikic

From rust-lang/rust#142519: The addition here was vectorized in LLVM 19, but is no longer vectorized in LLVM 20.

https://llvm.godbolt.org/z/nfPT9zsvv

target triple = "x86_64-unknown-linux-gnu"

define void @test(ptr %p.prev, ptr %p, i64 %len) {
entry:
  br label %loop

loop:
  %prev4 = phi i8 [ %extract4, %loop ], [ 0, %entry ]
  %prev3 = phi i8 [ %extract3, %loop ], [ 0, %entry ]
  %prev2 = phi i8 [ %extract2, %loop ], [ 0, %entry ]
  %prev1 = phi i8 [ %extract1, %loop ], [ 0, %entry ]
  %iv = phi i64 [ %iv.next, %loop ], [ 0, %entry ]
  %iv.next = add nuw nsw i64 %iv, 1
  %shl = shl i64 %iv, 2
  %gep1 = getelementptr inbounds i8, ptr %p, i64 %shl
  %v1 = load i8, ptr %gep1, align 1
  %gep2 = getelementptr inbounds i8, ptr %gep1, i64 1
  %v2 = load i8, ptr %gep2, align 1
  %gep3 = getelementptr inbounds i8, ptr %gep1, i64 2
  %v3 = load i8, ptr %gep3, align 1
  %gep4 = getelementptr inbounds i8, ptr %gep1, i64 3
  %v4 = load i8, ptr %gep4, align 1
  %sum4 = add i8 %v4, %prev4
  %sum3 = add i8 %v3, %prev3
  %sum2 = add i8 %v2, %prev2
  %sum1 = add i8 %v1, %prev1
  store i8 %sum1, ptr %gep1, align 1
  store i8 %sum2, ptr %gep2, align 1
  store i8 %sum3, ptr %gep3, align 1
  store i8 %sum4, ptr %gep4, align 1
  %prev.gep = getelementptr inbounds i8, ptr %p.prev, i64 %shl
  %prev.load = load i32, ptr %prev.gep, align 1
  %extract1 = trunc i32 %prev.load to i8
  %lshr2 = lshr i32 %prev.load, 8
  %extract2 = trunc i32 %lshr2 to i8
  %lshr3 = lshr i32 %prev.load, 16
  %extract3 = trunc i32 %lshr3 to i8
  %lshr4 = lshr i32 %prev.load, 24
  %extract4 = trunc nuw i32 %lshr4 to i8
  %exit.cond = icmp eq i64 %iv.next, %len
  br i1 %exit.cond, label %exit, label %loop

exit:
  ret void
}

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