diff options
author | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2018-04-23 20:19:39 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2018-04-23 20:19:39 +0000 |
commit | a689171e506f55ab8fb336af3b816272f4209af0 (patch) | |
tree | 9f62d5a18312e9395a702a2f51c84dabac0256ef | |
parent | 53de8a7e13cae771fdcda36abee4787bd6575ed7 (diff) | |
download | gcc-a689171e506f55ab8fb336af3b816272f4209af0.zip gcc-a689171e506f55ab8fb336af3b816272f4209af0.tar.gz gcc-a689171e506f55ab8fb336af3b816272f4209af0.tar.bz2 |
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
-rw-r--r-- | gcc/ChangeLog | 14 | ||||
-rw-r--r-- | gcc/expr.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/torture/pr85496.C | 18 |
4 files changed, 37 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 135ac88..833601a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,9 +1,15 @@ -2018-04-23 Andrey Belevantsev <abel@ispras.ru> +2018-04-23 Eric Botcazou <ebotcazou@adacore.com> + + 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 <abel@ispras.ru> - * 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 <claziss@synopsys.com> @@ -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 0b34bec..b1dfe4b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,7 +1,11 @@ +2018-04-23 Eric Botcazou <ebotcazou@adacore.com> + + * g++.dg/torture/pr85496.C: New test. + 2018-04-23 Andrey Belevantsev <abel@ispras.ru> - 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 <msebor@redhat.com> diff --git a/gcc/testsuite/g++.dg/torture/pr85496.C b/gcc/testsuite/g++.dg/torture/pr85496.C new file mode 100644 index 0000000..3f504a3 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr85496.C @@ -0,0 +1,18 @@ +// PR middle-end/85496 +// Reported by Marek Polacek <mpolacek@gcc.gnu.org> + +template <typename> class complex; +template <typename _Tp> complex<_Tp> operator*(complex<_Tp>, complex<_Tp>); +template <> struct complex<float> { _Complex float _M_value; }; +class A { + complex<float> _f0, _f1; + +public: + complex<float> &m_fn1() { return _f1; } +}; +complex<float> a; +void cos() { + A b; + complex<float> c; + b.m_fn1() = c * a; +} |