diff options
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/pr96730.c | 13 | ||||
-rw-r--r-- | gcc/tree-sra.c | 6 |
2 files changed, 19 insertions, 0 deletions
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 0000000..39a0684 --- /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 fcba7fb..754f413 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))) { |