]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR target/69148 (ICE (floating point exception) on s390x-linux-gnu)
authorVladimir Makarov <vmakarov@redhat.com>
Wed, 10 Feb 2016 18:01:40 +0000 (18:01 +0000)
committerVladimir Makarov <vmakarov@gcc.gnu.org>
Wed, 10 Feb 2016 18:01:40 +0000 (18:01 +0000)
2016-02-10  Vladimir Makarov  <vmakarov@redhat.com>

PR target/69148
* lra-constraints.c (curr_insn_transform): Find in/out operands
for secondary memory moves.  Update dups.

2016-02-10  Vladimir Makarov  <vmakarov@redhat.com>

PR target/69468
* gcc.target/s390/pr69148.c: New.

From-SVN: r233283

gcc/ChangeLog
gcc/lra-constraints.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/s390/pr69148.c [new file with mode: 0644]

index ac3dbbc8b1da145a52c6f45df25f7f3c99226201..b4495d868c2f02471ba3e1dbf28fa6e137e2ff63 100644 (file)
@@ -1,3 +1,9 @@
+2016-02-10  Vladimir Makarov  <vmakarov@redhat.com>
+
+       PR target/69148
+       * lra-constraints.c (curr_insn_transform): Find in/out operands
+       for secondary memory moves.  Update dups.
+
 2016-02-10  Yuri Rumyantsev  <ysrumyan@gmail.com>
 
        PR tree-optimization/69652
index 08cf0aa6c4208bb60ba5071bad1255d587f1cb4a..751ec3ef28aa243f33a488ec466c45464eb1c707 100644 (file)
@@ -3559,14 +3559,26 @@ curr_insn_transform (bool check_only_p)
 
   if (use_sec_mem_p)
     {
+      int in = -1, out = -1;
       rtx new_reg, src, dest, rld;
       machine_mode sec_mode, rld_mode;
 
-      lra_assert (sec_mem_p);
-      lra_assert (curr_static_id->operand[0].type == OP_OUT
-                 && curr_static_id->operand[1].type == OP_IN);
-      dest = *curr_id->operand_loc[0];
-      src = *curr_id->operand_loc[1];
+      lra_assert (curr_insn_set != NULL_RTX && sec_mem_p);
+      dest = SET_DEST (curr_insn_set);
+      src = SET_SRC (curr_insn_set);
+      for (i = 0; i < n_operands; i++)
+       if (*curr_id->operand_loc[i] == dest)
+         out = i;
+       else if (*curr_id->operand_loc[i] == src)
+         in = i;
+      for (i = 0; i < curr_static_id->n_dups; i++)
+       if (out < 0 && *curr_id->dup_loc[i] == dest)
+         out = curr_static_id->dup_num[i];
+       else if (in < 0 && *curr_id->dup_loc[i] == src)
+         in = curr_static_id->dup_num[i];
+      lra_assert (out >= 0 && in >= 0
+                 && curr_static_id->operand[out].type == OP_OUT
+                 && curr_static_id->operand[in].type == OP_IN);
       rld = (GET_MODE_SIZE (GET_MODE (dest)) <= GET_MODE_SIZE (GET_MODE (src))
             ? dest : src);
       rld_mode = GET_MODE (rld);
@@ -3599,14 +3611,16 @@ curr_insn_transform (bool check_only_p)
        }
       else if (dest == rld)
         {
-         *curr_id->operand_loc[0] = new_reg;
+         *curr_id->operand_loc[out] = new_reg;
+         lra_update_dup (curr_id, out);
          after = emit_spill_move (false, new_reg, dest);
          lra_process_new_insns (curr_insn, NULL, after,
                                 "Inserting the sec. move");
        }
       else
        {
-         *curr_id->operand_loc[1] = new_reg;
+         *curr_id->operand_loc[in] = new_reg;
+         lra_update_dup (curr_id, in);
          /* See comments above.  */
          push_to_sequence (before);
          before = emit_spill_move (true, new_reg, src);
index 6eb0aaa74eb02777de643147d7314cd808ac6177..090b3dd27783e80aa79a6e38d265b7d245c600e2 100644 (file)
@@ -1,3 +1,8 @@
+2016-02-10  Vladimir Makarov  <vmakarov@redhat.com>
+
+       PR target/69468
+       * gcc.target/s390/pr69148.c: New.
+
 2016-02-10  Yuri Rumyantsev  <ysrumyan@gmail.com>
 
        PR tree-optimization/69652
diff --git a/gcc/testsuite/gcc.target/s390/pr69148.c b/gcc/testsuite/gcc.target/s390/pr69148.c
new file mode 100644 (file)
index 0000000..5570b52
--- /dev/null
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-options "-O -march=z196 -m64 -w" } */
+union U { int r; float f; };
+struct A {
+  int a;
+    union U b[64];
+    };
+    double foo (double);
+
+void
+bar (struct A *z, int x)
+{
+  union U y;
+  y.f = foo (z->b[x].f);
+  z->a = y.r ? 4 : y.r;
+}