llvm-project/clang/test/CodeGenCXX/vector-splat-conversion.cpp
Paul Walker eae26b6640 [IRBuilder] Use canonical i64 type for insertelement index used by vector splats.
Instcombine prefers this canonical form (see getPreferredVectorIndex),
as does IRBuilder when passing the index as an integer so we may as
well use the prefered form from creation.

NOTE: All test changes are mechanical with nothing else expected
beyond a change of index type from i32 to i64.

Differential Revision: https://reviews.llvm.org/D140983
2023-01-11 14:08:06 +00:00

63 lines
2.6 KiB
C++

// RUN: %clang_cc1 %s -triple arm64-apple-ios8.1.0 -std=c++11 -emit-llvm -o - | FileCheck %s
typedef __attribute__((__ext_vector_type__(8))) float vector_float8;
typedef vector_float8 float8;
// rdar://20000762
// CHECK-LABEL: define{{.*}} void @_Z23MandelbrotPolyCalcSIMD8v
void MandelbrotPolyCalcSIMD8() {
constexpr float8 v4 = 4.0; // value to compare against abs(z)^2, to see if bounded
float8 vABS;
auto vLT = vABS < v4;
// CHECK: store <8 x float>
// CHECK: [[ZERO:%.*]] = load <8 x float>, ptr [[VARBS:%.*]]
// CHECK: [[CMP:%.*]] = fcmp olt <8 x float> [[ZERO]]
// CHECK: [[SEXT:%.*]] = sext <8 x i1> [[CMP]] to <8 x i32>
// CHECK: store <8 x i32> [[SEXT]], ptr [[VLT:%.*]]
}
typedef __attribute__((__ext_vector_type__(4))) int int4;
typedef __attribute__((__ext_vector_type__(4))) float float4;
typedef __attribute__((__ext_vector_type__(4))) __int128 bigint4;
// CHECK-LABEL: define{{.*}} void @_Z14BoolConversionv
void BoolConversion() {
// CHECK: store <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>
int4 intsT = (int4)true;
// CHECK: store <4 x i32> zeroinitializer
int4 intsF = (int4)false;
// CHECK: store <4 x float> <float -1.000000e+00, float -1.000000e+00, float -1.000000e+00, float -1.000000e+00>
float4 floatsT = (float4)true;
// CHECK: store <4 x float> zeroinitializer
float4 floatsF = (float4)false;
// CHECK: store <4 x i128> <i128 -1, i128 -1, i128 -1, i128 -1>
bigint4 bigintsT = (bigint4)true;
// CHECK: store <4 x i128> zeroinitializer
bigint4 bigintsF = (bigint4)false;
// CHECK: store <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>
constexpr int4 cIntsT = (int4)true;
// CHECK: store <4 x i32> zeroinitializer
constexpr int4 cIntsF = (int4)false;
// CHECK: store <4 x float> <float -1.000000e+00, float -1.000000e+00, float -1.000000e+00, float -1.000000e+00>
constexpr float4 cFloatsT = (float4)true;
// CHECK: store <4 x float> zeroinitializer
constexpr float4 cFloatsF = (float4)false;
// CHECK: store <4 x i128> <i128 -1, i128 -1, i128 -1, i128 -1>
constexpr bigint4 cBigintsT = (bigint4)true;
// CHECK: store <4 x i128> zeroinitializer
constexpr bigint4 cBigintsF = (bigint4)false;
}
typedef __attribute__((vector_size(8))) int gcc_int_2;
gcc_int_2 FloatToIntConversion(gcc_int_2 Int2, float f) {
return Int2 + f;
// CHECK: %[[LOAD_INT:.+]] = load <2 x i32>
// CHECK: %[[LOAD:.+]] = load float, ptr
// CHECK: %[[CONV:.+]] = fptosi float %[[LOAD]] to i32
// CHECK: %[[INSERT:.+]] = insertelement <2 x i32> poison, i32 %[[CONV]], i64 0
// CHECK: %[[SPLAT:.+]] = shufflevector <2 x i32> %[[INSERT]], <2 x i32> poison, <2 x i32> zeroinitializer
// CHECK: add <2 x i32> %[[LOAD_INT]], %[[SPLAT]]
}