[llvm] 15bcb9a - ValueTracking: Add some regression tests for fabs handling in computeKnownFPClass

Matt Arsenault via llvm-commits llvm-commits at lists.llvm.org
Mon May 22 02:34:28 PDT 2023


Author: Matt Arsenault
Date: 2023-05-22T10:33:10+01:00
New Revision: 15bcb9a6976252c4b60ce8b72f157fb18357a969

URL: https://github.com/llvm/llvm-project/commit/15bcb9a6976252c4b60ce8b72f157fb18357a969
DIFF: https://github.com/llvm/llvm-project/commit/15bcb9a6976252c4b60ce8b72f157fb18357a969.diff

LOG: ValueTracking: Add some regression tests for fabs handling in computeKnownFPClass

Added: 
    

Modified: 
    llvm/test/Transforms/Attributor/nofpclass.ll
    llvm/test/Transforms/InstSimplify/floating-point-compare.ll
    llvm/test/Transforms/InstSimplify/known-never-infinity.ll

Removed: 
    


################################################################################
diff  --git a/llvm/test/Transforms/Attributor/nofpclass.ll b/llvm/test/Transforms/Attributor/nofpclass.ll
index 567cdbbf2390f..135188e554832 100644
--- a/llvm/test/Transforms/Attributor/nofpclass.ll
+++ b/llvm/test/Transforms/Attributor/nofpclass.ll
@@ -739,6 +739,127 @@ define float @returned_fabs_noinf(float nofpclass(inf) %x) {
   ret float %fabs
 }
 
