re PR target/90187 (ICE in extract_insn, at recog.c:2304 x86_64)
authorJakub Jelinek <jakub@redhat.com>
Wed, 24 Apr 2019 09:27:14 +0000 (11:27 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 24 Apr 2019 09:27:14 +0000 (11:27 +0200)
PR target/90187
* config/i386/i386.c (ix86_expand_sse_fp_minmax): Force if_true into
a register if both if_true and if_false are MEMs.

* g++.target/i386/pr90187.C: New test.

From-SVN: r270537

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.target/i386/pr90187.C [new file with mode: 0644]

index e098504f0816814fc32d91f34fc9c88042320463..ba06d65583cb975d57a3cfc25b8ad7eef634bad0 100644 (file)
@@ -1,5 +1,9 @@
 2019-04-24  Jakub Jelinek  <jakub@redhat.com>
 
+       PR target/90187
+       * config/i386/i386.c (ix86_expand_sse_fp_minmax): Force if_true into
+       a register if both if_true and if_false are MEMs.
+
        PR tree-optimization/90208
        * tree-cfg.c (remove_bb): Move forced labels from removed bbs
        after labels of new_bb, not before them.
index 498a35d8aea34d9b62c686595d2ddb888d78bd80..191f570455b8627cc6a712759bb4ce7cba2d5b18 100644 (file)
@@ -23712,6 +23712,8 @@ ix86_expand_sse_fp_minmax (rtx dest, enum rtx_code code, rtx cmp_op0,
   else
     {
       code = is_min ? SMIN : SMAX;
+      if (MEM_P (if_true) && MEM_P (if_false))
+       if_true = force_reg (mode, if_true);
       tmp = gen_rtx_fmt_ee (code, mode, if_true, if_false);
     }
 
index 19972ed55c33e034643af3c60be24a684028df63..42e75166b4a73c9cd453c056c6773bf1f1fe559c 100644 (file)
@@ -1,3 +1,8 @@
+2019-04-24  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/90187
+       * g++.target/i386/pr90187.C: New test.
+
 2019-04-24  Iain Buclaw  <ibuclaw@gdcproject.org>
 
        * gdc.test/README.gcc: New file.
diff --git a/gcc/testsuite/g++.target/i386/pr90187.C b/gcc/testsuite/g++.target/i386/pr90187.C
new file mode 100644 (file)
index 0000000..ed9e9fe
--- /dev/null
@@ -0,0 +1,15 @@
+// PR target/90187
+// { dg-do compile }
+// { dg-options "-Ofast -ffloat-store" }
+
+double a[64];
+double *foo (void);
+
+void
+bar (int x, const double *y)
+{
+  int i;
+  for (i = 0; i < x; i++)
+    if (y[i] < a[i])
+      a[i] = y[i];
+}