Files
clang-p2996/llvm/test/Transforms/SLPVectorizer/X86/insert-shuffle.ll
Alexey Bataev dfe1e9dd79 [SLP]Improve reordering of clustered reused scalars.
If the reused scalars are clustered, i.e. each part of the reused mask
contains all elements of the original scalars exactly once, we can
reorder those clusters to improve the whole ordering of of the clustered
vectors.

Differential Revision: https://reviews.llvm.org/D133524
2022-09-12 06:52:25 -07:00

59 lines
3.2 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt -slp-vectorizer -S -o - -mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s
%struct.sw = type { float, float, float, float }
define { <2 x float>, <2 x float> } @foo(%struct.sw* %v) {
; CHECK-LABEL: @foo(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[TMP0:%.*]] = load float, float* undef, align 4
; CHECK-NEXT: [[X:%.*]] = getelementptr inbounds [[STRUCT_SW:%.*]], %struct.sw* [[V:%.*]], i64 0, i32 0
; CHECK-NEXT: [[TMP1:%.*]] = load float, float* undef, align 4
; CHECK-NEXT: [[TMP2:%.*]] = bitcast float* [[X]] to <2 x float>*
; CHECK-NEXT: [[TMP3:%.*]] = load <2 x float>, <2 x float>* [[TMP2]], align 16
; CHECK-NEXT: [[SHUFFLE:%.*]] = shufflevector <2 x float> [[TMP3]], <2 x float> poison, <4 x i32> <i32 0, i32 1, i32 0, i32 1>
; CHECK-NEXT: [[TMP4:%.*]] = insertelement <4 x float> poison, float [[TMP0]], i32 0
; CHECK-NEXT: [[TMP5:%.*]] = insertelement <4 x float> [[TMP4]], float [[TMP1]], i32 1
; CHECK-NEXT: [[SHUFFLE1:%.*]] = shufflevector <4 x float> [[TMP5]], <4 x float> poison, <4 x i32> <i32 undef, i32 0, i32 1, i32 undef>
; CHECK-NEXT: [[TMP6:%.*]] = fmul <4 x float> [[SHUFFLE]], [[SHUFFLE1]]
; CHECK-NEXT: [[TMP7:%.*]] = fadd <4 x float> [[TMP6]], undef
; CHECK-NEXT: [[TMP8:%.*]] = fadd <4 x float> [[TMP7]], undef
; CHECK-NEXT: [[TMP9:%.*]] = fadd <4 x float> [[TMP8]], undef
; CHECK-NEXT: [[TMP10:%.*]] = shufflevector <4 x float> [[TMP9]], <4 x float> poison, <2 x i32> <i32 1, i32 0>
; CHECK-NEXT: [[TMP11:%.*]] = shufflevector <4 x float> [[TMP9]], <4 x float> poison, <2 x i32> <i32 2, i32 3>
; CHECK-NEXT: [[INS1:%.*]] = insertvalue { <2 x float>, <2 x float> } undef, <2 x float> [[TMP10]], 0
; CHECK-NEXT: [[INS2:%.*]] = insertvalue { <2 x float>, <2 x float> } [[INS1]], <2 x float> [[TMP11]], 1
; CHECK-NEXT: ret { <2 x float>, <2 x float> } [[INS2]]
;
entry:
%0 = load float, float* undef, align 4
%x = getelementptr inbounds %struct.sw, %struct.sw* %v, i64 0, i32 0
%1 = load float, float* %x, align 16
%y = getelementptr inbounds %struct.sw, %struct.sw* %v, i64 0, i32 1
%2 = load float, float* %y, align 4
%mul3 = fmul float %0, %2
%add = fadd float undef, %mul3
%add6 = fadd float %add, undef
%add9 = fadd float %add6, undef
%mul12 = fmul float %1, undef
%add16 = fadd float %mul12, undef
%add20 = fadd float undef, %add16
%add24 = fadd float undef, %add20
%3 = load float, float* undef, align 4
%mul27 = fmul float %1, %3
%add31 = fadd float %mul27, undef
%add35 = fadd float undef, %add31
%add39 = fadd float undef, %add35
%mul45 = fmul float %2, undef
%add46 = fadd float undef, %mul45
%add50 = fadd float undef, %add46
%add54 = fadd float undef, %add50
%vec1 = insertelement <2 x float> undef, float %add9, i32 0
%vec2 = insertelement <2 x float> %vec1, float %add24, i32 1
%vec3 = insertelement <2 x float> undef, float %add39, i32 0
%vec4 = insertelement <2 x float> %vec3, float %add54, i32 1
%ins1 = insertvalue { <2 x float>, <2 x float> } undef, <2 x float> %vec2, 0
%ins2 = insertvalue { <2 x float>, <2 x float> } %ins1, <2 x float> %vec4, 1
ret { <2 x float>, <2 x float> } %ins2
}