+define float @returned_fabs_nopos(float nofpclass(psub pnorm pinf) %x) {
+; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none)
+; CHECK-LABEL: define nofpclass(inf nzero sub norm) float @returned_fabs_nopos
+; CHECK-SAME: (float nofpclass(pinf psub pnorm) [[X:%.*]]) #[[ATTR2]] {
+; CHECK-NEXT:    [[FABS:%.*]] = call nofpclass(inf nzero sub norm) float @llvm.fabs.f32(float nofpclass(pinf psub pnorm) [[X]]) #[[ATTR13]]
+; CHECK-NEXT:    ret float [[FABS]]
+;
+  %fabs = call float @llvm.fabs.f32(float %x)
+  ret float %fabs
+}
+
+define float @returned_fabs_nopos_nopzero(float nofpclass(psub pnorm pinf pzero) %x) {
+; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none)
+; CHECK-LABEL: define nofpclass(inf zero sub norm) float @returned_fabs_nopos_nopzero
+; CHECK-SAME: (float nofpclass(pinf pzero psub pnorm) [[X:%.*]]) #[[ATTR2]] {
+; CHECK-NEXT:    [[FABS:%.*]] = call nofpclass(inf zero sub norm) float @llvm.fabs.f32(float nofpclass(pinf pzero psub pnorm) [[X]]) #[[ATTR13]]
+; CHECK-NEXT:    ret float [[FABS]]
+;
+  %fabs = call float @llvm.fabs.f32(float %x)
+  ret float %fabs
+}
+
+define float @returned_fabs_nopos_nozero(float nofpclass(psub pnorm pinf zero) %x) {
+; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none)
+; CHECK-LABEL: define nofpclass(inf zero sub norm) float @returned_fabs_nopos_nozero
+; CHECK-SAME: (float nofpclass(pinf zero psub pnorm) [[X:%.*]]) #[[ATTR2]] {
+; CHECK-NEXT:    [[FABS:%.*]] = call nofpclass(inf zero sub norm) float @llvm.fabs.f32(float nofpclass(pinf zero psub pnorm) [[X]]) #[[ATTR13]]
+; CHECK-NEXT:    ret float [[FABS]]
+;
+  %fabs = call float @llvm.fabs.f32(float %x)
+  ret float %fabs
+}
+
+define float @returned_fabs_nopos_nonan(float nofpclass(psub pnorm pinf nan) %x) {
+; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none)
+; CHECK-LABEL: define nofpclass(nan inf nzero sub norm) float @returned_fabs_nopos_nonan
+; CHECK-SAME: (float nofpclass(nan pinf psub pnorm) [[X:%.*]]) #[[ATTR2]] {
+; CHECK-NEXT:    [[FABS:%.*]] = call nofpclass(nan inf nzero sub norm) float @llvm.fabs.f32(float nofpclass(nan pinf psub pnorm) [[X]]) #[[ATTR13]]
+; CHECK-NEXT:    ret float [[FABS]]
+;
+  %fabs = call float @llvm.fabs.f32(float %x)
+  ret float %fabs
+}
+
+define float @returned_fabs_noneg(float nofpclass(nsub nnorm ninf) %x) {
+; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none)
+; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @returned_fabs_noneg
+; CHECK-SAME: (float nofpclass(ninf nsub nnorm) [[X:%.*]]) #[[ATTR2]] {
+; CHECK-NEXT:    [[FABS:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(ninf nsub nnorm) [[X]]) #[[ATTR13]]
+; CHECK-NEXT:    ret float [[FABS]]
+;
+  %fabs = call float @llvm.fabs.f32(float %x)
+  ret float %fabs
+}
+
+define float @returned_fabs_noneg_nonzero(float nofpclass(nsub nnorm ninf nzero) %x) {
+; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none)
+; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @returned_fabs_noneg_nonzero
+; CHECK-SAME: (float nofpclass(ninf nzero nsub nnorm) [[X:%.*]]) #[[ATTR2]] {
+; CHECK-NEXT:    [[FABS:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(ninf nzero nsub nnorm) [[X]]) #[[ATTR13]]
+; CHECK-NEXT:    ret float [[FABS]]
+;
+  %fabs = call float @llvm.fabs.f32(float %x)
+  ret float %fabs
+}
+
+define float @returned_fabs_noneg_nozero(float nofpclass(nsub nnorm ninf zero) %x) {
+; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none)
+; CHECK-LABEL: define nofpclass(ninf zero nsub nnorm) float @returned_fabs_noneg_nozero
+; CHECK-SAME: (float nofpclass(ninf zero nsub nnorm) [[X:%.*]]) #[[ATTR2]] {
+; CHECK-NEXT:    [[FABS:%.*]] = call nofpclass(ninf zero nsub nnorm) float @llvm.fabs.f32(float nofpclass(ninf zero nsub nnorm) [[X]]) #[[ATTR13]]
+; CHECK-NEXT:    ret float [[FABS]]
+;
+  %fabs = call float @llvm.fabs.f32(float %x)
+  ret float %fabs
+}
+
+define float @returned_fabs_noneg_nonan(float nofpclass(nsub nnorm ninf nan) %x) {
+; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none)
+; CHECK-LABEL: define nofpclass(nan ninf nzero nsub nnorm) float @returned_fabs_noneg_nonan
+; CHECK-SAME: (float nofpclass(nan ninf nsub nnorm) [[X:%.*]]) #[[ATTR2]] {
+; CHECK-NEXT:    [[FABS:%.*]] = call nofpclass(nan ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(nan ninf nsub nnorm) [[X]]) #[[ATTR13]]
+; CHECK-NEXT:    ret float [[FABS]]
+;
+  %fabs = call float @llvm.fabs.f32(float %x)
+  ret float %fabs
+}
+
+define float @returned_fabs_nonsub_nopnorm_nonzero(float nofpclass(nsub pnorm nzero) %x) {
+; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none)
+; CHECK-LABEL: define nofpclass(ninf nzero nsub norm) float @returned_fabs_nonsub_nopnorm_nonzero
+; CHECK-SAME: (float nofpclass(nzero nsub pnorm) [[X:%.*]]) #[[ATTR2]] {
+; CHECK-NEXT:    [[FABS:%.*]] = call nofpclass(ninf nzero nsub norm) float @llvm.fabs.f32(float nofpclass(nzero nsub pnorm) [[X]]) #[[ATTR13]]
+; CHECK-NEXT:    ret float [[FABS]]
+;
+  %fabs = call float @llvm.fabs.f32(float %x)
+  ret float %fabs
+}
+
+define float @returned_fabs_nopsub_nonnorm_nopzero(float nofpclass(psub nnorm pzero) %x) {
+; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none)
+; CHECK-LABEL: define nofpclass(ninf zero sub nnorm) float @returned_fabs_nopsub_nonnorm_nopzero
+; CHECK-SAME: (float nofpclass(pzero psub nnorm) [[X:%.*]]) #[[ATTR2]] {
+; CHECK-NEXT:    [[FABS:%.*]] = call nofpclass(ninf zero sub nnorm) float @llvm.fabs.f32(float nofpclass(pzero psub nnorm) [[X]]) #[[ATTR13]]
+; CHECK-NEXT:    ret float [[FABS]]
+;
+  %fabs = call float @llvm.fabs.f32(float %x)
+  ret float %fabs
+}
+
+define float @returned_fabs_nonnorm_nozero(float nofpclass(nnorm nzero) %x) {
+; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none)
+; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @returned_fabs_nonnorm_nozero
+; CHECK-SAME: (float nofpclass(nzero nnorm) [[X:%.*]]) #[[ATTR2]] {
+; CHECK-NEXT:    [[FABS:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(nzero nnorm) [[X]]) #[[ATTR13]]
+; CHECK-NEXT:    ret float [[FABS]]
+;
+  %fabs = call float @llvm.fabs.f32(float %x)
+  ret float %fabs
+}
+
 define float @returned_fneg(float %x) {
 ; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none)
 ; CHECK-LABEL: define float @returned_fneg

