llvm-project/llvm/test/Transforms/SLPVectorizer/X86/same-scalars-reordered-in-reduction.ll
Alexey Bataev c1660006b2 [SLP]Reorder counters for same values, if the root node is reordered.
The counters for the repeated scalars are ordered in the natural order,
but the original scalars might be reordered during SLP graph reordering
and this order can be dropped. Need to use the scalars after the
reordering, not the original ones, to emit correct code for same value
counters.
2023-04-03 07:52:49 -07:00

35 lines
1.3 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2
; RUN: opt -S -passes=slp-vectorizer -mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s
define i32 @test() {
; CHECK-LABEL: define i32 @test() {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[SQ:%.*]] = alloca [64 x i32], i32 0, align 16
; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds [64 x i32], ptr [[SQ]], i64 0, i64 1
; CHECK-NEXT: [[TMP1:%.*]] = load <4 x i32>, ptr [[TMP0]], align 4
; CHECK-NEXT: [[TMP2:%.*]] = mul <4 x i32> [[TMP1]], <i32 2, i32 3, i32 2, i32 1>
; CHECK-NEXT: [[TMP3:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[TMP2]])
; CHECK-NEXT: ret i32 [[TMP3]]
;
entry:
%sq = alloca [64 x i32], i32 0, align 16
%0 = getelementptr inbounds [64 x i32], ptr %sq, i64 0, i64 1
%elt_1 = load i32, ptr %0, align 4
%1 = getelementptr [64 x i32], ptr %sq, i64 0, i64 2
%elt_2 = load i32, ptr %1, align 8
%2 = getelementptr [64 x i32], ptr %sq, i64 0, i64 3
%elt_3 = load i32, ptr %2, align 4
%3 = getelementptr [64 x i32], ptr %sq, i64 0, i64 4
%elt_4 = load i32, ptr %3, align 16
%4 = add i32 %elt_2, %elt_3
%5 = add i32 %4, %elt_2
%6 = add i32 %5, %elt_1
%7 = add i32 %6, %elt_4
%8 = add i32 %7, %elt_3
%9 = add i32 %8, %elt_2
%10 = add i32 %9, %elt_1
ret i32 %10
}