Open
Description
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
}