Changeset View
Changeset View
Standalone View
Standalone View
llvm/test/Transforms/SLPVectorizer/X86/insert-shuffle.ll
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py | ; 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 | ; RUN: opt -slp-vectorizer -S -o - -mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s | ||||
%struct.sw = type { float, float, float, float } | %struct.sw = type { float, float, float, float } | ||||
define { <2 x float>, <2 x float> } @foo(%struct.sw* %v) { | define { <2 x float>, <2 x float> } @foo(%struct.sw* %v) { | ||||
; CHECK-LABEL: @foo( | ; CHECK-LABEL: @foo( | ||||
; CHECK-NEXT: entry: | ; CHECK-NEXT: entry: | ||||
; CHECK-NEXT: [[TMP0:%.*]] = load float, float* undef, align 4 | ; 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: [[X:%.*]] = getelementptr inbounds [[STRUCT_SW:%.*]], %struct.sw* [[V:%.*]], i64 0, i32 0 | ||||
; CHECK-NEXT: [[Y:%.*]] = getelementptr inbounds [[STRUCT_SW]], %struct.sw* [[V]], i64 0, i32 1 | ; CHECK-NEXT: [[Y:%.*]] = getelementptr inbounds [[STRUCT_SW]], %struct.sw* [[V]], i64 0, i32 1 | ||||
; CHECK-NEXT: [[TMP1:%.*]] = bitcast float* [[X]] to <2 x float>* | ; CHECK-NEXT: [[TMP1:%.*]] = bitcast float* [[X]] to <2 x float>* | ||||
; CHECK-NEXT: [[TMP2:%.*]] = load <2 x float>, <2 x float>* [[TMP1]], align 16 | ; CHECK-NEXT: [[TMP2:%.*]] = load <2 x float>, <2 x float>* [[TMP1]], align 16 | ||||
; CHECK-NEXT: [[SHUFFLE:%.*]] = shufflevector <2 x float> [[TMP2]], <2 x float> poison, <4 x i32> <i32 1, i32 0, i32 0, i32 1> | ; CHECK-NEXT: [[SHUFFLE:%.*]] = shufflevector <2 x float> [[TMP2]], <2 x float> poison, <4 x i32> <i32 1, i32 0, i32 0, i32 1> | ||||
; CHECK-NEXT: [[TMP3:%.*]] = load float, float* undef, align 4 | ; CHECK-NEXT: [[TMP3:%.*]] = load float, float* undef, align 4 | ||||
; CHECK-NEXT: [[TMP4:%.*]] = insertelement <4 x float> poison, float [[TMP0]], i32 0 | ; CHECK-NEXT: [[TMP4:%.*]] = insertelement <2 x float> poison, float [[TMP0]], i32 0 | ||||
; CHECK-NEXT: [[TMP5:%.*]] = insertelement <4 x float> [[TMP4]], float [[TMP3]], i32 1 | ; CHECK-NEXT: [[TMP5:%.*]] = insertelement <2 x float> [[TMP4]], float [[TMP3]], i32 1 | ||||
; CHECK-NEXT: [[SHUFFLE1:%.*]] = shufflevector <4 x float> [[TMP5]], <4 x float> poison, <4 x i32> <i32 0, i32 undef, i32 1, i32 undef> | ; CHECK-NEXT: [[TMP6:%.*]] = shufflevector <2 x float> [[TMP5]], <2 x float> undef, <4 x i32> <i32 0, i32 2, i32 1, i32 3> | ||||
; CHECK-NEXT: [[TMP6:%.*]] = fmul <4 x float> [[SHUFFLE]], [[SHUFFLE1]] | ; CHECK-NEXT: [[TMP7:%.*]] = fmul <4 x float> [[SHUFFLE]], [[TMP6]] | ||||
; CHECK-NEXT: [[TMP7:%.*]] = fadd <4 x float> poison, [[TMP6]] | ; CHECK-NEXT: [[TMP8:%.*]] = fadd <4 x float> poison, [[TMP7]] | ||||
; CHECK-NEXT: [[TMP8:%.*]] = fadd <4 x float> [[TMP7]], poison | |||||
; CHECK-NEXT: [[TMP9:%.*]] = fadd <4 x float> [[TMP8]], poison | ; CHECK-NEXT: [[TMP9:%.*]] = fadd <4 x float> [[TMP8]], poison | ||||
; CHECK-NEXT: [[TMP10:%.*]] = extractelement <4 x float> [[TMP9]], i32 0 | ; CHECK-NEXT: [[TMP10:%.*]] = fadd <4 x float> [[TMP9]], poison | ||||
; CHECK-NEXT: [[VEC1:%.*]] = insertelement <2 x float> undef, float [[TMP10]], i32 0 | ; CHECK-NEXT: [[TMP11:%.*]] = extractelement <4 x float> [[TMP10]], i32 0 | ||||
; CHECK-NEXT: [[TMP11:%.*]] = extractelement <4 x float> [[TMP9]], i32 1 | ; CHECK-NEXT: [[VEC1:%.*]] = insertelement <2 x float> undef, float [[TMP11]], i32 0 | ||||
; CHECK-NEXT: [[VEC2:%.*]] = insertelement <2 x float> [[VEC1]], float [[TMP11]], i32 1 | ; CHECK-NEXT: [[TMP12:%.*]] = extractelement <4 x float> [[TMP10]], i32 1 | ||||
; CHECK-NEXT: [[TMP12:%.*]] = extractelement <4 x float> [[TMP9]], i32 2 | ; CHECK-NEXT: [[VEC2:%.*]] = insertelement <2 x float> [[VEC1]], float [[TMP12]], i32 1 | ||||
; CHECK-NEXT: [[VEC3:%.*]] = insertelement <2 x float> undef, float [[TMP12]], i32 0 | ; CHECK-NEXT: [[TMP13:%.*]] = extractelement <4 x float> [[TMP10]], i32 2 | ||||
; CHECK-NEXT: [[TMP13:%.*]] = extractelement <4 x float> [[TMP9]], i32 3 | ; CHECK-NEXT: [[VEC3:%.*]] = insertelement <2 x float> undef, float [[TMP13]], i32 0 | ||||
; CHECK-NEXT: [[VEC4:%.*]] = insertelement <2 x float> [[VEC3]], float [[TMP13]], i32 1 | ; CHECK-NEXT: [[TMP14:%.*]] = extractelement <4 x float> [[TMP10]], i32 3 | ||||
; CHECK-NEXT: [[VEC4:%.*]] = insertelement <2 x float> [[VEC3]], float [[TMP14]], i32 1 | |||||
; CHECK-NEXT: [[INS1:%.*]] = insertvalue { <2 x float>, <2 x float> } undef, <2 x float> [[VEC2]], 0 | ; CHECK-NEXT: [[INS1:%.*]] = insertvalue { <2 x float>, <2 x float> } undef, <2 x float> [[VEC2]], 0 | ||||
; CHECK-NEXT: [[INS2:%.*]] = insertvalue { <2 x float>, <2 x float> } [[INS1]], <2 x float> [[VEC4]], 1 | ; CHECK-NEXT: [[INS2:%.*]] = insertvalue { <2 x float>, <2 x float> } [[INS1]], <2 x float> [[VEC4]], 1 | ||||
; CHECK-NEXT: ret { <2 x float>, <2 x float> } [[INS2]] | ; CHECK-NEXT: ret { <2 x float>, <2 x float> } [[INS2]] | ||||
; | ; | ||||
entry: | entry: | ||||
%0 = load float, float* undef, align 4 | %0 = load float, float* undef, align 4 | ||||
%x = getelementptr inbounds %struct.sw, %struct.sw* %v, i64 0, i32 0 | %x = getelementptr inbounds %struct.sw, %struct.sw* %v, i64 0, i32 0 | ||||
%1 = load float, float* %x, align 16 | %1 = load float, float* %x, align 16 | ||||
Show All 27 Lines |