[llvm] 83ed93c - [InstCombine] add tests for fabs folds with more FMF; NFC
Sanjay Patel via llvm-commits
llvm-commits at lists.llvm.org
Sat Dec 10 07:07:50 PST 2022
Author: Sanjay Patel
Date: 2022-12-10T10:07:42-05:00
New Revision: 83ed93c0c387ca92d436e7bb3229712d3d4f665f
URL: https://github.com/llvm/llvm-project/commit/83ed93c0c387ca92d436e7bb3229712d3d4f665f
DIFF: https://github.com/llvm/llvm-project/commit/83ed93c0c387ca92d436e7bb3229712d3d4f665f.diff
LOG: [InstCombine] add tests for fabs folds with more FMF; NFC
The existing variants have "nsz", but that's not enough
to get fabs/fneg semantics right with a NAN input, so
I duplicated those with "nnan" tacked on. See discussion
in issue #59279.
Added:
Modified:
llvm/test/Transforms/InstCombine/fabs.ll
llvm/test/Transforms/InstCombine/fneg-fabs.ll
llvm/test/Transforms/InstCombine/fneg.ll
Removed:
################################################################################
diff --git a/llvm/test/Transforms/InstCombine/fabs.ll b/llvm/test/Transforms/InstCombine/fabs.ll
index 1b9f4a3c3315..a00069375d61 100644
--- a/llvm/test/Transforms/InstCombine/fabs.ll
+++ b/llvm/test/Transforms/InstCombine/fabs.ll
@@ -349,8 +349,8 @@ define fp128 @select_fcmp_ogt_zero(fp128 %x) {
ret fp128 %fabs
}
-define float @select_fcmp_ogt_fneg(float %a) {
-; CHECK-LABEL: @select_fcmp_ogt_fneg(
+define float @select_nsz_fcmp_ogt_fneg(float %a) {
+; CHECK-LABEL: @select_nsz_fcmp_ogt_fneg(
; CHECK-NEXT: [[TMP1:%.*]] = call nsz float @llvm.fabs.f32(float [[A:%.*]])
; CHECK-NEXT: ret float [[TMP1]]
;
@@ -360,6 +360,17 @@ define float @select_fcmp_ogt_fneg(float %a) {
ret float %r
}
+define float @select_nsz_nnan_fcmp_ogt_fneg(float %a) {
+; CHECK-LABEL: @select_nsz_nnan_fcmp_ogt_fneg(
+; CHECK-NEXT: [[TMP1:%.*]] = call nnan nsz float @llvm.fabs.f32(float [[A:%.*]])
+; CHECK-NEXT: ret float [[TMP1]]
+;
+ %fneg = fneg float %a
+ %cmp = fcmp ogt float %a, %fneg
+ %r = select nsz nnan i1 %cmp, float %a, float %fneg
+ ret float %r
+}
+
define fp128 @select_fcmp_nnan_ogt_zero(fp128 %x) {
; CHECK-LABEL: @select_fcmp_nnan_ogt_zero(
; CHECK-NEXT: [[TMP1:%.*]] = call fp128 @llvm.fabs.f128(fp128 [[X:%.*]])
@@ -436,8 +447,8 @@ define half @select_fcmp_nnan_oge_negzero(half %x) {
; X < 0.0 ? -X : X --> fabs(X)
-define double @select_fcmp_olt_zero_unary_fneg(double %x) {
-; CHECK-LABEL: @select_fcmp_olt_zero_unary_fneg(
+define double @select_nsz_fcmp_olt_zero_unary_fneg(double %x) {
+; CHECK-LABEL: @select_nsz_fcmp_olt_zero_unary_fneg(
; CHECK-NEXT: [[TMP1:%.*]] = call nsz double @llvm.fabs.f64(double [[X:%.*]])
; CHECK-NEXT: ret double [[TMP1]]
;
@@ -447,6 +458,17 @@ define double @select_fcmp_olt_zero_unary_fneg(double %x) {
ret double %fabs
}
+define double @select_nsz_nnan_fcmp_olt_zero_unary_fneg(double %x) {
+; CHECK-LABEL: @select_nsz_nnan_fcmp_olt_zero_unary_fneg(
+; CHECK-NEXT: [[TMP1:%.*]] = call nnan nsz double @llvm.fabs.f64(double [[X:%.*]])
+; CHECK-NEXT: ret double [[TMP1]]
+;
+ %ltzero = fcmp olt double %x, 0.0
+ %negx = fneg double %x
+ %fabs = select nsz nnan i1 %ltzero, double %negx, double %x
+ ret double %fabs
+}
+
define double @select_fcmp_nnan_nsz_olt_zero(double %x) {
; CHECK-LABEL: @select_fcmp_nnan_nsz_olt_zero(
; CHECK-NEXT: [[LTZERO:%.*]] = fcmp olt double [[X:%.*]], 0.000000e+00
@@ -721,10 +743,10 @@ define float @select_fcmp_nnan_nsz_ule_negzero_unary_fneg(float %x) {
ret float %fabs
}
-; X > 0.0 ? X : (0.0 - X) --> fabs(X)
+; X > 0.0 ? X : (-X) --> fabs(X)
-define <2 x float> @select_fcmp_ogt_zero_unary_fneg(<2 x float> %x) {
-; CHECK-LABEL: @select_fcmp_ogt_zero_unary_fneg(
+define <2 x float> @select_nsz_fcmp_ogt_zero_unary_fneg(<2 x float> %x) {
+; CHECK-LABEL: @select_nsz_fcmp_ogt_zero_unary_fneg(
; CHECK-NEXT: [[TMP1:%.*]] = call nsz <2 x float> @llvm.fabs.v2f32(<2 x float> [[X:%.*]])
; CHECK-NEXT: ret <2 x float> [[TMP1]]
;
@@ -734,6 +756,17 @@ define <2 x float> @select_fcmp_ogt_zero_unary_fneg(<2 x float> %x) {
ret <2 x float> %fabs
}
+define <2 x float> @select_nsz_nnan_fcmp_ogt_zero_unary_fneg(<2 x float> %x) {
+; CHECK-LABEL: @select_nsz_nnan_fcmp_ogt_zero_unary_fneg(
+; CHECK-NEXT: [[TMP1:%.*]] = call nnan nsz <2 x float> @llvm.fabs.v2f32(<2 x float> [[X:%.*]])
+; CHECK-NEXT: ret <2 x float> [[TMP1]]
+;
+ %gtzero = fcmp ogt <2 x float> %x, zeroinitializer
+ %negx = fneg <2 x float> %x
+ %fabs = select nsz nnan <2 x i1> %gtzero, <2 x float> %x, <2 x float> %negx
+ ret <2 x float> %fabs
+}
+
define <2 x float> @select_fcmp_nnan_nsz_ogt_zero(<2 x float> %x) {
; CHECK-LABEL: @select_fcmp_nnan_nsz_ogt_zero(
; CHECK-NEXT: [[GTZERO:%.*]] = fcmp ogt <2 x float> [[X:%.*]], zeroinitializer
diff --git a/llvm/test/Transforms/InstCombine/fneg-fabs.ll b/llvm/test/Transforms/InstCombine/fneg-fabs.ll
index 665c0111af1f..f47d727dae67 100644
--- a/llvm/test/Transforms/InstCombine/fneg-fabs.ll
+++ b/llvm/test/Transforms/InstCombine/fneg-fabs.ll
@@ -30,19 +30,20 @@ define double @select_nsz_nfabs_lt_fmfProp(double %x) {
ret double %sel
}
-; Tests with various predicate types.
-define double @select_nsz_nfabs_olt(double %x) {
-; CHECK-LABEL: @select_nsz_nfabs_olt(
-; CHECK-NEXT: [[TMP1:%.*]] = call nsz double @llvm.fabs.f64(double [[X:%.*]])
-; CHECK-NEXT: [[SEL:%.*]] = fneg nsz double [[TMP1]]
+define double @select_nsz_nnan_nfabs_lt_fmfProp(double %x) {
+; CHECK-LABEL: @select_nsz_nnan_nfabs_lt_fmfProp(
+; CHECK-NEXT: [[TMP1:%.*]] = call nnan nsz double @llvm.fabs.f64(double [[X:%.*]])
+; CHECK-NEXT: [[SEL:%.*]] = fneg nnan nsz double [[TMP1]]
; CHECK-NEXT: ret double [[SEL]]
;
%cmp = fcmp olt double %x, 0.000000e+00
- %negX = fneg double %x
- %sel = select nsz i1 %cmp, double %x, double %negX
+ %negX = fneg fast double %x
+ %sel = select nsz nnan i1 %cmp, double %x, double %negX
ret double %sel
}
+; Tests with various predicate types.
+
define double @select_nsz_nfabs_ult(double %x) {
; CHECK-LABEL: @select_nsz_nfabs_ult(
; CHECK-NEXT: [[TMP1:%.*]] = call nsz double @llvm.fabs.f64(double [[X:%.*]])
@@ -55,6 +56,18 @@ define double @select_nsz_nfabs_ult(double %x) {
ret double %sel
}
+define double @select_nsz_nnan_nfabs_ult(double %x) {
+; CHECK-LABEL: @select_nsz_nnan_nfabs_ult(
+; CHECK-NEXT: [[TMP1:%.*]] = call nnan nsz double @llvm.fabs.f64(double [[X:%.*]])
+; CHECK-NEXT: [[SEL:%.*]] = fneg nnan nsz double [[TMP1]]
+; CHECK-NEXT: ret double [[SEL]]
+;
+ %cmp = fcmp ult double %x, 0.000000e+00
+ %negX = fneg double %x
+ %sel = select nsz nnan i1 %cmp, double %x, double %negX
+ ret double %sel
+}
+
define double @select_nsz_nfabs_ole(double %x) {
; CHECK-LABEL: @select_nsz_nfabs_ole(
; CHECK-NEXT: [[TMP1:%.*]] = call nsz double @llvm.fabs.f64(double [[X:%.*]])
@@ -67,6 +80,18 @@ define double @select_nsz_nfabs_ole(double %x) {
ret double %sel
}
+define double @select_nsz_nnan_nfabs_ole(double %x) {
+; CHECK-LABEL: @select_nsz_nnan_nfabs_ole(
+; CHECK-NEXT: [[TMP1:%.*]] = call nnan nsz double @llvm.fabs.f64(double [[X:%.*]])
+; CHECK-NEXT: [[SEL:%.*]] = fneg nnan nsz double [[TMP1]]
+; CHECK-NEXT: ret double [[SEL]]
+;
+ %cmp = fcmp ole double %x, 0.000000e+00
+ %negX = fneg double %x
+ %sel = select nsz nnan i1 %cmp, double %x, double %negX
+ ret double %sel
+}
+
define double @select_nsz_nfabs_ule(double %x) {
; CHECK-LABEL: @select_nsz_nfabs_ule(
; CHECK-NEXT: [[TMP1:%.*]] = call nsz double @llvm.fabs.f64(double [[X:%.*]])
@@ -79,6 +104,18 @@ define double @select_nsz_nfabs_ule(double %x) {
ret double %sel
}
+define double @select_nsz_nnan_nfabs_ule(double %x) {
+; CHECK-LABEL: @select_nsz_nnan_nfabs_ule(
+; CHECK-NEXT: [[TMP1:%.*]] = call nnan nsz double @llvm.fabs.f64(double [[X:%.*]])
+; CHECK-NEXT: [[SEL:%.*]] = fneg nnan nsz double [[TMP1]]
+; CHECK-NEXT: ret double [[SEL]]
+;
+ %cmp = fcmp ule double %x, 0.000000e+00
+ %negX = fneg double %x
+ %sel = select nsz nnan i1 %cmp, double %x, double %negX
+ ret double %sel
+}
+
; (X > +/-0.0) ? -X : X --> -fabs(X)
; (X >= +/-0.0) ? -X : X --> -fabs(X)
; One negative test with no fmf
@@ -108,6 +145,18 @@ define double @select_nsz_nfabs_gt_fmfProp(double %x) {
ret double %sel
}
+define double @select_nsz_nnan_nfabs_gt_fmfProp(double %x) {
+; CHECK-LABEL: @select_nsz_nnan_nfabs_gt_fmfProp(
+; CHECK-NEXT: [[TMP1:%.*]] = call nnan nsz double @llvm.fabs.f64(double [[X:%.*]])
+; CHECK-NEXT: [[SEL:%.*]] = fneg nnan nsz double [[TMP1]]
+; CHECK-NEXT: ret double [[SEL]]
+;
+ %cmp = fcmp ogt double %x, 0.000000e+00
+ %negX = fneg fast double %x
+ %sel = select nsz nnan i1 %cmp, double %negX, double %x
+ ret double %sel
+}
+
; Tests with various predicate types.
define double @select_nsz_nfabs_ogt(double %x) {
; CHECK-LABEL: @select_nsz_nfabs_ogt(
@@ -121,6 +170,18 @@ define double @select_nsz_nfabs_ogt(double %x) {
ret double %sel
}
+define double @select_nsz_nnan_nfabs_ogt(double %x) {
+; CHECK-LABEL: @select_nsz_nnan_nfabs_ogt(
+; CHECK-NEXT: [[TMP1:%.*]] = call nnan nsz double @llvm.fabs.f64(double [[X:%.*]])
+; CHECK-NEXT: [[SEL:%.*]] = fneg nnan nsz double [[TMP1]]
+; CHECK-NEXT: ret double [[SEL]]
+;
+ %cmp = fcmp ogt double %x, 0.000000e+00
+ %negX = fneg double %x
+ %sel = select nsz nnan i1 %cmp, double %negX, double %x
+ ret double %sel
+}
+
define double @select_nsz_nfabs_ugt(double %x) {
; CHECK-LABEL: @select_nsz_nfabs_ugt(
; CHECK-NEXT: [[TMP1:%.*]] = call nsz double @llvm.fabs.f64(double [[X:%.*]])
@@ -133,6 +194,18 @@ define double @select_nsz_nfabs_ugt(double %x) {
ret double %sel
}
+define double @select_nsz_nnan_nfabs_ugt(double %x) {
+; CHECK-LABEL: @select_nsz_nnan_nfabs_ugt(
+; CHECK-NEXT: [[TMP1:%.*]] = call nnan nsz double @llvm.fabs.f64(double [[X:%.*]])
+; CHECK-NEXT: [[SEL:%.*]] = fneg nnan nsz double [[TMP1]]
+; CHECK-NEXT: ret double [[SEL]]
+;
+ %cmp = fcmp ugt double %x, 0.000000e+00
+ %negX = fneg double %x
+ %sel = select nsz nnan i1 %cmp, double %negX, double %x
+ ret double %sel
+}
+
define double @select_nsz_nfabs_oge(double %x) {
; CHECK-LABEL: @select_nsz_nfabs_oge(
; CHECK-NEXT: [[TMP1:%.*]] = call nsz double @llvm.fabs.f64(double [[X:%.*]])
@@ -145,6 +218,18 @@ define double @select_nsz_nfabs_oge(double %x) {
ret double %sel
}
+define double @select_nsz_nnan_nfabs_oge(double %x) {
+; CHECK-LABEL: @select_nsz_nnan_nfabs_oge(
+; CHECK-NEXT: [[TMP1:%.*]] = call nnan nsz double @llvm.fabs.f64(double [[X:%.*]])
+; CHECK-NEXT: [[SEL:%.*]] = fneg nnan nsz double [[TMP1]]
+; CHECK-NEXT: ret double [[SEL]]
+;
+ %cmp = fcmp oge double %x, 0.000000e+00
+ %negX = fneg double %x
+ %sel = select nsz nnan i1 %cmp, double %negX, double %x
+ ret double %sel
+}
+
define double @select_nsz_nfabs_uge(double %x) {
; CHECK-LABEL: @select_nsz_nfabs_uge(
; CHECK-NEXT: [[TMP1:%.*]] = call nsz double @llvm.fabs.f64(double [[X:%.*]])
@@ -157,6 +242,18 @@ define double @select_nsz_nfabs_uge(double %x) {
ret double %sel
}
+define double @select_nsz_nnan_nfabs_uge(double %x) {
+; CHECK-LABEL: @select_nsz_nnan_nfabs_uge(
+; CHECK-NEXT: [[TMP1:%.*]] = call nnan nsz double @llvm.fabs.f64(double [[X:%.*]])
+; CHECK-NEXT: [[SEL:%.*]] = fneg nnan nsz double [[TMP1]]
+; CHECK-NEXT: ret double [[SEL]]
+;
+ %cmp = fcmp uge double %x, 0.000000e+00
+ %negX = fneg double %x
+ %sel = select nsz nnan i1 %cmp, double %negX, double %x
+ ret double %sel
+}
+
; (X < +/-0.0) ? X : (0.0 - X) --> (0.0 - fabs(X))
; One negative test with <=.
define double @select_noFMF_fsubfabs_le(double %x) {
diff --git a/llvm/test/Transforms/InstCombine/fneg.ll b/llvm/test/Transforms/InstCombine/fneg.ll
index 2c47b33175c2..00d8539029a2 100644
--- a/llvm/test/Transforms/InstCombine/fneg.ll
+++ b/llvm/test/Transforms/InstCombine/fneg.ll
@@ -742,8 +742,8 @@ define float @fnabs_1(float %a) {
ret float %fneg1
}
-define float @fnabs_2(float %a) {
-; CHECK-LABEL: @fnabs_2(
+define float @fnabs_2_nsz(float %a) {
+; CHECK-LABEL: @fnabs_2_nsz(
; CHECK-NEXT: [[TMP1:%.*]] = call nsz float @llvm.fabs.f32(float [[A:%.*]])
; CHECK-NEXT: [[FNEG1:%.*]] = fneg float [[TMP1]]
; CHECK-NEXT: ret float [[FNEG1]]
@@ -755,6 +755,19 @@ define float @fnabs_2(float %a) {
ret float %fneg1
}
+define float @fnabs_2_nsz_nnan(float %a) {
+; CHECK-LABEL: @fnabs_2_nsz_nnan(
+; CHECK-NEXT: [[TMP1:%.*]] = call nnan nsz float @llvm.fabs.f32(float [[A:%.*]])
+; CHECK-NEXT: [[FNEG1:%.*]] = fneg float [[TMP1]]
+; CHECK-NEXT: ret float [[FNEG1]]
+;
+ %fneg = fneg float %a
+ %cmp = fcmp olt float %a, %fneg
+ %sel = select nsz nnan i1 %cmp, float %fneg, float %a
+ %fneg1 = fneg float %sel
+ ret float %fneg1
+}
+
define float @select_fneg_both(float %x, float %y, i1 %b) {
; CHECK-LABEL: @select_fneg_both(
; CHECK-NEXT: [[S_V:%.*]] = select i1 [[B:%.*]], float [[X:%.*]], float [[Y:%.*]]
More information about the llvm-commits
mailing list