re PR middle-end/85878 (ICE in convert_mode_scalar, at expr.c:287)
authorJakub Jelinek <jakub@redhat.com>
Fri, 15 Jun 2018 20:36:38 +0000 (22:36 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 15 Jun 2018 20:36:38 +0000 (22:36 +0200)
PR middle-end/85878
* expr.c (expand_assignment): Remove now redundant COMPLEX_MODE_P
check from first store_expr, use to_mode instead of GET_MODE (to_rtx).
Only call store_expr for halves if the mode is the same.

* gfortran.fortran-torture/compile/pr85878.f90: New test.

From-SVN: r261659

gcc/ChangeLog
gcc/expr.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.fortran-torture/compile/pr85878.f90 [new file with mode: 0644]

index 9c7c574c762756bfa91c966b78be52e39b96bf5e..d3f322de367e1fdfd03d4d313a799e2b4e1f6219 100644 (file)
@@ -1,5 +1,10 @@
 2018-06-15  Jakub Jelinek  <jakub@redhat.com>
 
+       PR middle-end/85878
+       * expr.c (expand_assignment): Remove now redundant COMPLEX_MODE_P
+       check from first store_expr, use to_mode instead of GET_MODE (to_rtx).
+       Only call store_expr for halves if the mode is the same.
+
        PR middle-end/86123
        * match.pd ((X / Y) == 0 -> X < Y): Don't transform complex divisions.
        Fix up comment formatting.
index d6b3eb4530a3dc08735a0a202978db9414edad2e..793b283842aa6b76e8eba6351861e0ce64d69344 100644 (file)
@@ -5150,12 +5150,12 @@ expand_assignment (tree to, tree from, bool nontemporal)
          gcc_checking_assert (COMPLEX_MODE_P (to_mode));
          poly_int64 mode_bitsize = GET_MODE_BITSIZE (to_mode);
          unsigned short inner_bitsize = GET_MODE_UNIT_BITSIZE (to_mode);
-         if (TYPE_MODE (TREE_TYPE (from)) == GET_MODE (to_rtx)
-             && COMPLEX_MODE_P (GET_MODE (to_rtx))
+         if (TYPE_MODE (TREE_TYPE (from)) == to_mode
              && known_eq (bitpos, 0)
              && known_eq (bitsize, mode_bitsize))
            result = store_expr (from, to_rtx, false, nontemporal, reversep);
-         else if (known_eq (bitsize, inner_bitsize)
+         else if (TYPE_MODE (TREE_TYPE (from)) == GET_MODE_INNER (to_mode)
+                  && known_eq (bitsize, inner_bitsize)
                   && (known_eq (bitpos, 0)
                       || known_eq (bitpos, inner_bitsize)))
            result = store_expr (from, XEXP (to_rtx, maybe_ne (bitpos, 0)),
index 045c4cd68493e82ac18b2d3d29210cb78776c94b..89b05676f50c0035806b4d2edd24cae430bc00f1 100644 (file)
@@ -1,5 +1,8 @@
 2018-06-15  Jakub Jelinek  <jakub@redhat.com>
 
+       PR middle-end/85878
+       * gfortran.fortran-torture/compile/pr85878.f90: New test.
+
        PR middle-end/86123
        * gcc.c-torture/compile/pr86123.c: New test.
 
diff --git a/gcc/testsuite/gfortran.fortran-torture/compile/pr85878.f90 b/gcc/testsuite/gfortran.fortran-torture/compile/pr85878.f90
new file mode 100644 (file)
index 0000000..e52e95f
--- /dev/null
@@ -0,0 +1,8 @@
+! PR middle-end/85878
+
+program pr85878
+  real :: a
+  complex :: c = (2.0, 3.0)
+  print *, c
+  print *, transfer (a, c)
+end