diff options
author | Bill Schmidt <wschmidt@linux.vnet.ibm.com> | 2016-12-11 23:37:17 +0000 |
---|---|---|
committer | William Schmidt <wschmidt@gcc.gnu.org> | 2016-12-11 23:37:17 +0000 |
commit | 3113e92dc3dc525af2b1b1d159ea5fed1828bd3b (patch) | |
tree | bbac96848be659bfaeca6f4fd30f6b21a102709c /gcc | |
parent | 74edc8a9b9f5be8243a3cda70f5eac86fd42cf3c (diff) | |
download | gcc-3113e92dc3dc525af2b1b1d159ea5fed1828bd3b.zip gcc-3113e92dc3dc525af2b1b1d159ea5fed1828bd3b.tar.gz gcc-3113e92dc3dc525af2b1b1d159ea5fed1828bd3b.tar.bz2 |
re PR target/78695 (ICE (segfault) on powerpc64le-linux-gnu)
[gcc]
2016-12-11 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
PR target/78695
* config/rs6000/rs6000.c (find_alignment_op): Discard from
consideration any artificial definition.
[gcc/testsuite]
2016-12-11 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
PR target/78695
* gcc.target/powerpc/swaps-stack-protector.c: New test.
From-SVN: r243534
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000.c | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/powerpc/swaps-stack-protector.c | 16 |
4 files changed, 33 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c9a48b0..b6a058b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2016-12-11 Bill Schmidt <wschmidt@linux.vnet.ibm.com> + + PR target/78695 + * config/rs6000/rs6000.c (find_alignment_op): Discard from + consideration any artificial definition. + 2016-12-11 Iain Sandoe <iain@codesourcery.com> * configure.ac (CROSS directory tests): Remove the assumption that diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 55e9548..6aa8436 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -41433,6 +41433,12 @@ find_alignment_op (rtx_insn *insn, rtx base_reg) if (!base_def_link || base_def_link->next) break; + /* With stack-protector code enabled, and possibly in other + circumstances, there may not be an associated insn for + the def. */ + if (DF_REF_IS_ARTIFICIAL (base_def_link->ref)) + break; + rtx_insn *and_insn = DF_REF_INSN (base_def_link->ref); and_operation = alignment_mask (and_insn); if (and_operation != 0) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index aa9aae7..cde6eef 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-12-11 Bill Schmidt <wschmidt@linux.vnet.ibm.com> + + PR target/78695 + * gcc.target/powerpc/swaps-stack-protector.c: New test. + 2016-12-11 Uros Bizjak <ubizjak@gmail.com> PR target/70799 diff --git a/gcc/testsuite/gcc.target/powerpc/swaps-stack-protector.c b/gcc/testsuite/gcc.target/powerpc/swaps-stack-protector.c new file mode 100644 index 0000000..8093a26 --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/swaps-stack-protector.c @@ -0,0 +1,16 @@ +/* { dg-do compile } */ +/* { dg-options "-fstack-protector -O3" } */ + +/* PR78695: This code used to ICE in rs6000.c:find_alignment_op because + the stack protector address definition isn't associated with an insn. */ + +void *a(); +long b() { + char c[1]; + char *d = a(), *e = c; + long f = e ? b(e) : 0; + if (f > 54) + f = 1; + while (f--) + *d++ = *e++; +} |