Skip to content

Commit

Permalink
rs6000: Check -+0 and NaN for smax/smin generation
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
Jiufu Guo committed Mar 11, 2020
1 parent 76743c8 commit 37e0df8
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 1 deletion.
6 changes: 6 additions & 0 deletions gcc/ChangeLog
Original file line number Diff line number Diff line change
@@ -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
Expand Down
6 changes: 5 additions & 1 deletion gcc/config/rs6000/rs6000.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
5 changes: 5 additions & 0 deletions gcc/testsuite/ChangeLog
Original file line number Diff line number Diff line change
@@ -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
Expand Down
17 changes: 17 additions & 0 deletions gcc/testsuite/gcc.target/powerpc/p9-minmax-3.c
Original file line number Diff line number Diff line change
@@ -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;
}

0 comments on commit 37e0df8

Please sign in to comment.