[gcc(refs/vendors/redhat/heads/gcc-10-branch)] powerpc: Fix ICE with fp conditional move (PR target/93073)

Jakub Jelinek jakub@gcc.gnu.org
Tue Jan 21 13:08:00 GMT 2020


https://gcc.gnu.org/g:d35f75674ff107c9f78a4ef9a09721b14a042705

commit d35f75674ff107c9f78a4ef9a09721b14a042705
Author: Jakub Jelinek <jakub@redhat.com>
Date:   Tue Jan 21 09:17:27 2020 +0100

    powerpc: Fix ICE with fp conditional move (PR target/93073)
    
    The following testcase ICEs, because for TFmode the particular subtraction
    pattern (*subtf3) is not enabled with the given options.  Using
    expand_simple_binop instead of emitting the subtraction by hand just moves
    the ICE one insn later, NEG of ABS is not then recognized, etc., but
    ultimately the problem is that when rs6000_emit_cmove is called for floating
    point operand mode (and earlier condition ensures that in that case
    compare_mode is also floating point), the expander makes sure the
    operand mode is SFDF, but for the comparison mode nothing checks it, yet
    there is just one *fsel* pattern with 2 separate SFDF iterators.
    
    The following patch fixes it by giving up if compare_mode is not SFmode or
    DFmode.
    
    2020-01-21  Jakub Jelinek  <jakub@redhat.com>
    
    	PR target/93073
    	* config/rs6000/rs6000.c (rs6000_emit_cmove): If using fsel, punt for
    	compare_mode other than SFmode or DFmode.
    
    	* gcc.target/powerpc/pr93073.c: New test.

Diff:
---
 gcc/ChangeLog                              |  6 ++++++
 gcc/config/rs6000/rs6000.c                 |  5 +++++
 gcc/testsuite/ChangeLog                    |  5 +++++
 gcc/testsuite/gcc.target/powerpc/pr93073.c | 16 ++++++++++++++++
 4 files changed, 32 insertions(+)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 7193394..eff1c2a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2020-01-21  Jakub Jelinek  <jakub@redhat.com>
+
+	PR target/93073
+	* config/rs6000/rs6000.c (rs6000_emit_cmove): If using fsel, punt for
+	compare_mode other than SFmode or DFmode.
+
 2020-01-21  Kito Cheng  <kito.cheng@sifive.com>
 
 	PR target/93304
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index e5619ab..3e90859 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -14978,6 +14978,11 @@ rs6000_emit_cmove (rtx dest, rtx op, rtx true_cond, rtx false_cond)
 
   /* At this point we know we can use fsel.  */
 
+  /* Don't allow compare_mode other than SFmode or DFmode, for others there
+     is no fsel instruction.  */
+  if (compare_mode != SFmode && compare_mode != DFmode)
+    return 0;
+
   /* Reduce the comparison to a comparison against zero.  */
   if (! is_against_zero)
     {
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index f8a06bc..a29cae9 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2020-01-21  Jakub Jelinek  <jakub@redhat.com>
+
+	PR target/93073
+	* gcc.target/powerpc/pr93073.c: New test.
+
 2020-01-20  Bin Cheng  <bin.cheng@linux.alibaba.com>
 
 	* g++.dg/coroutines/co-return-warning-1.C: New test.
diff --git a/gcc/testsuite/gcc.target/powerpc/pr93073.c b/gcc/testsuite/gcc.target/powerpc/pr93073.c
new file mode 100644
index 0000000..6a0a473
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/pr93073.c
@@ -0,0 +1,16 @@
+/* PR target/93073 */
+/* { dg-do compile { target powerpc_vsx_ok } } */
+/* { dg-options "-mvsx -O1 -ffinite-math-only -fno-trapping-math" } */
+
+void bar (void);
+
+void
+foo (long double x, double y, double z)
+{
+  for (;;)
+    {
+      double a = x > 0.0 ? y : z;
+      if (a == 0.0)
+	bar ();
+    }
+}



More information about the Gcc-cvs mailing list