diff  --git a/llvm/test/Transforms/InstSimplify/floating-point-compare.ll b/llvm/test/Transforms/InstSimplify/floating-point-compare.ll
index a36af929af48c..bb95a8758d49c 100644
--- a/llvm/test/Transforms/InstSimplify/floating-point-compare.ll
+++ b/llvm/test/Transforms/InstSimplify/floating-point-compare.ll
@@ -1475,6 +1475,36 @@ define i1 @fcmp_olt_0_assumed_oge_zero(float %x) {
   ret i1 %r
 }
 
+define i1 @ogt_zero_fabs_select_negone_or_pinf(i1 %cond) {
+; CHECK-LABEL: @ogt_zero_fabs_select_negone_or_pinf(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[SELECT:%.*]] = select i1 [[COND:%.*]], float -1.000000e+00, float 0x7FF0000000000000
+; CHECK-NEXT:    [[FABS:%.*]] = call float @llvm.fabs.f32(float [[SELECT]])
+; CHECK-NEXT:    [[ONE:%.*]] = fcmp ogt float [[FABS]], 0.000000e+00
+; CHECK-NEXT:    ret i1 [[ONE]]
+;
+entry:
+  %select = select i1 %cond, float -1.0, float 0x7FF0000000000000
+  %fabs = call float @llvm.fabs.f32(float %select)
+  %one = fcmp ogt float %fabs, 0.0
+  ret i1 %one
+}
+
+define i1 @ogt_zero_fabs_select_one_or_ninf(i1 %cond) {
+; CHECK-LABEL: @ogt_zero_fabs_select_one_or_ninf(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[SELECT:%.*]] = select i1 [[COND:%.*]], float 1.000000e+00, float 0xFFF0000000000000
+; CHECK-NEXT:    [[FABS:%.*]] = call float @llvm.fabs.f32(float [[SELECT]])
+; CHECK-NEXT:    [[ONE:%.*]] = fcmp ogt float [[FABS]], 0.000000e+00
+; CHECK-NEXT:    ret i1 [[ONE]]
+;
+entry:
+  %select = select i1 %cond, float 1.0, float 0xFFF0000000000000
+  %fabs = call float @llvm.fabs.f32(float %select)
+  %one = fcmp ogt float %fabs, 0.0
+  ret i1 %one
+}
+
 declare <2 x double> @llvm.fabs.v2f64(<2 x double>)
 declare <2 x float> @llvm.fabs.v2f32(<2 x float>)
 declare <2 x float> @llvm.maxnum.v2f32(<2 x float>, <2 x float>)

diff  --git a/llvm/test/Transforms/InstSimplify/known-never-infinity.ll b/llvm/test/Transforms/InstSimplify/known-never-infinity.ll
index 0ee5988d5ce07..a7b7e0b4b1fa6 100644
--- a/llvm/test/Transforms/InstSimplify/known-never-infinity.ll
+++ b/llvm/test/Transforms/InstSimplify/known-never-infinity.ll
@@ -1021,6 +1021,73 @@ define i1 @isNotKnownNeverInfinity_fmuladd(double %x, double %y, double %z) {
   ret i1 %cmp
 }
 
