[libc] Switch to using the generic `<gpuintrin.h>` implementations (#121810)
[llvm-project.git] / clang / test / CodeGenOpenCL / sqrt-fpmath.cl
blobd0637283a7ec1305e09ffa9abd12ddb5a5c4c27a
1 // Test that float variants of sqrt are emitted as available_externally inline
2 // definitions that call the sqrt intrinsic with appropriate !fpmath metadata
3 // depending on -cl-fp32-correctly-rounded-divide-sqrt
5 // Test with -fdeclare-opencl-builtins
6 // RUN: %clang_cc1 -disable-llvm-passes -triple amdgcn-unknown-unknown -fdeclare-opencl-builtins -finclude-default-header -emit-llvm -o %t.ll %s
7 // RUN: FileCheck -check-prefixes=CHECK,DEFAULT %s < %t.ll
8 // RUN: %clang_cc1 -disable-llvm-passes -triple amdgcn-unknown-unknown -fdeclare-opencl-builtins -finclude-default-header -cl-fp32-correctly-rounded-divide-sqrt -emit-llvm -o %t.ll %s
9 // RUN: FileCheck -check-prefixes=CHECK,CORRECTLYROUNDED %s < %t.ll
11 // RUN: %clang_cc1 -disable-llvm-passes -triple amdgcn-unknown-unknown -fdeclare-opencl-builtins -finclude-default-header -cl-unsafe-math-optimizations -emit-llvm -o %t.ll %s
12 // RUN: FileCheck -check-prefixes=CHECK,DEFAULT-UNSAFE %s < %t.ll
13 // RUN: %clang_cc1 -disable-llvm-passes -triple amdgcn-unknown-unknown -fdeclare-opencl-builtins -finclude-default-header -cl-fp32-correctly-rounded-divide-sqrt -cl-unsafe-math-optimizations -emit-llvm -o %t.ll %s
14 // RUN: FileCheck -check-prefixes=CHECK,CORRECTLYROUNDED-UNSAFE %s < %t.ll
16 // Test without -fdeclare-opencl-builtins
17 // RUN: %clang_cc1 -disable-llvm-passes -triple amdgcn-unknown-unknown -finclude-default-header -emit-llvm -o - %s | FileCheck -check-prefixes=CHECK,DEFAULT %s
18 // RUN: %clang_cc1 -disable-llvm-passes -triple amdgcn-unknown-unknown -finclude-default-header -cl-fp32-correctly-rounded-divide-sqrt -emit-llvm -o - %s | FileCheck -check-prefixes=CHECK,CORRECTLYROUNDED %s
20 // RUN: %clang_cc1 -disable-llvm-passes -triple amdgcn-unknown-unknown -finclude-default-header -cl-unsafe-math-optimizations -emit-llvm -o - %s | FileCheck -check-prefixes=CHECK,DEFAULT-UNSAFE %s
21 // RUN: %clang_cc1 -disable-llvm-passes -triple amdgcn-unknown-unknown -finclude-default-header -cl-fp32-correctly-rounded-divide-sqrt -cl-unsafe-math-optimizations -emit-llvm -o - %s | FileCheck -check-prefixes=CHECK,CORRECTLYROUNDED-UNSAFE %s
23 #pragma OPENCL EXTENSION cl_khr_fp16 : enable
25 // CHECK-LABEL: define {{.*}} float @call_sqrt_f32(
26 // DEFAULT: call float @_Z4sqrtf(float noundef %{{.+}}) #{{[0-9]+}}, !fpmath [[FPMATH:\![0-9]+]]{{$}}
27 // CORRECTLYROUNDED: call float @_Z4sqrtf(float noundef %{{.+}}) #{{[0-9]+}}{{$}}
29 // DEFAULT-UNSAFE: call reassoc nsz arcp contract afn float @_Z4sqrtf(float noundef %{{.+}}) #{{[0-9]+}}, !fpmath [[FPMATH:\![0-9]+]]{{$}}
30 // CORRECTLYROUNDED-UNSAFE: call reassoc nsz arcp contract afn float @_Z4sqrtf(float noundef %{{.+}}) #{{[0-9]+}}{{$}}
31 float call_sqrt_f32(float x) {
32 return sqrt(x);
35 // CHECK-LABEL: define {{.*}} <2 x float> @call_sqrt_v2f32(
36 // DEFAULT: call <2 x float> @_Z4sqrtDv2_f(<2 x float> noundef %{{.+}}) #{{[0-9]+}}, !fpmath [[FPMATH]]{{$}}
37 // CORRECTLYROUNDED: call <2 x float> @_Z4sqrtDv2_f(<2 x float> noundef %{{.+}}) #{{[0-9]+}}{{$}}
39 // DEFAULT-UNSAFE: call reassoc nsz arcp contract afn <2 x float> @_Z4sqrtDv2_f(<2 x float> noundef %{{.+}}) #{{[0-9]+}}, !fpmath [[FPMATH]]{{$}}
40 // CORRECTLY-UNSAFE: call reassoc nsz arcp contract afn <2 x float> @_Z4sqrtDv2_f(<2 x float> noundef %{{.+}}) #{{[0-9]+}}{{$}}
41 float2 call_sqrt_v2f32(float2 x) {
42 return sqrt(x);
46 // CHECK-LABEL: define {{.*}} <3 x float> @call_sqrt_v3f32(
47 // DEFAULT: call <3 x float> @_Z4sqrtDv3_f(<3 x float> noundef %{{.+}}) #{{[0-9]+}}, !fpmath [[FPMATH]]{{$}}
48 // CORRECTLYROUNDED: call <3 x float> @_Z4sqrtDv3_f(<3 x float> noundef %{{.+}}) #{{[0-9]+}}{{$}}
50 // DEFAULT-UNSAFE: call reassoc nsz arcp contract afn <3 x float> @_Z4sqrtDv3_f(<3 x float> noundef %{{.+}}) #{{[0-9]+}}, !fpmath [[FPMATH]]{{$}}
51 // CORRECTLY-UNSAFE: call reassoc nsz arcp contract afn <3 x float> @_Z4sqrtDv3_f(<3 x float> noundef %{{.+}}) #{{[0-9]+}}{{$}}
52 float3 call_sqrt_v3f32(float3 x) {
53 return sqrt(x);
58 // CHECK-LABEL: define {{.*}} <4 x float> @call_sqrt_v4f32(
59 // DEFAULT: call <4 x float> @_Z4sqrtDv4_f(<4 x float> noundef %{{.+}}) #{{[0-9]+}}, !fpmath [[FPMATH]]{{$}}
60 // CORRECTLYROUNDED: call <4 x float> @_Z4sqrtDv4_f(<4 x float> noundef %{{.+}}) #{{[0-9]+}}{{$}}
62 // DEFAULT-UNSAFE: call reassoc nsz arcp contract afn <4 x float> @_Z4sqrtDv4_f(<4 x float> noundef %{{.+}}) #{{[0-9]+}}, !fpmath [[FPMATH]]{{$}}
63 // CORRECTLY-UNSAFE: call reassoc nsz arcp contract afn <4 x float> @_Z4sqrtDv4_f(<4 x float> noundef %{{.+}}) #{{[0-9]+}}{{$}}
64 float4 call_sqrt_v4f32(float4 x) {
65 return sqrt(x);
69 // CHECK-LABEL: define {{.*}} <8 x float> @call_sqrt_v8f32(
70 // DEFAULT: call <8 x float> @_Z4sqrtDv8_f(<8 x float> noundef %{{.+}}) #{{[0-9]+}}, !fpmath [[FPMATH]]{{$}}
71 // CORRECTLYROUNDED: call <8 x float> @_Z4sqrtDv8_f(<8 x float> noundef %{{.+}}) #{{[0-9]+}}{{$}}
73 // DEFAULT-UNSAFE: call reassoc nsz arcp contract afn <8 x float> @_Z4sqrtDv8_f(<8 x float> noundef %{{.+}}) #{{[0-9]+}}, !fpmath [[FPMATH]]{{$}}
74 // CORRECTLYROUNDED-UNSAFE: call reassoc nsz arcp contract afn <8 x float> @_Z4sqrtDv8_f(<8 x float> noundef %{{.+}}) #{{[0-9]+}}{{$}}
75 float8 call_sqrt_v8f32(float8 x) {
76 return sqrt(x);
81 // CHECK-LABEL: define {{.*}} <16 x float> @call_sqrt_v16f32(
82 // DEFAULT: call <16 x float> @_Z4sqrtDv16_f(<16 x float> noundef %{{.+}}) #{{[0-9]+}}, !fpmath [[FPMATH]]{{$}}
83 // CORRECTLYROUNDED: call <16 x float> @_Z4sqrtDv16_f(<16 x float> noundef %{{.+}}) #{{[0-9]+}}{{$}}
85 // DEFAULT-UNSAFE: call reassoc nsz arcp contract afn <16 x float> @_Z4sqrtDv16_f(<16 x float> noundef %{{.+}}) #{{[0-9]+}}, !fpmath [[FPMATH]]{{$}}
86 // CORRECTLY-UNSAFE: call reassoc nsz arcp contract afn <16 x float> @_Z4sqrtDv16_f(<16 x float> noundef %{{.+}}) #{{[0-9]+}}{{$}}
87 float16 call_sqrt_v16f32(float16 x) {
88 return sqrt(x);
93 // Not for f64
94 // CHECK-LABEL: define {{.*}} double @call_sqrt_f64(
95 // CHECK: call {{.*}} double @_Z4sqrtd(double noundef %{{.+}}) #{{[0-9]+$}}{{$}}
96 double call_sqrt_f64(double x) {
97 return sqrt(x);
101 // Not for f64
102 // CHECK-LABEL: define {{.*}} <2 x double> @call_sqrt_v2f64(
103 // CHECK: call {{.*}} <2 x double> @_Z4sqrtDv2_d(<2 x double> noundef %{{.+}}) #{{[0-9]+$}}{{$}}
104 double2 call_sqrt_v2f64(double2 x) {
105 return sqrt(x);
109 // CHECK-LABEL: define {{.*}} <3 x double> @call_sqrt_v3f64(
110 // CHECK: call {{.*}} <3 x double> @_Z4sqrtDv3_d(<3 x double> noundef %{{.+}}) #{{[0-9]+$}}{{$}}
111 double3 call_sqrt_v3f64(double3 x) {
112 return sqrt(x);
116 // CHECK-LABEL: define {{.*}} <4 x double> @call_sqrt_v4f64(
117 // CHECK: call {{.*}} <4 x double> @_Z4sqrtDv4_d(<4 x double> noundef %{{.+}}) #{{[0-9]+$}}{{$}}
118 double4 call_sqrt_v4f64(double4 x) {
119 return sqrt(x);
123 // CHECK-LABEL: define {{.*}} <8 x double> @call_sqrt_v8f64(
124 // CHECK: call {{.*}} <8 x double> @_Z4sqrtDv8_d(<8 x double> noundef %{{.+}}) #{{[0-9]+$}}{{$}}
125 double8 call_sqrt_v8f64(double8 x) {
126 return sqrt(x);
130 // CHECK-LABEL: define {{.*}} <16 x double> @call_sqrt_v16f64(
131 // CHECK: call {{.*}} <16 x double> @_Z4sqrtDv16_d(<16 x double> noundef %{{.+}}) #{{[0-9]+$}}{{$}}
132 double16 call_sqrt_v16f64(double16 x) {
133 return sqrt(x);
137 // Not for f16
138 // CHECK-LABEL: define {{.*}} half @call_sqrt_f16(
139 // CHECK: call {{.*}} half @_Z4sqrtDh(half noundef %{{.+}}) #{{[0-9]+$}}{{$}}
140 half call_sqrt_f16(half x) {
141 return sqrt(x);
145 // CHECK-LABEL: define {{.*}} <2 x half> @call_sqrt_v2f16(
146 // CHECK: call {{.*}} <2 x half> @_Z4sqrtDv2_Dh(<2 x half> noundef %{{.+}}) #{{[0-9]+$}}{{$}}
147 half2 call_sqrt_v2f16(half2 x) {
148 return sqrt(x);
152 // CHECK-LABEL: define {{.*}} <3 x half> @call_sqrt_v3f16(
153 // CHECK: call {{.*}} <3 x half> @_Z4sqrtDv3_Dh(<3 x half> noundef %{{.+}}) #{{[0-9]+$}}{{$}}
154 half3 call_sqrt_v3f16(half3 x) {
155 return sqrt(x);
159 // CHECK-LABEL: define {{.*}} <4 x half> @call_sqrt_v4f16(
160 // CHECK: call {{.*}} <4 x half> @_Z4sqrtDv4_Dh(<4 x half> noundef %{{.+}}) #{{[0-9]+$}}{{$}}
161 half4 call_sqrt_v4f16(half4 x) {
162 return sqrt(x);
166 // CHECK-LABEL: define {{.*}} <8 x half> @call_sqrt_v8f16(
167 // CHECK: call {{.*}} <8 x half> @_Z4sqrtDv8_Dh(<8 x half> noundef %{{.+}}) #{{[0-9]+$}}{{$}}
168 half8 call_sqrt_v8f16(half8 x) {
169 return sqrt(x);
173 // CHECK-LABEL: define {{.*}} <16 x half> @call_sqrt_v16f16(
174 // CHECK: call {{.*}} <16 x half> @_Z4sqrtDv16_Dh(<16 x half> noundef %{{.+}}) #{{[0-9]+$}}{{$}}
175 half16 call_sqrt_v16f16(half16 x) {
176 return sqrt(x);
179 // DEFAULT: [[FPMATH]] = !{float 3.000000e+00}