aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMartin Jambor <mjambor@suse.cz>2019-09-24 13:16:57 +0200
committerMartin Jambor <jamborm@gcc.gnu.org>2019-09-24 13:16:57 +0200
commit5a4d0da4f5840b9829316e93710b4bd4269b9366 (patch)
treee0e8f506f497d6d20c321c60767cd80e88ff880b /gcc
parent3f9e08f57e1de90de5bc9d2a00815ea38064c733 (diff)
downloadgcc-5a4d0da4f5840b9829316e93710b4bd4269b9366.zip
gcc-5a4d0da4f5840b9829316e93710b4bd4269b9366.tar.gz
gcc-5a4d0da4f5840b9829316e93710b4bd4269b9366.tar.bz2
[PR 91832] Do not ICE on negative offsets in ipa-sra
Hi, IPA-SRA asserts that an offset obtained from get_ref_base_and_extent is non-negative (after it verifies it is based on a parameter). That assumption is invalid as the testcase shows. One could probably also write a testcase with defined behavior, but unless I see a reasonable one where the transformation is really desirable, I'd like to just punt on those cases. Bootstrapped and tested on x86_64-linux. OK for trunk? Thanks, Martin 2019-09-24 Martin Jambor <mjambor@suse.cz> PR ipa/91832 * ipa-sra.c (scan_expr_access): Check that offset is non-negative. testsuite/ * gcc.dg/ipa/pr91832.c: New test. From-SVN: r276093
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/ipa-sra.c7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/ipa/pr91832.c12
4 files changed, 28 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index bd6f541..2d7e280 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2019-09-24 Martin Jambor <mjambor@suse.cz>
+
+ PR ipa/91832
+ * ipa-sra.c (scan_expr_access): Check that offset is non-negative.
+
2019-09-24 Richard Biener <rguenther@suse.de>
* tree-ssa-sccvn.c (vn_reference_lookup_3): Valueize MEM_REF
diff --git a/gcc/ipa-sra.c b/gcc/ipa-sra.c
index a32defb..0ccebbd 100644
--- a/gcc/ipa-sra.c
+++ b/gcc/ipa-sra.c
@@ -1692,7 +1692,12 @@ scan_expr_access (tree expr, gimple *stmt, isra_scan_context ctx,
disqualify_split_candidate (desc, "Encountered a bit-field access.");
return;
}
- gcc_assert (offset >= 0);
+ if (offset < 0)
+ {
+ disqualify_split_candidate (desc, "Encountered an access at a "
+ "negative offset.");
+ return;
+ }
gcc_assert ((offset % BITS_PER_UNIT) == 0);
gcc_assert ((size % BITS_PER_UNIT) == 0);
if ((offset / BITS_PER_UNIT) >= (UINT_MAX - ISRA_ARG_SIZE_LIMIT)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 600901d..83acf8e 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2019-09-24 Martin Jambor <mjambor@suse.cz>
+
+ PR ipa/91832
+ * gcc.dg/ipa/pr91832.c: New test.
+
2019-09-24 Richard Biener <rguenther@suse.de>
* gcc.dg/torture/20190924-1.c: New testcase.
diff --git a/gcc/testsuite/gcc.dg/ipa/pr91832.c b/gcc/testsuite/gcc.dg/ipa/pr91832.c
new file mode 100644
index 0000000..4a0d62e
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/ipa/pr91832.c
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+struct A1 {
+ char a1[1];
+};
+
+void fn2(char a);
+
+void fn1(struct A1 *p1) {
+ fn2(p1->a1[-1]);
+}