diff options
author | Martin Jambor <mjambor@suse.cz> | 2019-09-24 13:16:57 +0200 |
---|---|---|
committer | Martin Jambor <jamborm@gcc.gnu.org> | 2019-09-24 13:16:57 +0200 |
commit | 5a4d0da4f5840b9829316e93710b4bd4269b9366 (patch) | |
tree | e0e8f506f497d6d20c321c60767cd80e88ff880b /gcc | |
parent | 3f9e08f57e1de90de5bc9d2a00815ea38064c733 (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/ipa-sra.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/ipa/pr91832.c | 12 |
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]); +} |