| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 |
| ; RUN: opt -S -mtriple=amdgpu-amd-amdhsa -passes=amdgpu-simplifylib %s | FileCheck %s |
| |
| ; Constant folding of fast-math library calls (evaluateCall). |
| |
| declare float @_Z3sinf(float) |
| declare <2 x float> @_Z3cosDv2_f(<2 x float>) |
| declare <2 x float> @_Z3powDv2_fS_(<2 x float>, <2 x float>) |
| declare <2 x float> @_Z4fminDv2_ff(<2 x float>, float) |
| declare <2 x float> @_Z4fminDv2_fS_(float, <2 x float>) |
| declare <2 x float> @_Z6sincosDv2_fPU3AS5S_(<2 x float>, ptr addrspace(5)) |
| |
| define <2 x float> @fold_cos_v2f32() { |
| ; CHECK-LABEL: define <2 x float> @fold_cos_v2f32() { |
| ; CHECK-NEXT: ret <2 x float> <float f0xBF7D7026, float f0xBF275530> |
| ; |
| %r = call fast <2 x float> @_Z3cosDv2_f(<2 x float> <float 3.0, float 4.0>) |
| ret <2 x float> %r |
| } |
| |
| define <2 x float> @fold_cos_v2f32_zeroinit() { |
| ; CHECK-LABEL: define <2 x float> @fold_cos_v2f32_zeroinit() { |
| ; CHECK-NEXT: ret <2 x float> splat (float 1.000000e+00) |
| ; |
| %r = call fast <2 x float> @_Z3cosDv2_f(<2 x float> zeroinitializer) |
| ret <2 x float> %r |
| } |
| |
| ; A poison lane must not turn the defined lanes into an evaluation at 0.0; |
| ; cos(3.0) is about -0.99, not cos(0.0) == 1.0. |
| define <2 x float> @no_fold_cos_v2f32_poison_lane() { |
| ; CHECK-LABEL: define <2 x float> @no_fold_cos_v2f32_poison_lane() { |
| ; CHECK-NEXT: [[R:%.*]] = call fast <2 x float> @_Z3cosDv2_f(<2 x float> <float 3.000000e+00, float poison>) |
| ; CHECK-NEXT: ret <2 x float> [[R]] |
| ; |
| %r = call fast <2 x float> @_Z3cosDv2_f(<2 x float> <float 3.0, float poison>) |
| ret <2 x float> %r |
| } |
| |
| ; Likewise for the second operand: a poison exponent lane must not be |
| ; evaluated as pow(x, 0.0) == 1.0. (The defined lanes are still folded, by the |
| ; pow(x, 2) => x*x expansion.) |
| define <2 x float> @pow_v2f32_poison_exp_lane() { |
| ; CHECK-LABEL: define <2 x float> @pow_v2f32_poison_exp_lane() { |
| ; CHECK-NEXT: ret <2 x float> <float 9.000000e+00, float 1.600000e+01> |
| ; |
| %r = call fast <2 x float> @_Z3powDv2_fS_(<2 x float> <float 3.0, float 4.0>, <2 x float> <float 2.0, float poison>) |
| ret <2 x float> %r |
| } |
| |
| define float @no_fold_sin_f32_poison() { |
| ; CHECK-LABEL: define float @no_fold_sin_f32_poison() { |
| ; CHECK-NEXT: [[R:%.*]] = call fast float @_Z3sinf(float poison) |
| ; CHECK-NEXT: ret float [[R]] |
| ; |
| %r = call fast float @_Z3sinf(float poison) |
| ret float %r |
| } |
| |
| ; fmin/fmax/ldexp signatures accept an implicitly splatted scalar operand, and |
| ; sincos takes a pointer; the vector evaluation loop must not index into them. |
| define <2 x float> @fmin_v2f32_scalar_second_arg() { |
| ; CHECK-LABEL: define <2 x float> @fmin_v2f32_scalar_second_arg() { |
| ; CHECK-NEXT: [[R:%.*]] = call fast <2 x float> @llvm.minnum.v2f32(<2 x float> <float 1.000000e+00, float 2.000000e+00>, <2 x float> splat (float 1.500000e+00)) |
| ; CHECK-NEXT: ret <2 x float> [[R]] |
| ; |
| %r = call fast <2 x float> @_Z4fminDv2_ff(<2 x float> <float 1.0, float 2.0>, float 1.5) |
| ret <2 x float> %r |
| } |
| |
| define <2 x float> @fmin_v2f32_scalar_first_arg() { |
| ; CHECK-LABEL: define <2 x float> @fmin_v2f32_scalar_first_arg() { |
| ; CHECK-NEXT: [[R:%.*]] = call fast <2 x float> @llvm.minnum.v2f32(<2 x float> splat (float 1.500000e+00), <2 x float> <float 1.000000e+00, float 2.000000e+00>) |
| ; CHECK-NEXT: ret <2 x float> [[R]] |
| ; |
| %r = call fast <2 x float> @_Z4fminDv2_fS_(float 1.5, <2 x float> <float 1.0, float 2.0>) |
| ret <2 x float> %r |
| } |
| |
| define <2 x float> @sincos_v2f32(ptr addrspace(5) %p) { |
| ; CHECK-LABEL: define <2 x float> @sincos_v2f32( |
| ; CHECK-SAME: ptr addrspace(5) [[P:%.*]]) { |
| ; CHECK-NEXT: store <2 x float> <float f0x3F0A5140, float f0xBED51133>, ptr addrspace(5) [[P]], align 8 |
| ; CHECK-NEXT: ret <2 x float> <float f0x3F576AA4, float f0x3F68C7B7> |
| ; |
| %r = call fast <2 x float> @_Z6sincosDv2_fPU3AS5S_(<2 x float> <float 1.0, float 2.0>, ptr addrspace(5) %p) |
| ret <2 x float> %r |
| } |