[AArch64][llvm] Allow FPRCVT insns to run in streaming mode if safe (#177334)

For FEAT_FPRCVT instructions, allow them to run in streaming mode if safe
This commit is contained in:
Jonathan Thackray 2026-02-12 16:41:57 +00:00 committed by GitHub
parent 16ef4ed48f
commit 2de6d980de
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 225 additions and 1917 deletions

View File

@ -20686,6 +20686,9 @@ tryToReplaceScalarFPConversionWithSVE(SDNode *N, SelectionDAG &DAG,
if (DCI.isBeforeLegalizeOps())
return SDValue();
if (Subtarget->hasFPRCVT())
return SDValue();
if (!Subtarget->isSVEorStreamingSVEAvailable() ||
(!Subtarget->isStreaming() && !Subtarget->isStreamingCompatible()))
return SDValue();

View File

@ -5360,7 +5360,7 @@ defm FCVTZU : FPToIntegerUnscaled<0b11, 0b001, "fcvtzu", any_fp_to_uint>;
defm FCVTZS : FPToIntegerScaled<0b11, 0b000, "fcvtzs", any_fp_to_sint>;
defm FCVTZU : FPToIntegerScaled<0b11, 0b001, "fcvtzu", any_fp_to_uint>;
let Predicates = [HasNEON, HasFPRCVT] in{
let Predicates = [HasFPRCVT] in{
defm FCVTAS : FPToIntegerSIMDScalar<0b11, 0b010, "fcvtas", int_aarch64_neon_fcvtas>;
defm FCVTAU : FPToIntegerSIMDScalar<0b11, 0b011, "fcvtau", int_aarch64_neon_fcvtau>;
defm FCVTMS : FPToIntegerSIMDScalar<0b10, 0b100, "fcvtms", int_aarch64_neon_fcvtms>;
@ -5403,7 +5403,7 @@ def : Pat<(i64 (any_llround f64:$Rn)),
defm SCVTF : IntegerToFP<0b00, 0b010, "scvtf", any_sint_to_fp>;
defm UCVTF : IntegerToFP<0b00, 0b011, "ucvtf", any_uint_to_fp>;
let Predicates = [HasNEON, HasFPRCVT] in {
let Predicates = [HasFPRCVT] in {
defm SCVTF : IntegerToFPSIMDScalar<0b11, 0b100, "scvtf", any_sint_to_fp>;
defm UCVTF : IntegerToFPSIMDScalar<0b11, 0b101, "ucvtf", any_uint_to_fp>;

File diff suppressed because it is too large Load Diff

View File

@ -51,16 +51,12 @@ define half @scvtf_bitcast_f32_to_f16(float %f) nounwind {
;
; CHECK-SME-LABEL: scvtf_bitcast_f32_to_f16:
; CHECK-SME: // %bb.0:
; CHECK-SME-NEXT: ptrue p0.s
; CHECK-SME-NEXT: scvtf z0.h, p0/m, z0.s
; CHECK-SME-NEXT: scvtf h0, s0
; CHECK-SME-NEXT: ret
;
; CHECK-SVE-LABEL: scvtf_bitcast_f32_to_f16:
; CHECK-SVE: // %bb.0:
; CHECK-SVE-NEXT: ptrue p0.s
; CHECK-SVE-NEXT: // kill: def $s0 killed $s0 def $z0
; CHECK-SVE-NEXT: scvtf z0.h, p0/m, z0.s
; CHECK-SVE-NEXT: // kill: def $h0 killed $h0 killed $z0
; CHECK-SVE-NEXT: scvtf h0, s0
; CHECK-SVE-NEXT: ret
%i = bitcast float %f to i32
%r = sitofp i32 %i to half
@ -75,16 +71,12 @@ define half @ucvtf_bitcast_f32_to_f16(float %f) nounwind {
;
; CHECK-SME-LABEL: ucvtf_bitcast_f32_to_f16:
; CHECK-SME: // %bb.0:
; CHECK-SME-NEXT: ptrue p0.s
; CHECK-SME-NEXT: ucvtf z0.h, p0/m, z0.s
; CHECK-SME-NEXT: ucvtf h0, s0
; CHECK-SME-NEXT: ret
;
; CHECK-SVE-LABEL: ucvtf_bitcast_f32_to_f16:
; CHECK-SVE: // %bb.0:
; CHECK-SVE-NEXT: ptrue p0.s
; CHECK-SVE-NEXT: // kill: def $s0 killed $s0 def $z0
; CHECK-SVE-NEXT: ucvtf z0.h, p0/m, z0.s
; CHECK-SVE-NEXT: // kill: def $h0 killed $h0 killed $z0
; CHECK-SVE-NEXT: ucvtf h0, s0
; CHECK-SVE-NEXT: ret
%i = bitcast float %f to i32
%r = uitofp i32 %i to half
@ -99,16 +91,12 @@ define float @scvtf_bitcast_f64_to_f32(double %d) nounwind {
;
; CHECK-SME-LABEL: scvtf_bitcast_f64_to_f32:
; CHECK-SME: // %bb.0:
; CHECK-SME-NEXT: ptrue p0.d
; CHECK-SME-NEXT: scvtf z0.s, p0/m, z0.d
; CHECK-SME-NEXT: scvtf s0, d0
; CHECK-SME-NEXT: ret
;
; CHECK-SVE-LABEL: scvtf_bitcast_f64_to_f32:
; CHECK-SVE: // %bb.0:
; CHECK-SVE-NEXT: ptrue p0.d
; CHECK-SVE-NEXT: // kill: def $d0 killed $d0 def $z0
; CHECK-SVE-NEXT: scvtf z0.s, p0/m, z0.d
; CHECK-SVE-NEXT: // kill: def $s0 killed $s0 killed $z0
; CHECK-SVE-NEXT: scvtf s0, d0
; CHECK-SVE-NEXT: ret
%i = bitcast double %d to i64
%r = sitofp i64 %i to float
@ -123,16 +111,12 @@ define float @ucvtf_bitcast_f64_to_f32(double %d) nounwind {
;
; CHECK-SME-LABEL: ucvtf_bitcast_f64_to_f32:
; CHECK-SME: // %bb.0:
; CHECK-SME-NEXT: ptrue p0.d
; CHECK-SME-NEXT: ucvtf z0.s, p0/m, z0.d
; CHECK-SME-NEXT: ucvtf s0, d0
; CHECK-SME-NEXT: ret
;
; CHECK-SVE-LABEL: ucvtf_bitcast_f64_to_f32:
; CHECK-SVE: // %bb.0:
; CHECK-SVE-NEXT: ptrue p0.d
; CHECK-SVE-NEXT: // kill: def $d0 killed $d0 def $z0
; CHECK-SVE-NEXT: ucvtf z0.s, p0/m, z0.d
; CHECK-SVE-NEXT: // kill: def $s0 killed $s0 killed $z0
; CHECK-SVE-NEXT: ucvtf s0, d0
; CHECK-SVE-NEXT: ret
%i = bitcast double %d to i64
%r = uitofp i64 %i to float
@ -147,16 +131,12 @@ define half @scvtf_bitcast_f64_to_f16(double %d) nounwind {
;
; CHECK-SME-LABEL: scvtf_bitcast_f64_to_f16:
; CHECK-SME: // %bb.0:
; CHECK-SME-NEXT: ptrue p0.d
; CHECK-SME-NEXT: scvtf z0.h, p0/m, z0.d
; CHECK-SME-NEXT: scvtf h0, d0
; CHECK-SME-NEXT: ret
;
; CHECK-SVE-LABEL: scvtf_bitcast_f64_to_f16:
; CHECK-SVE: // %bb.0:
; CHECK-SVE-NEXT: ptrue p0.d
; CHECK-SVE-NEXT: // kill: def $d0 killed $d0 def $z0
; CHECK-SVE-NEXT: scvtf z0.h, p0/m, z0.d
; CHECK-SVE-NEXT: // kill: def $h0 killed $h0 killed $z0
; CHECK-SVE-NEXT: scvtf h0, d0
; CHECK-SVE-NEXT: ret
%i = bitcast double %d to i64
%r = sitofp i64 %i to half
@ -171,16 +151,12 @@ define half @ucvtf_bitcast_f64_to_f16(double %d) nounwind {
;
; CHECK-SME-LABEL: ucvtf_bitcast_f64_to_f16:
; CHECK-SME: // %bb.0:
; CHECK-SME-NEXT: ptrue p0.d
; CHECK-SME-NEXT: ucvtf z0.h, p0/m, z0.d
; CHECK-SME-NEXT: ucvtf h0, d0
; CHECK-SME-NEXT: ret
;
; CHECK-SVE-LABEL: ucvtf_bitcast_f64_to_f16:
; CHECK-SVE: // %bb.0:
; CHECK-SVE-NEXT: ptrue p0.d
; CHECK-SVE-NEXT: // kill: def $d0 killed $d0 def $z0
; CHECK-SVE-NEXT: ucvtf z0.h, p0/m, z0.d
; CHECK-SVE-NEXT: // kill: def $h0 killed $h0 killed $z0
; CHECK-SVE-NEXT: ucvtf h0, d0
; CHECK-SVE-NEXT: ret
%i = bitcast double %d to i64
%r = uitofp i64 %i to half
@ -195,16 +171,12 @@ define float @scvtf_bitcast_f32_to_f32(float %f) nounwind {
;
; CHECK-SME-LABEL: scvtf_bitcast_f32_to_f32:
; CHECK-SME: // %bb.0:
; CHECK-SME-NEXT: ptrue p0.s
; CHECK-SME-NEXT: scvtf z0.s, p0/m, z0.s
; CHECK-SME-NEXT: scvtf s0, s0
; CHECK-SME-NEXT: ret
;
; CHECK-SVE-LABEL: scvtf_bitcast_f32_to_f32:
; CHECK-SVE: // %bb.0:
; CHECK-SVE-NEXT: ptrue p0.s
; CHECK-SVE-NEXT: // kill: def $s0 killed $s0 def $z0
; CHECK-SVE-NEXT: scvtf z0.s, p0/m, z0.s
; CHECK-SVE-NEXT: // kill: def $s0 killed $s0 killed $z0
; CHECK-SVE-NEXT: scvtf s0, s0
; CHECK-SVE-NEXT: ret
%i = bitcast float %f to i32
%r = sitofp i32 %i to float
@ -219,16 +191,12 @@ define float @ucvtf_bitcast_f32_to_f32(float %f) nounwind {
;
; CHECK-SME-LABEL: ucvtf_bitcast_f32_to_f32:
; CHECK-SME: // %bb.0:
; CHECK-SME-NEXT: ptrue p0.s
; CHECK-SME-NEXT: ucvtf z0.s, p0/m, z0.s
; CHECK-SME-NEXT: ucvtf s0, s0
; CHECK-SME-NEXT: ret
;
; CHECK-SVE-LABEL: ucvtf_bitcast_f32_to_f32:
; CHECK-SVE: // %bb.0:
; CHECK-SVE-NEXT: ptrue p0.s
; CHECK-SVE-NEXT: // kill: def $s0 killed $s0 def $z0
; CHECK-SVE-NEXT: ucvtf z0.s, p0/m, z0.s
; CHECK-SVE-NEXT: // kill: def $s0 killed $s0 killed $z0
; CHECK-SVE-NEXT: ucvtf s0, s0
; CHECK-SVE-NEXT: ret
%i = bitcast float %f to i32
%r = uitofp i32 %i to float
@ -243,16 +211,12 @@ define double @scvtf_bitcast_f64_to_f64(double %d) nounwind {
;
; CHECK-SME-LABEL: scvtf_bitcast_f64_to_f64:
; CHECK-SME: // %bb.0:
; CHECK-SME-NEXT: ptrue p0.d
; CHECK-SME-NEXT: scvtf z0.d, p0/m, z0.d
; CHECK-SME-NEXT: scvtf d0, d0
; CHECK-SME-NEXT: ret
;
; CHECK-SVE-LABEL: scvtf_bitcast_f64_to_f64:
; CHECK-SVE: // %bb.0:
; CHECK-SVE-NEXT: ptrue p0.d
; CHECK-SVE-NEXT: // kill: def $d0 killed $d0 def $z0
; CHECK-SVE-NEXT: scvtf z0.d, p0/m, z0.d
; CHECK-SVE-NEXT: // kill: def $d0 killed $d0 killed $z0
; CHECK-SVE-NEXT: scvtf d0, d0
; CHECK-SVE-NEXT: ret
%i = bitcast double %d to i64
%r = sitofp i64 %i to double
@ -267,16 +231,12 @@ define double @ucvtf_bitcast_f64_to_f64(double %d) nounwind {
;
; CHECK-SME-LABEL: ucvtf_bitcast_f64_to_f64:
; CHECK-SME: // %bb.0:
; CHECK-SME-NEXT: ptrue p0.d
; CHECK-SME-NEXT: ucvtf z0.d, p0/m, z0.d
; CHECK-SME-NEXT: ucvtf d0, d0
; CHECK-SME-NEXT: ret
;
; CHECK-SVE-LABEL: ucvtf_bitcast_f64_to_f64:
; CHECK-SVE: // %bb.0:
; CHECK-SVE-NEXT: ptrue p0.d
; CHECK-SVE-NEXT: // kill: def $d0 killed $d0 def $z0
; CHECK-SVE-NEXT: ucvtf z0.d, p0/m, z0.d
; CHECK-SVE-NEXT: // kill: def $d0 killed $d0 killed $z0
; CHECK-SVE-NEXT: ucvtf d0, d0
; CHECK-SVE-NEXT: ret
%i = bitcast double %d to i64
%r = uitofp i64 %i to double