diff options
author | Jakub Jelinek <jakub@redhat.com> | 2017-03-21 15:49:51 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2017-03-21 15:49:51 +0100 |
commit | 85106b8757d46f80a5993fc75948a82ce16c1f74 (patch) | |
tree | 1a81dd0d7abfba195d6e9f2a5236c6a0ae6f0f7c /gcc | |
parent | 8c0f9dab864878286b6fd16e26d62be4742cd7d6 (diff) | |
download | gcc-85106b8757d46f80a5993fc75948a82ce16c1f74.zip gcc-85106b8757d46f80a5993fc75948a82ce16c1f74.tar.gz gcc-85106b8757d46f80a5993fc75948a82ce16c1f74.tar.bz2 |
re PR target/80125 (r246297 causes segfault in reg_used_between_p())
PR target/80125
* combine.c (can_combine_p): Revert the 2017-03-20 change, only
check reg_used_between_p between insn and one of succ or succ2
depending on if succ is artificial insn not inserted into insn
stream.
* gcc.target/powerpc/pr80125.c: New test.
Co-Authored-By: Segher Boessenkool <segher@kernel.crashing.org>
From-SVN: r246323
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/combine.c | 15 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/powerpc/pr80125.c | 23 |
4 files changed, 47 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a7a13f1..03b2a41 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2017-03-21 Jakub Jelinek <jakub@redhat.com> + Segher Boessenkool <segher@kernel.crashing.org> + + PR target/80125 + * combine.c (can_combine_p): Revert the 2017-03-20 change, only + check reg_used_between_p between insn and one of succ or succ2 + depending on if succ is artificial insn not inserted into insn + stream. + 2017-03-21 Martin Liska <mliska@suse.cz> PR gcov-profile/80081 diff --git a/gcc/combine.c b/gcc/combine.c index 17258f0..c118aa2 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -1954,15 +1954,20 @@ can_combine_p (rtx_insn *insn, rtx_insn *i3, rtx_insn *pred ATTRIBUTE_UNUSED, /* Don't substitute into a non-local goto, this confuses CFG. */ || (JUMP_P (i3) && find_reg_note (i3, REG_NON_LOCAL_GOTO, NULL_RTX)) /* Make sure that DEST is not used after INSN but before SUCC, or - between SUCC and SUCC2. */ - || (succ && reg_used_between_p (dest, insn, succ)) - || (succ2 && reg_used_between_p (dest, succ, succ2)) - /* Make sure that DEST is not used after SUCC but before I3. */ + after SUCC and before SUCC2, or after SUCC2 but before I3. */ || (!all_adjacent && ((succ2 && (reg_used_between_p (dest, succ2, i3) || reg_used_between_p (dest, succ, succ2))) - || (!succ2 && succ && reg_used_between_p (dest, succ, i3)))) + || (!succ2 && succ && reg_used_between_p (dest, succ, i3)) + || (succ + /* SUCC and SUCC2 can be split halves from a PARALLEL; in + that case SUCC is not in the insn stream, so use SUCC2 + instead for this test. */ + && reg_used_between_p (dest, insn, + succ2 + && INSN_UID (succ) == INSN_UID (succ2) + ? succ2 : succ)))) /* Make sure that the value that is to be substituted for the register does not use any registers whose values alter in between. However, If the insns are adjacent, a use can't cross a set even though we diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c2be77a..6a87efc 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-03-21 Jakub Jelinek <jakub@redhat.com> + + PR target/80125 + * gcc.target/powerpc/pr80125.c: New test. + 2017-03-21 Bill Schmidt <wschmidt@linux.vnet.ibm.com> Richard Biener <rguenther@suse.de> diff --git a/gcc/testsuite/gcc.target/powerpc/pr80125.c b/gcc/testsuite/gcc.target/powerpc/pr80125.c new file mode 100644 index 0000000..494a6e6 --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/pr80125.c @@ -0,0 +1,23 @@ +/* PR target/80125 */ +/* { dg-do compile } */ +/* { dg-options "-O2 -maltivec" } */ + +#include <altivec.h> + +int a[1]; + +void +foo () +{ + vector int b, e, f, g, h, j, n; + vector unsigned c, d; + f = vec_sums (h, b); + vector int i = vec_mergel (f, g); + vector int k = vec_mergel (i, j); + vector int l = vec_sl (k, c); + vector int m = vec_sl (l, d); + vector char o; + vector int p = vec_perm (m, n, o); + e = vec_sra (p, c); + vec_st (e, 0, a); +} |