+define i1 @not_inf_fabs_select_pzero_or_ninf(i1 %cond) {
+; CHECK-LABEL: define i1 @not_inf_fabs_select_pzero_or_ninf
+; CHECK-SAME: (i1 [[COND:%.*]]) {
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[SELECT:%.*]] = select i1 [[COND]], float 0.000000e+00, float 0xFFF0000000000000
+; CHECK-NEXT:    [[FABS:%.*]] = call float @llvm.fabs.f32(float [[SELECT]])
+; CHECK-NEXT:    [[ONE:%.*]] = fcmp one float [[FABS]], 0x7FF0000000000000
+; CHECK-NEXT:    ret i1 [[ONE]]
+;
+entry:
+  %select = select i1 %cond, float 0.000000e+00, float 0xFFF0000000000000
+  %fabs = call float @llvm.fabs.f32(float %select)
+  %one = fcmp one float %fabs, 0x7FF0000000000000
+  ret i1 %one
+}
+
+define i1 @not_inf_fabs_select_nzero_or_pinf(i1 %cond) {
+; CHECK-LABEL: define i1 @not_inf_fabs_select_nzero_or_pinf
+; CHECK-SAME: (i1 [[COND:%.*]]) {
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[SELECT:%.*]] = select i1 [[COND]], float -0.000000e+00, float 0x7FF0000000000000
+; CHECK-NEXT:    [[FABS:%.*]] = call float @llvm.fabs.f32(float [[SELECT]])
+; CHECK-NEXT:    [[ONE:%.*]] = fcmp one float [[FABS]], 0x7FF0000000000000
+; CHECK-NEXT:    ret i1 [[ONE]]
+;
+entry:
+  %select = select i1 %cond, float -0.000000e+00, float 0x7FF0000000000000
+  %fabs = call float @llvm.fabs.f32(float %select)
+  %one = fcmp one float %fabs, 0x7FF0000000000000
+  ret i1 %one
+}
+
+define i1 @not_ninf_fabs_select_nzero_or_pinf(i1 %cond) {
+; CHECK-LABEL: define i1 @not_ninf_fabs_select_nzero_or_pinf
+; CHECK-SAME: (i1 [[COND:%.*]]) {
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[SELECT:%.*]] = select i1 [[COND]], float -0.000000e+00, float 0x7FF0000000000000
+; CHECK-NEXT:    [[FABS:%.*]] = call float @llvm.fabs.f32(float [[SELECT]])
+; CHECK-NEXT:    [[ONE:%.*]] = fcmp one float [[FABS]], 0xFFF0000000000000
+; CHECK-NEXT:    ret i1 [[ONE]]
+;
+entry:
+  %select = select i1 %cond, float -0.000000e+00, float 0x7FF0000000000000
+  %fabs = call float @llvm.fabs.f32(float %select)
+  %one = fcmp one float %fabs, 0xFFF0000000000000
+  ret i1 %one
+}
+
+define i1 @not_ninf_fneg_fabs_select_nzero_or_pinf(i1 %cond) {
+; CHECK-LABEL: define i1 @not_ninf_fneg_fabs_select_nzero_or_pinf
+; CHECK-SAME: (i1 [[COND:%.*]]) {
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[SELECT:%.*]] = select i1 [[COND]], float -0.000000e+00, float 0x7FF0000000000000
+; CHECK-NEXT:    [[FABS:%.*]] = call float @llvm.fabs.f32(float [[SELECT]])
+; CHECK-NEXT:    [[FNEG_FABS:%.*]] = fneg float [[FABS]]
+; CHECK-NEXT:    [[ONE:%.*]] = fcmp one float [[FNEG_FABS]], 0xFFF0000000000000
+; CHECK-NEXT:    ret i1 [[ONE]]
+;
+entry:
+  %select = select i1 %cond, float -0.000000e+00, float 0x7FF0000000000000
+  %fabs = call float @llvm.fabs.f32(float %select)
+  %fneg.fabs = fneg float %fabs
+  %one = fcmp one float %fneg.fabs, 0xFFF0000000000000
+  ret i1 %one
+}
+
+
 declare double @llvm.arithmetic.fence.f64(double)
 declare double @llvm.canonicalize.f64(double)
 declare double @llvm.ceil.f64(double)
@@ -1029,6 +1096,7 @@ declare double @llvm.cos.f64(double)
 declare double @llvm.exp2.f64(double)
 declare double @llvm.exp.f64(double)
 declare double @llvm.fabs.f64(double)
+declare float @llvm.fabs.f32(float)
 declare double @llvm.floor.f64(double)
 declare double @llvm.fma.f64(double, double, double)
 declare double @llvm.fmuladd.f64(double, double, double)


        


More information about the llvm-commits mailing list