From a689171e506f55ab8fb336af3b816272f4209af0 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Mon, 23 Apr 2018 20:19:39 +0000 Subject: [PATCH] re PR middle-end/85496 (internal compiler error: in emit_move_insn, at expr.c:3722) PR middle-end/85496 * expr.c (store_field): In the bitfield case, if the value comes from a function call and is returned in registers by means of a PARALLEL, do not change the mode of the temporary unless BLKmode and VOIDmode. From-SVN: r259574 --- gcc/ChangeLog | 14 ++++++++++---- gcc/expr.c | 5 +++-- gcc/testsuite/ChangeLog | 8 ++++++-- gcc/testsuite/g++.dg/torture/pr85496.C | 18 ++++++++++++++++++ 4 files changed, 37 insertions(+), 8 deletions(-) create mode 100644 gcc/testsuite/g++.dg/torture/pr85496.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 135ac880933..833601a038e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,9 +1,15 @@ -2018-04-23 Andrey Belevantsev +2018-04-23 Eric Botcazou + + PR middle-end/85496 + * expr.c (store_field): In the bitfield case, if the value comes from + a function call and is returned in registers by means of a PARALLEL, + do not change the mode of the temporary unless BLKmode and VOIDmode. - PR rtl-optimization/85423 +2018-04-23 Andrey Belevantsev - * sel-sched-ir.c (has_dependence_note_mem_dep): Only discard - dependencies to debug insns when the previous insn is non-debug. + PR rtl-optimization/85423 + * sel-sched-ir.c (has_dependence_note_mem_dep): Only discard + dependencies to debug insns when the previous insn is non-debug. 2018-04-23 Claudiu Zissulescu diff --git a/gcc/expr.c b/gcc/expr.c index cf5b63172f1..c9e6bf228a4 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -6989,8 +6989,9 @@ store_field (rtx target, poly_int64 bitsize, poly_int64 bitpos, if (GET_CODE (temp) == PARALLEL) { HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (exp)); - scalar_int_mode temp_mode - = smallest_int_mode_for_size (size * BITS_PER_UNIT); + machine_mode temp_mode = GET_MODE (temp); + if (temp_mode == BLKmode || temp_mode == VOIDmode) + temp_mode = smallest_int_mode_for_size (size * BITS_PER_UNIT); rtx temp_target = gen_reg_rtx (temp_mode); emit_group_store (temp_target, temp, TREE_TYPE (exp), size); temp = temp_target; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0b34bec128f..b1dfe4bdb38 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,7 +1,11 @@ +2018-04-23 Eric Botcazou + + * g++.dg/torture/pr85496.C: New test. + 2018-04-23 Andrey Belevantsev - PR rtl-optimization/85423 - * gcc.dg/pr85423.c: New test. + PR rtl-optimization/85423 + * gcc.dg/pr85423.c: New test. 2018-04-20 Martin Sebor diff --git a/gcc/testsuite/g++.dg/torture/pr85496.C b/gcc/testsuite/g++.dg/torture/pr85496.C new file mode 100644 index 00000000000..3f504a37791 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr85496.C @@ -0,0 +1,18 @@ +// PR middle-end/85496 +// Reported by Marek Polacek + +template class complex; +template complex<_Tp> operator*(complex<_Tp>, complex<_Tp>); +template <> struct complex { _Complex float _M_value; }; +class A { + complex _f0, _f1; + +public: + complex &m_fn1() { return _f1; } +}; +complex a; +void cos() { + A b; + complex c; + b.m_fn1() = c * a; +} -- 2.30.2