On August 24, 2020 5:07:56 PM GMT+02:00, Martin Jambor <mjam...@suse.cz> wrote:
>Hi,
>
>I must admit I was quite surprised to see that SRA does not disqualify
>an aggregate from any transformations when it encounters an offset for
>which get_ref_base_and_extent returns a negative offset.  It may not
>matter too much because I sure hope such programs always have
>undefined behavior (SRA candidates are local variables on stack) but
>it is probably better not to perform weird transformations on them as
>build ref model with the new build_reconstructed_reference function
>currently happily do for negative offsets (they just copy the existing
>expression which is then used as the expression of a "propagated"
>access) and of course the compiler must not ICE (as it currently does
>because the SRA forest verifier does not like the expression).
>
>Fixed with the following patch which also passed bootstrap and testing
>on an x86_64-linux.  OK for master and later on for the gcc-10 branch?

OK. 

Richard. 

>Thanks,
>
>Martin
>
>
>gcc/ChangeLog:
>
>2020-08-24  Martin Jambor  <mjam...@suse.cz>
>
>       PR tree-optimization/96730
>       * tree-sra.c (create_access): Disqualify any aggregate with negative
>       offset access.
>       (build_ref_for_model): Add assert that offset is non-negative.
>
>gcc/testsuite/ChangeLog:
>
>2020-08-24  Martin Jambor  <mjam...@suse.cz>
>
>       PR tree-optimization/96730
>       * gcc.dg/tree-ssa/pr96730.c: New test.
>---
> gcc/testsuite/gcc.dg/tree-ssa/pr96730.c | 13 +++++++++++++
> gcc/tree-sra.c                          |  6 ++++++
> 2 files changed, 19 insertions(+)
> create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr96730.c
>
>diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr96730.c
>b/gcc/testsuite/gcc.dg/tree-ssa/pr96730.c
>new file mode 100644
>index 00000000000..39a06846529
>--- /dev/null
>+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr96730.c
>@@ -0,0 +1,13 @@
>+/* { dg-do compile } */
>+/* { dg-options "-O1" } */
>+
>+struct a {
>+  int b;
>+  int c;
>+} d() {
>+  struct a e[9];
>+  int f = 3362953455;
>+  e[f] = e[6];
>+  e[6].c = 1;
>+}
>+int main() {}
>diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
>index fcba7fbdd31..754f41302fc 100644
>--- a/gcc/tree-sra.c
>+++ b/gcc/tree-sra.c
>@@ -931,6 +931,11 @@ create_access (tree expr, gimple *stmt, bool
>write)
>     }
>   if (size == 0)
>     return NULL;
>+  if (offset < 0)
>+    {
>+      disqualify_candidate (base, "Encountered a negative offset
>access.");
>+      return NULL;
>+    }
>   if (size < 0)
>     {
>   disqualify_candidate (base, "Encountered an unconstrained access.");
>@@ -1667,6 +1672,7 @@ build_ref_for_model (location_t loc, tree base,
>HOST_WIDE_INT offset,
>                    struct access *model, gimple_stmt_iterator *gsi,
>                    bool insert_after)
> {
>+  gcc_assert (offset >= 0);
>   if (TREE_CODE (model->expr) == COMPONENT_REF
>       && DECL_BIT_FIELD (TREE_OPERAND (model->expr, 1)))
>     {

Reply via email to