rs6000: Check -+0 and NaN for smax/smin generation
authorJiufu Guo <guojiufu@linux.ibm.com>
Tue, 10 Mar 2020 05:51:57 +0000 (13:51 +0800)
committerJiufu Guo <guojiufu@linux.ibm.com>
Wed, 11 Mar 2020 01:34:39 +0000 (09:34 +0800)
PR93709 mentioned regressions on maxlocval_4.f90 and minlocval_f.f90 which
relates to max of '-inf' and 'nan'. This regression occur on P9 because
P9 new instruction 'xsmaxcdp' is generated.
And for C code `a < b ? b : a` is also generated as `xsmaxcdp` under -O2
for P9. While this instruction behavior more like C/C++ semantic (a>b?a:b).

This generates prevents 'xsmaxcdp' to be generated for those cases.
'xsmincdp' also is handled in patch.

gcc/
2020-03-10  Jiufu Guo  <guojiufu@linux.ibm.com>

PR target/93709
* gcc/config/rs6000/rs6000.c (rs6000_emit_p9_fp_minmax): Check
NAN and SIGNED_ZEROR for smax/smin.

gcc/testsuite
2020-03-10  Jiufu Guo  <guojiufu@linux.ibm.com>

PR target/93709
* gcc.target/powerpc/p9-minmax-3.c: New test.

gcc/ChangeLog
gcc/config/rs6000/rs6000.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/powerpc/p9-minmax-3.c [new file with mode: 0644]

index c5256616408b7569b2ec85ae467816eda580aaa2..5b67b79745f92733d6d97eae63ad00415bdf87db 100644 (file)
@@ -1,3 +1,9 @@
+2020-03-10  Jiufu Guo  <guojiufu@linux.ibm.com>
+
+       PR target/93709
+       * gcc/config/rs6000/rs6000.c (rs6000_emit_p9_fp_minmax): Check
+       NAN and SIGNED_ZEROR for smax/smin.
+
 2020-03-10  Will Schmidt  <will_schmidt@vnet.ibm.com>
 
        PR target/90763
index 848a4ef451e49b1463732667cfbbea1af1751a4c..46b7dec2abd4b9629061a02217df6cb2ef014ea6 100644 (file)
@@ -14831,7 +14831,11 @@ rs6000_emit_p9_fp_minmax (rtx dest, rtx op, rtx true_cond, rtx false_cond)
   if (rtx_equal_p (op0, true_cond) && rtx_equal_p (op1, false_cond))
     ;
 
-  else if (rtx_equal_p (op1, true_cond) && rtx_equal_p (op0, false_cond))
+  /* Only when NaNs and signed-zeros are not in effect, smax could be
+     used for `op0 < op1 ? op1 : op0`, and smin could be used for
+     `op0 > op1 ? op1 : op0`.  */
+  else if (rtx_equal_p (op1, true_cond) && rtx_equal_p (op0, false_cond)
+          && !HONOR_NANS (compare_mode) && !HONOR_SIGNED_ZEROS (compare_mode))
     max_p = !max_p;
 
   else
index da525a38cf1efb5b4027541f248325000569972d..c76d891a3e64c5d191810ad4353afcbb151f1dd6 100644 (file)
@@ -1,3 +1,8 @@
+2020-03-10  Jiufu Guo  <guojiufu@linux.ibm.com>
+
+       PR target/93709
+       * gcc.target/powerpc/p9-minmax-3.c: New test.
+
 2020-03-10  Will Schmidt  <will_schmidt@vnet.ibm.com>
 
        PR target/90763
diff --git a/gcc/testsuite/gcc.target/powerpc/p9-minmax-3.c b/gcc/testsuite/gcc.target/powerpc/p9-minmax-3.c
new file mode 100644 (file)
index 0000000..141603e
--- /dev/null
@@ -0,0 +1,17 @@
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-options "-mdejagnu-cpu=power9 -O2 -mpower9-minmax" } */
+/* { dg-final { scan-assembler-not "xsmaxcdp"   } } */
+/* { dg-final { scan-assembler-not "xsmincdp"   } } */
+
+double
+dbl_max1 (double a, double b)
+{
+  return a < b ? b : a;
+}
+
+double
+dbl_min1 (double a, double b)
+{
+  return a > b ? b : a;
+}