[PR 91832] Do not ICE on negative offsets in ipa-sra
authorMartin Jambor <mjambor@suse.cz>
Tue, 24 Sep 2019 11:16:57 +0000 (13:16 +0200)
committerMartin Jambor <jamborm@gcc.gnu.org>
Tue, 24 Sep 2019 11:16:57 +0000 (13:16 +0200)
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

gcc/ChangeLog
gcc/ipa-sra.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/ipa/pr91832.c [new file with mode: 0644]

index bd6f541..2d7e280 100644 (file)
@@ -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
index a32defb..0ccebbd 100644 (file)
@@ -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)
index 600901d..83acf8e 100644 (file)
@@ -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 (file)
index 0000000..4a0d62e
--- /dev/null
@@ -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]);
+}