diff options
author | Kirill Yukhin <kirill.yukhin@intel.com> | 2013-11-14 08:33:21 +0000 |
---|---|---|
committer | Kirill Yukhin <kyukhin@gcc.gnu.org> | 2013-11-14 08:33:21 +0000 |
commit | 2430d1e2638aa4ae7576460ed87c2441009c8600 (patch) | |
tree | 4b41cf8bc8c0b20f74a3ad3a2bb814621d644b85 | |
parent | d43d39ab6d313bd05391279a87384b1e66a0dd02 (diff) | |
download | gcc-2430d1e2638aa4ae7576460ed87c2441009c8600.zip gcc-2430d1e2638aa4ae7576460ed87c2441009c8600.tar.gz gcc-2430d1e2638aa4ae7576460ed87c2441009c8600.tar.bz2 |
re PR target/57491 ([ia64] internal compiler error: in ia64_split_tmode -O2, quadmath)
PR target/57491
* config/ia64/ia64.c (ia64_split_tmode_move): Relax `dead'
flag setting.
From-SVN: r204777
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/ia64/ia64.c | 11 |
2 files changed, 15 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 598268e..1a591cb 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2013-11-14 Kirill Yukhin <kirill.yukhin@intel.com> + + PR target/57491 + * config/ia64/ia64.c (ia64_split_tmode_move): Relax `dead' + flag setting. + 2013-11-14 Jakub Jelinek <jakub@redhat.com> Uros Bizjak <ubizjak@gmail.com> diff --git a/gcc/config/ia64/ia64.c b/gcc/config/ia64/ia64.c index 2b33187..a28575c 100644 --- a/gcc/config/ia64/ia64.c +++ b/gcc/config/ia64/ia64.c @@ -1529,12 +1529,19 @@ ia64_split_tmode_move (rtx operands[]) && reg_overlap_mentioned_p (operands[0], operands[1])) { rtx base = XEXP (operands[1], 0); + rtx first_write = gen_rtx_REG (DImode, REGNO (operands[0])); while (GET_CODE (base) != REG) base = XEXP (base, 0); if (REGNO (base) == REGNO (operands[0])) - reversed = true; - dead = true; + { + reversed = true; + first_write = gen_rtx_REG (DImode, REGNO (operands[0]) + 1); + } + + if (GET_CODE (operands[0]) == REG + && reg_overlap_mentioned_p (first_write, operands[1])) + dead = true; } /* Another reason to do the moves in reversed order is if the first element of the target register pair is also the second element of |