1 // RUN: %clang -emit-llvm -S -o - %s | FileCheck %s 2 3 typedef float float4 __attribute__((ext_vector_type(4))); 4 typedef unsigned int uint4 __attribute__((ext_vector_type(4))); 5 6 // CHECK: define void @clang_shufflevector_v_v( 7 void clang_shufflevector_v_v( float4* A, float4 x, uint4 mask ) { 8 // CHECK: [[MASK:%.*]] = and <4 x i32> {{%.*}}, <i32 3, i32 3, i32 3, i32 3> 9 // CHECK: [[I:%.*]] = extractelement <4 x i32> [[MASK]], i32 0 10 // CHECK: [[E:%.*]] = extractelement <4 x float> [[X:%.*]], i32 [[I]] 11 // 12 // Here is where ToT Clang code generation makes a mistake. 13 // It uses [[I]] as the insertion index instead of 0. 14 // Similarly on the remaining insertelement. 15 // CHECK: [[V:%[a-zA-Z0-9._]+]] = insertelement <4 x float> undef, float [[E]], i32 0 16 17 // CHECK: [[I:%.*]] = extractelement <4 x i32> [[MASK]], i32 1 18 // CHECK: [[E:%.*]] = extractelement <4 x float> [[X]], i32 [[I]] 19 // CHECK: [[V2:%.*]] = insertelement <4 x float> [[V]], float [[E]], i32 1 20 // CHECK: [[I:%.*]] = extractelement <4 x i32> [[MASK]], i32 2 21 // CHECK: [[E:%.*]] = extractelement <4 x float> [[X]], i32 [[I]] 22 // CHECK: [[V3:%.*]] = insertelement <4 x float> [[V2]], float [[E]], i32 2 23 // CHECK: [[I:%.*]] = extractelement <4 x i32> [[MASK]], i32 3 24 // CHECK: [[E:%.*]] = extractelement <4 x float> [[X]], i32 [[I]] 25 // CHECK: [[V4:%.*]] = insertelement <4 x float> [[V3]], float [[E]], i32 3 26 // CHECK: store <4 x float> [[V4]], <4 x float>* {{%.*}}, 27 *A = __builtin_shufflevector( x, mask ); 28 } 29 30 // CHECK: define void @clang_shufflevector_v_v_c( 31 void clang_shufflevector_v_v_c( float4* A, float4 x, float4 y, uint4 mask ) { 32 // CHECK: [[V:%.*]] = shufflevector <4 x float> {{%.*}}, <4 x float> {{%.*}}, <4 x i32> <i32 0, i32 4, i32 1, i32 5> 33 // CHECK: store <4 x float> [[V]], <4 x float>* {{%.*}} 34 *A = __builtin_shufflevector( x, y, 0, 4, 1, 5 ); 35 } 36