[SelectionDAG][X86] Support f16 in getReciprocalOpName.

If the "reciprocal-estimates" attribute is present and it doesn't
contain "all", "none", or "default", we previously crashed on f16
operations.

This patch addes an 'h' suffix' to prevent the crash.

I've added simple tests that just enable the estimate for all
vec-sqrt and one test case that explicitly tests the new 'h' suffix
to override the default steps.

There may be some frontend change needed to, but I haven't checked
that yet.

Reviewed By: pengfei

Differential Revision: https://reviews.llvm.org/D120158
This commit is contained in:
Craig Topper 2022-02-18 21:55:48 -08:00
parent 39151717db
commit 1df8efae56
2 changed files with 29 additions and 1 deletions

View File

@ -2072,9 +2072,11 @@ static std::string getReciprocalOpName(bool IsSqrt, EVT VT) {
Name += IsSqrt ? "sqrt" : "div";
// TODO: Handle "half" or other float types?
// TODO: Handle other float types?
if (VT.getScalarType() == MVT::f64) {
Name += "d";
} else if (VT.getScalarType() == MVT::f16) {
Name += "h";
} else {
assert(VT.getScalarType() == MVT::f32 &&
"Unexpected FP type for reciprocal estimate");

View File

@ -35,6 +35,32 @@ define <32 x half> @test_sqrt_ph_512_fast(<32 x half> %a0, <32 x half> %a1) {
ret <32 x half> %2
}
define <32 x half> @test_sqrt_ph_512_fast_estimate_attribute(<32 x half> %a0, <32 x half> %a1) "reciprocal-estimates"="vec-sqrt" {
; CHECK-LABEL: test_sqrt_ph_512_fast_estimate_attribute:
; CHECK: # %bb.0:
; CHECK-NEXT: vrsqrtph %zmm0, %zmm0
; CHECK-NEXT: vmulph %zmm0, %zmm1, %zmm0
; CHECK-NEXT: retq
%1 = call fast <32 x half> @llvm.sqrt.v32f16(<32 x half> %a0)
%2 = fdiv fast <32 x half> %a1, %1
ret <32 x half> %2
}
define <32 x half> @test_sqrt_ph_512_fast_estimate_attribute_2(<32 x half> %a0, <32 x half> %a1) "reciprocal-estimates"="vec-sqrth:1" {
; CHECK-LABEL: test_sqrt_ph_512_fast_estimate_attribute_2:
; CHECK: # %bb.0:
; CHECK-NEXT: vrsqrtph %zmm0, %zmm2
; CHECK-NEXT: vmulph %zmm2, %zmm0, %zmm0
; CHECK-NEXT: vfmadd213ph {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to32}, %zmm2, %zmm0
; CHECK-NEXT: vmulph {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to32}, %zmm2, %zmm2
; CHECK-NEXT: vmulph %zmm1, %zmm0, %zmm0
; CHECK-NEXT: vmulph %zmm0, %zmm2, %zmm0
; CHECK-NEXT: retq
%1 = call fast <32 x half> @llvm.sqrt.v32f16(<32 x half> %a0)
%2 = fdiv fast <32 x half> %a1, %1
ret <32 x half> %2
}
define <32 x half> @test_mask_sqrt_ph_512(<32 x half> %a0, <32 x half> %passthru, i32 %mask) {
; CHECK-LABEL: test_mask_sqrt_ph_512:
; CHECK: # %bb.0: