diff options
author | Andreas Krebbel <krebbel@linux.vnet.ibm.com> | 2015-06-24 06:50:53 +0000 |
---|---|---|
committer | Andreas Krebbel <krebbel@gcc.gnu.org> | 2015-06-24 06:50:53 +0000 |
commit | f303100baaf48a54f07e9abd25ac37ebc95b641e (patch) | |
tree | b3c16b9d1158f623ce992acd80383364aefec238 /gcc | |
parent | af77d1df021462d093418edfc130ed37922f4994 (diff) | |
download | gcc-f303100baaf48a54f07e9abd25ac37ebc95b641e.zip gcc-f303100baaf48a54f07e9abd25ac37ebc95b641e.tar.gz gcc-f303100baaf48a54f07e9abd25ac37ebc95b641e.tar.bz2 |
PR66306: Fix match_dups on swapped operands.
2015-06-24 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
PR rtl-optimization/66306
* reload.c (find_reloads): Swap the match_dup info for
commutative operands.
2015-06-24 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
PR rtl-optimization/66306
* gcc.target/s390/pr66306.c: New test.
From-SVN: r224875
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/reload.c | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/s390/pr66306.c | 26 |
4 files changed, 43 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index be625c5..d1f82b2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,11 @@ 2015-06-24 Andreas Krebbel <krebbel@linux.vnet.ibm.com> + PR rtl-optimization/66306 + * reload.c (find_reloads): Swap the match_dup info for + commutative operands. + +2015-06-24 Andreas Krebbel <krebbel@linux.vnet.ibm.com> + * config/s390/vx-builtins.md ("vec_scatter_element<mode>_<non_vec_int>") ("vec_scatter_element<V_HW_64:mode>_SI"): Replace gf mode diff --git a/gcc/reload.c b/gcc/reload.c index 03354de..1dc04bf 100644 --- a/gcc/reload.c +++ b/gcc/reload.c @@ -3872,6 +3872,12 @@ find_reloads (rtx_insn *insn, int replace, int ind_levels, int live_known, std::swap (*recog_data.operand_loc[commutative], *recog_data.operand_loc[commutative + 1]); + for (i = 0; i < recog_data.n_dups; i++) + if (recog_data.dup_num[i] == commutative + || recog_data.dup_num[i] == commutative + 1) + *recog_data.dup_loc[i] + = recog_data.operand[(int) recog_data.dup_num[i]]; + for (i = 0; i < n_reloads; i++) { if (rld[i].opnum == commutative) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d143157..8e28edc 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2015-06-24 Andreas Krebbel <krebbel@linux.vnet.ibm.com> + PR rtl-optimization/66306 + * gcc.target/s390/pr66306.c: New test. + +2015-06-24 Andreas Krebbel <krebbel@linux.vnet.ibm.com> + * gcc.target/s390/vector/vec-abi-1.c: Add gnu attribute check. * gcc.target/s390/vector/vec-abi-attr-1.c: New test. * gcc.target/s390/vector/vec-abi-attr-2.c: New test. diff --git a/gcc/testsuite/gcc.target/s390/pr66306.c b/gcc/testsuite/gcc.target/s390/pr66306.c new file mode 100644 index 0000000..73903cb --- /dev/null +++ b/gcc/testsuite/gcc.target/s390/pr66306.c @@ -0,0 +1,26 @@ +/* This caused an ICE on s390x due to a reload bug handling + commutative constraints. */ + +/* { dg-do compile } */ +/* { dg-options "-O1" } */ + +struct line_map +{ + unsigned start_location; + unsigned ordinary; +}; +unsigned +linemap_resolve_location (struct line_map **loc_map); + +unsigned +linemap_position_for_loc_and_offset (unsigned h, unsigned loc) +{ + struct line_map *map = 0; + linemap_resolve_location (&map); + + if (map->ordinary <= loc + map->start_location + map->ordinary) + __builtin_abort (); + + if (h >= loc + map->start_location) + __builtin_abort (); +} |