From: Jakub Jelinek Date: Fri, 22 Jun 2018 21:30:06 +0000 (+0200) Subject: backport: re PR middle-end/85878 (ICE in convert_mode_scalar, at expr.c:287) X-Git-Tag: releases/gcc-7.4.0~321 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3765c86f5c5231a4285fdf130beed245778fe99f;p=thirdparty%2Fgcc.git backport: re PR middle-end/85878 (ICE in convert_mode_scalar, at expr.c:287) Backported from mainline 2018-06-15 Jakub Jelinek PR middle-end/85878 * expr.c (expand_assignment): Only call store_expr for halves if the mode is the same. * gfortran.fortran-torture/compile/pr85878.f90: New test. From-SVN: r261968 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 739717cea2a0..d34abe05caf9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,6 +1,12 @@ 2018-06-22 Jakub Jelinek Backported from mainline + 2018-06-15 Jakub Jelinek + + PR middle-end/85878 + * expr.c (expand_assignment): Only call store_expr for halves if the + mode is the same. + 2018-06-14 Jakub Jelinek PR target/85945 diff --git a/gcc/expr.c b/gcc/expr.c index 9fe4ec91c1ce..ee545ce071f0 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -5109,7 +5109,10 @@ expand_assignment (tree to, tree from, bool nontemporal) && bitpos == 0 && bitsize == mode_bitsize) result = store_expr (from, to_rtx, false, nontemporal, reversep); - else if (bitsize == mode_bitsize / 2 + else if (COMPLEX_MODE_P (GET_MODE (to_rtx)) + && (TYPE_MODE (TREE_TYPE (from)) + == GET_MODE_INNER (GET_MODE (to_rtx))) + && bitsize == mode_bitsize / 2 && (bitpos == 0 || bitpos == mode_bitsize / 2)) result = store_expr (from, XEXP (to_rtx, bitpos != 0), false, nontemporal, reversep); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f8f71ea5da00..ea860f4b1f25 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -6,6 +6,11 @@ PR c++/85662 * g++.dg/ext/offsetof3.C: New test. + 2018-06-15 Jakub Jelinek + + PR middle-end/85878 + * gfortran.fortran-torture/compile/pr85878.f90: New test. + 2018-06-14 Jakub Jelinek PR target/85945 diff --git a/gcc/testsuite/gfortran.fortran-torture/compile/pr85878.f90 b/gcc/testsuite/gfortran.fortran-torture/compile/pr85878.f90 new file mode 100644 index 000000000000..e52e95faa007 --- /dev/null +++ b/gcc/testsuite/gfortran.fortran-torture/compile/pr85878.f90 @@ -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