https://github.com/tgymnich updated https://github.com/llvm/llvm-project/pull/101989
>From a8a34780fe3311312cb37d48836e63e40bb6f4e0 Mon Sep 17 00:00:00 2001 From: Tim Gymnich <tgymn...@icloud.com> Date: Fri, 2 Aug 2024 21:40:24 +0200 Subject: [PATCH 1/2] [clang][HLSL] Add sign intrinsic part 3 --- clang/include/clang/Basic/Builtins.td | 6 ++ clang/lib/CodeGen/CGBuiltin.cpp | 17 ++++++ clang/lib/CodeGen/CGHLSLRuntime.h | 1 + clang/lib/Headers/hlsl/hlsl_intrinsics.h | 73 +++++++++++++++++++++++- clang/lib/Sema/SemaHLSL.cpp | 17 ++++++ 5 files changed, 113 insertions(+), 1 deletion(-) diff --git a/clang/include/clang/Basic/Builtins.td b/clang/include/clang/Basic/Builtins.td index b025a7681bfac..6f4da6d1ec557 100644 --- a/clang/include/clang/Basic/Builtins.td +++ b/clang/include/clang/Basic/Builtins.td @@ -4737,6 +4737,12 @@ def HLSLRSqrt : LangBuiltin<"HLSL_LANG"> { let Prototype = "void(...)"; } +def HLSLSign : LangBuiltin<"HLSL_LANG"> { + let Spellings = ["__builtin_hlsl_elementwise_sign"]; + let Attributes = [NoThrow, Const]; + let Prototype = "int(...)"; +} + // Builtins for XRay. def XRayCustomEvent : Builtin { let Spellings = ["__xray_customevent"]; diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 51d1162c6e403..41be70612a4e8 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -18662,6 +18662,23 @@ case Builtin::BI__builtin_hlsl_elementwise_isinf: { llvm::FunctionType::get(IntTy, {}, false), "__hlsl_wave_get_lane_index", {}, false, true)); } + case Builtin::BI__builtin_hlsl_elementwise_sign: { + Value *Op0 = EmitScalarExpr(E->getArg(0)); + llvm::Type *Xty = Op0->getType(); + llvm::Type *retType = llvm::Type::getInt32Ty(this->getLLVMContext()); + if (Xty->isVectorTy()) { + auto *XVecTy = E->getArg(0)->getType()->getAs<VectorType>(); + retType = llvm::VectorType::get( + retType, ElementCount::getFixed(XVecTy->getNumElements())); + } + if (!E->getArg(0)->getType()->hasFloatingRepresentation() && + !E->getArg(0)->getType()->hasSignedIntegerRepresentation()) + llvm_unreachable("sign operand must have a float or int representation"); + + return Builder.CreateIntrinsic( + retType, CGM.getHLSLRuntime().getSignIntrinsic(), + ArrayRef<Value *>{Op0}, nullptr, "hlsl.sign"); + } } return nullptr; } diff --git a/clang/lib/CodeGen/CGHLSLRuntime.h b/clang/lib/CodeGen/CGHLSLRuntime.h index 3f2dc0ae7b84d..0aabafc98a5b1 100644 --- a/clang/lib/CodeGen/CGHLSLRuntime.h +++ b/clang/lib/CodeGen/CGHLSLRuntime.h @@ -78,6 +78,7 @@ class CGHLSLRuntime { GENERATE_HLSL_INTRINSIC_FUNCTION(Length, length) GENERATE_HLSL_INTRINSIC_FUNCTION(Lerp, lerp) GENERATE_HLSL_INTRINSIC_FUNCTION(Rsqrt, rsqrt) + GENERATE_HLSL_INTRINSIC_FUNCTION(Sign, sign) GENERATE_HLSL_INTRINSIC_FUNCTION(ThreadId, thread_id) //===----------------------------------------------------------------------===// diff --git a/clang/lib/Headers/hlsl/hlsl_intrinsics.h b/clang/lib/Headers/hlsl/hlsl_intrinsics.h index e35a5262f9280..3d18b74c61917 100644 --- a/clang/lib/Headers/hlsl/hlsl_intrinsics.h +++ b/clang/lib/Headers/hlsl/hlsl_intrinsics.h @@ -916,7 +916,7 @@ float4 lerp(float4, float4, float4); /// \brief Returns the length of the specified floating-point vector. /// \param x [in] The vector of floats, or a scalar float. /// -/// Length is based on the following formula: sqrt(x[0]^2 + x[1]^2 + �). +/// Length is based on the following formula: sqrt(x[0]^2 + x[1]^2 + �). _HLSL_16BIT_AVAILABILITY(shadermodel, 6.2) _HLSL_BUILTIN_ALIAS(__builtin_hlsl_length) @@ -1725,5 +1725,76 @@ _HLSL_AVAILABILITY(shadermodel, 6.0) _HLSL_BUILTIN_ALIAS(__builtin_hlsl_wave_get_lane_index) __attribute__((convergent)) uint WaveGetLaneIndex(); +//===----------------------------------------------------------------------===// +// sign builtins +//===----------------------------------------------------------------------===// + +/// \fn T sign(T Val) +/// \brief Returns -1 if \a Val is less than zero; 0 if \a Val equals zero; and +/// 1 if \a Val is greater than zero. \param Val The input value. + +#ifdef __HLSL_ENABLE_16_BIT +_HLSL_AVAILABILITY(shadermodel, 6.2) +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_sign) +int16_t sign(int16_t); +_HLSL_AVAILABILITY(shadermodel, 6.2) +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_sign) +int16_t2 sign(int16_t2); +_HLSL_AVAILABILITY(shadermodel, 6.2) +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_sign) +int16_t3 sign(int16_t3); +_HLSL_AVAILABILITY(shadermodel, 6.2) +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_sign) +int16_t4 sign(int16_t4); +#endif + +_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2) +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_sign) +half sign(half); +_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2) +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_sign) +half2 sign(half2); +_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2) +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_sign) +half3 sign(half3); +_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2) +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_sign) +half4 sign(half4); + +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_sign) +int sign(int); +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_sign) +int2 sign(int2); +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_sign) +int3 sign(int3); +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_sign) +int4 sign(int4); + +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_sign) +float sign(float); +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_sign) +float2 sign(float2); +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_sign) +float3 sign(float3); +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_sign) +float4 sign(float4); + +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_sign) +int64_t sign(int64_t); +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_sign) +int64_t2 sign(int64_t2); +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_sign) +int64_t3 sign(int64_t3); +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_sign) +int64_t4 sign(int64_t4); + +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_sign) +double sign(double); +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_sign) +double2 sign(double2); +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_sign) +double3 sign(double3); +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_sign) +double4 sign(double4); } // namespace hlsl #endif //_HLSL_HLSL_INTRINSICS_H_ diff --git a/clang/lib/Sema/SemaHLSL.cpp b/clang/lib/Sema/SemaHLSL.cpp index a9c0c57e88221..49d0b0d270e27 100644 --- a/clang/lib/Sema/SemaHLSL.cpp +++ b/clang/lib/Sema/SemaHLSL.cpp @@ -12,6 +12,7 @@ #include "clang/AST/Decl.h" #include "clang/AST/Expr.h" #include "clang/AST/RecursiveASTVisitor.h" +#include "clang/Basic/Builtins.h" #include "clang/Basic/DiagnosticSema.h" #include "clang/Basic/LLVM.h" #include "clang/Basic/TargetInfo.h" @@ -995,6 +996,14 @@ bool CheckNoDoubleVectors(Sema *S, CallExpr *TheCall) { return CheckArgsTypesAreCorrect(S, TheCall, S->Context.FloatTy, checkDoubleVector); } +bool CheckFloatingOrSignedIntRepresentation(Sema *S, CallExpr *TheCall) { + auto checkAllSignedTypes = [](clang::QualType PassedType) -> bool { + return !PassedType->hasSignedIntegerRepresentation() && + !PassedType->hasFloatingRepresentation(); + }; + return CheckArgsTypesAreCorrect(S, TheCall, S->Context.IntTy, + checkAllSignedTypes); +} bool CheckUnsignedIntRepresentation(Sema *S, CallExpr *TheCall) { auto checkAllUnsignedTypes = [](clang::QualType PassedType) -> bool { @@ -1108,6 +1117,14 @@ bool SemaHLSL::CheckBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) { return true; break; } + case Builtin::BI__builtin_hlsl_elementwise_sign: { + if (CheckFloatingOrSignedIntRepresentation(&SemaRef, TheCall)) + return true; + if (SemaRef.PrepareBuiltinElementwiseMathOneArgCall(TheCall)) + return true; + SetElementTypeAsReturnType(&SemaRef, TheCall, getASTContext().IntTy); + break; + } // Note these are llvm builtins that we want to catch invalid intrinsic // generation. Normal handling of these builitns will occur elsewhere. case Builtin::BI__builtin_elementwise_bitreverse: { >From 46723d8777ed39998a6c5047d0e457cc8a45d7ec Mon Sep 17 00:00:00 2001 From: Tim Gymnich <tgymn...@icloud.com> Date: Fri, 2 Aug 2024 21:40:32 +0200 Subject: [PATCH 2/2] add tests --- clang/test/CodeGenHLSL/builtins/sign.hlsl | 209 ++++++++++++++++++++++ 1 file changed, 209 insertions(+) create mode 100644 clang/test/CodeGenHLSL/builtins/sign.hlsl diff --git a/clang/test/CodeGenHLSL/builtins/sign.hlsl b/clang/test/CodeGenHLSL/builtins/sign.hlsl new file mode 100644 index 0000000000000..61596764231ec --- /dev/null +++ b/clang/test/CodeGenHLSL/builtins/sign.hlsl @@ -0,0 +1,209 @@ +// RUN: %clang_cc1 -finclude-default-header -x hlsl -triple \ +// RUN: dxil-pc-shadermodel6.3-library %s -fnative-half-type \ +// RUN: -emit-llvm -disable-llvm-passes -o - | FileCheck %s \ +// RUN: --check-prefixes=CHECK,DXIL_CHECK,DXIL_NATIVE_HALF,NATIVE_HALF +// RUN: %clang_cc1 -finclude-default-header -x hlsl -triple \ +// RUN: dxil-pc-shadermodel6.3-library %s -emit-llvm -disable-llvm-passes \ +// RUN: -o - | FileCheck %s --check-prefixes=CHECK,DXIL_CHECK,NO_HALF,DXIL_NO_HALF +// RUN: %clang_cc1 -finclude-default-header -x hlsl -triple \ +// RUN: spirv-unknown-vulkan-compute %s -fnative-half-type \ +// RUN: -emit-llvm -disable-llvm-passes -o - | FileCheck %s \ +// RUN: --check-prefixes=CHECK,SPIR_CHECK,NATIVE_HALF,SPIR_NATIVE_HALF +// RUN: %clang_cc1 -finclude-default-header -x hlsl -triple \ +// RUN: spirv-unknown-vulkan-compute %s -emit-llvm -disable-llvm-passes \ +// RUN: -o - | FileCheck %s --check-prefixes=CHECK,SPIR_CHECK,NO_HALF,SPIR_NO_HALF + +// DXIL_NATIVE_HALF: define noundef i32 @ +// SPIR_NATIVE_HALF: define spir_func noundef i32 @ +// DXIL_NATIVE_HALF: %hlsl.sign = call i32 @llvm.dx.sign.f16( +// SPIR_NATIVE_HALF: %hlsl.sign = call i32 @llvm.spv.sign.f16( +// NATIVE_HALF: ret i32 %hlsl.sign +// DXIL_NO_HALF: define noundef i32 @ +// SPIR_NO_HALF: define spir_func noundef i32 @ +// DXIL_NO_HALF: %hlsl.sign = call i32 @llvm.dx.sign.f32( +// SPIR_NO_HALF: %hlsl.sign = call i32 @llvm.spv.sign.f32( +// NO_HALF: ret i32 %hlsl.sign +int test_sign_half(half p0) { return sign(p0); } + +// DXIL_NATIVE_HALF: define noundef <2 x i32> @ +// SPIR_NATIVE_HALF: define spir_func noundef <2 x i32> @ +// DXIL_NATIVE_HALF: %hlsl.sign = call <2 x i32> @llvm.dx.sign.v2f16( +// SPIR_NATIVE_HALF: %hlsl.sign = call <2 x i32> @llvm.spv.sign.v2f16( +// NATIVE_HALF: ret <2 x i32> %hlsl.sign +// DXIL_NO_HALF: define noundef <2 x i32> @ +// SPIR_NO_HALF: define spir_func noundef <2 x i32> @ +// DXIL_NO_HALF: %hlsl.sign = call <2 x i32> @llvm.dx.sign.v2f32( +// SPIR_NO_HALF: %hlsl.sign = call <2 x i32> @llvm.spv.sign.v2f32( +// NO_HALF: ret <2 x i32> %hlsl.sign +int2 test_sign_half2(half2 p0) { return sign(p0); } + +// DXIL_NATIVE_HALF: define noundef <3 x i32> @ +// SPIR_NATIVE_HALF: define spir_func noundef <3 x i32> @ +// DXIL_NATIVE_HALF: %hlsl.sign = call <3 x i32> @llvm.dx.sign.v3f16( +// SPIR_NATIVE_HALF: %hlsl.sign = call <3 x i32> @llvm.spv.sign.v3f16( +// NATIVE_HALF: ret <3 x i32> %hlsl.sign +// DXIL_NO_HALF: define noundef <3 x i32> @ +// SPIR_NO_HALF: define spir_func noundef <3 x i32> @ +// DXIL_NO_HALF: %hlsl.sign = call <3 x i32> @llvm.dx.sign.v3f32( +// SPIR_NO_HALF: %hlsl.sign = call <3 x i32> @llvm.spv.sign.v3f32( +// NO_HALF: ret <3 x i32> %hlsl.sign +int3 test_sign_half3(half3 p0) { return sign(p0); } + +// DXIL_NATIVE_HALF: define noundef <4 x i32> @ +// SPIR_NATIVE_HALF: define spir_func noundef <4 x i32> @ +// DXIL_NATIVE_HALF: %hlsl.sign = call <4 x i32> @llvm.dx.sign.v4f16( +// SPIR_NATIVE_HALF: %hlsl.sign = call <4 x i32> @llvm.spv.sign.v4f16( +// NATIVE_HALF: ret <4 x i32> %hlsl.sign +// DXIL_NO_HALF: define noundef <4 x i32> @ +// SPIR_NO_HALF: define spir_func noundef <4 x i32> @ +// DXIL_NO_HALF: %hlsl.sign = call <4 x i32> @llvm.dx.sign.v4f32( +// SPIR_NO_HALF: %hlsl.sign = call <4 x i32> @llvm.spv.sign.v4f32( +// NO_HALF: ret <4 x i32> %hlsl.sign +int4 test_sign_half4(half4 p0) { return sign(p0); } + + +// DXIL_CHECK: define noundef i32 @ +// SPIR_CHECK: define spir_func noundef i32 @ +// DXIL_CHECK: %hlsl.sign = call i32 @llvm.dx.sign.f32( +// SPIR_CHECK: %hlsl.sign = call i32 @llvm.spv.sign.f32( +// CHECK: ret i32 %hlsl.sign +int test_sign_float(float p0) { return sign(p0); } + +// DXIL_CHECK: define noundef <2 x i32> @ +// SPIR_CHECK: define spir_func noundef <2 x i32> @ +// DXIL_CHECK: %hlsl.sign = call <2 x i32> @llvm.dx.sign.v2f32( +// SPIR_CHECK: %hlsl.sign = call <2 x i32> @llvm.spv.sign.v2f32( +// CHECK: ret <2 x i32> %hlsl.sign +int2 test_sign_float2(float2 p0) { return sign(p0); } + +// DXIL_CHECK: define noundef <3 x i32> @ +// SPIR_CHECK: define spir_func noundef <3 x i32> @ +// DXIL_CHECK: %hlsl.sign = call <3 x i32> @llvm.dx.sign.v3f32( +// SPIR_CHECK: %hlsl.sign = call <3 x i32> @llvm.spv.sign.v3f32( +// CHECK: ret <3 x i32> %hlsl.sign +int3 test_sign_float3(float3 p0) { return sign(p0); } + +// DXIL_CHECK: define noundef <4 x i32> @ +// SPIR_CHECK: define spir_func noundef <4 x i32> @ +// DXIL_CHECK: %hlsl.sign = call <4 x i32> @llvm.dx.sign.v4f32( +// SPIR_CHECK: %hlsl.sign = call <4 x i32> @llvm.spv.sign.v4f32( +// CHECK: ret <4 x i32> %hlsl.sign +int4 test_sign_float4(float4 p0) { return sign(p0); } + + +// DXIL_CHECK: define noundef i32 @ +// SPIR_CHECK: define spir_func noundef i32 @ +// DXIL_CHECK: %hlsl.sign = call i32 @llvm.dx.sign.f64( +// SPIR_CHECK: %hlsl.sign = call i32 @llvm.spv.sign.f64( +// CHECK: ret i32 %hlsl.sign +int test_sign_double(double p0) { return sign(p0); } + +// DXIL_CHECK: define noundef <2 x i32> @ +// SPIR_CHECK: define spir_func noundef <2 x i32> @ +// DXIL_CHECK: %hlsl.sign = call <2 x i32> @llvm.dx.sign.v2f64( +// SPIR_CHECK: %hlsl.sign = call <2 x i32> @llvm.spv.sign.v2f64( +// CHECK: ret <2 x i32> %hlsl.sign +int2 test_sign_double2(double2 p0) { return sign(p0); } + +// DXIL_CHECK: define noundef <3 x i32> @ +// SPIR_CHECK: define spir_func noundef <3 x i32> @ +// DXIL_CHECK: %hlsl.sign = call <3 x i32> @llvm.dx.sign.v3f64( +// SPIR_CHECK: %hlsl.sign = call <3 x i32> @llvm.spv.sign.v3f64( +// CHECK: ret <3 x i32> %hlsl.sign +int3 test_sign_double3(double3 p0) { return sign(p0); } + +// DXIL_CHECK: define noundef <4 x i32> @ +// SPIR_CHECK: define spir_func noundef <4 x i32> @ +// DXIL_CHECK: %hlsl.sign = call <4 x i32> @llvm.dx.sign.v4f64( +// SPIR_CHECK: %hlsl.sign = call <4 x i32> @llvm.spv.sign.v4f64( +// CHECK: ret <4 x i32> %hlsl.sign +int4 test_sign_double4(double4 p0) { return sign(p0); } + + +#ifdef __HLSL_ENABLE_16_BIT +// DXIL_NATIVE_HALF: define noundef i32 @ +// SPIR_NATIVE_HALF: define spir_func noundef i32 @ +// DXIL_NATIVE_HALF: %hlsl.sign = call i32 @llvm.dx.sign.i16( +// SPIR_NATIVE_HALF: %hlsl.sign = call i32 @llvm.spv.sign.i16( +// NATIVE_HALF: ret i32 %hlsl.sign +int test_sign_int16_t(int16_t p0) { return sign(p0); } + +// DXIL_NATIVE_HALF: define noundef <2 x i32> @ +// SPIR_NATIVE_HALF: define spir_func noundef <2 x i32> @ +// DXIL_NATIVE_HALF: %hlsl.sign = call <2 x i32> @llvm.dx.sign.v2i16( +// SPIR_NATIVE_HALF: %hlsl.sign = call <2 x i32> @llvm.spv.sign.v2i16( +// NATIVE_HALF: ret <2 x i32> %hlsl.sign +int2 test_sign_int16_t2(int16_t2 p0) { return sign(p0); } + +// DXIL_NATIVE_HALF: define noundef <3 x i32> @ +// SPIR_NATIVE_HALF: define spir_func noundef <3 x i32> @ +// DXIL_NATIVE_HALF: %hlsl.sign = call <3 x i32> @llvm.dx.sign.v3i16( +// SPIR_NATIVE_HALF: %hlsl.sign = call <3 x i32> @llvm.spv.sign.v3i16( +// NATIVE_HALF: ret <3 x i32> %hlsl.sign +int3 test_sign_int16_t3(int16_t3 p0) { return sign(p0); } + +// DXIL_NATIVE_HALF: define noundef <4 x i32> @ +// SPIR_NATIVE_HALF: define spir_func noundef <4 x i32> @ +// DXIL_NATIVE_HALF: %hlsl.sign = call <4 x i32> @llvm.dx.sign.v4i16( +// SPIR_NATIVE_HALF: %hlsl.sign = call <4 x i32> @llvm.spv.sign.v4i16( +// NATIVE_HALF: ret <4 x i32> %hlsl.sign +int4 test_sign_int16_t4(int16_t4 p0) { return sign(p0); } +#endif // __HLSL_ENABLE_16_BIT + + +// DXIL_CHECK: define noundef i32 @ +// SPIR_CHECK: define spir_func noundef i32 @ +// DXIL_CHECK: %hlsl.sign = call i32 @llvm.dx.sign.i32( +// SPIR_CHECK: %hlsl.sign = call i32 @llvm.spv.sign.i32( +// CHECK: ret i32 %hlsl.sign +int test_sign_int(int p0) { return sign(p0); } + +// DXIL_CHECK: define noundef <2 x i32> @ +// SPIR_CHECK: define spir_func noundef <2 x i32> @ +// DXIL_CHECK: %hlsl.sign = call <2 x i32> @llvm.dx.sign.v2i32( +// SPIR_CHECK: %hlsl.sign = call <2 x i32> @llvm.spv.sign.v2i32( +// CHECK: ret <2 x i32> %hlsl.sign +int2 test_sign_int2(int2 p0) { return sign(p0); } + +// DXIL_CHECK: define noundef <3 x i32> @ +// SPIR_CHECK: define spir_func noundef <3 x i32> @ +// DXIL_CHECK: %hlsl.sign = call <3 x i32> @llvm.dx.sign.v3i32( +// SPIR_CHECK: %hlsl.sign = call <3 x i32> @llvm.spv.sign.v3i32( +// CHECK: ret <3 x i32> %hlsl.sign +int3 test_sign_int3(int3 p0) { return sign(p0); } + +// DXIL_CHECK: define noundef <4 x i32> @ +// SPIR_CHECK: define spir_func noundef <4 x i32> @ +// DXIL_CHECK: %hlsl.sign = call <4 x i32> @llvm.dx.sign.v4i32( +// SPIR_CHECK: %hlsl.sign = call <4 x i32> @llvm.spv.sign.v4i32( +// CHECK: ret <4 x i32> %hlsl.sign +int4 test_sign_int4(int4 p0) { return sign(p0); } + + +// DXIL_CHECK: define noundef i32 @ +// SPIR_CHECK: define spir_func noundef i32 @ +// DXIL_CHECK: %hlsl.sign = call i32 @llvm.dx.sign.i64( +// SPIR_CHECK: %hlsl.sign = call i32 @llvm.spv.sign.i64( +// CHECK: ret i32 %hlsl.sign +int test_sign_int64_t(int64_t p0) { return sign(p0); } + +// DXIL_CHECK: define noundef <2 x i32> @ +// SPIR_CHECK: define spir_func noundef <2 x i32> @ +// DXIL_CHECK: %hlsl.sign = call <2 x i32> @llvm.dx.sign.v2i64( +// SPIR_CHECK: %hlsl.sign = call <2 x i32> @llvm.spv.sign.v2i64( +// CHECK: ret <2 x i32> %hlsl.sign +int2 test_sign_int64_t2(int64_t2 p0) { return sign(p0); } + +// DXIL_CHECK: define noundef <3 x i32> @ +// SPIR_CHECK: define spir_func noundef <3 x i32> @ +// DXIL_CHECK: %hlsl.sign = call <3 x i32> @llvm.dx.sign.v3i64( +// SPIR_CHECK: %hlsl.sign = call <3 x i32> @llvm.spv.sign.v3i64( +// CHECK: ret <3 x i32> %hlsl.sign +int3 test_sign_int64_t3(int64_t3 p0) { return sign(p0); } + +// DXIL_CHECK: define noundef <4 x i32> @ +// SPIR_CHECK: define spir_func noundef <4 x i32> @ +// DXIL_CHECK: %hlsl.sign = call <4 x i32> @llvm.dx.sign.v4i64( +// SPIR_CHECK: %hlsl.sign = call <4 x i32> @llvm.spv.sign.v4i64( +// CHECK: ret <4 x i32> %hlsl.sign +int4 test_sign_int64_t4(int64_t4 p0) { return sign(p0); } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits