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
) {
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
) {
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
) {
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
) {
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
) {
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
) {
94 // CHECK-LABEL
: define
{{.
*}} double
@call_sqrt_f64
(
95 // CHECK
: call
{{.
*}} double
@_Z4sqrtd
(double noundef %
{{.
+}}) #{{[0-
9]+$
}}{{$
}}
96 double call_sqrt_f64
(double x
) {
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
) {
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
) {
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
) {
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
) {
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
) {
138 // CHECK-LABEL
: define
{{.
*}} half
@call_sqrt_f16
(
139 // CHECK
: call
{{.
*}} half
@_Z4sqrtDh
(half noundef %
{{.
+}}) #{{[0-
9]+$
}}{{$
}}
140 half call_sqrt_f16
(half 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
) {
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
) {
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
) {
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
) {
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
) {
179 // DEFAULT
: [[FPMATH]] = !{float 3.000000e+00}