aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2024-02-13 10:04:31 +0100
committerRichard Biener <rguenther@suse.de>2024-02-13 11:45:24 +0100
commitaf6d8d0cc1ac56eba55ef658c664236208f88169 (patch)
treeda85b783098fe593ffa044182ac3e8a2c54434c4 /gcc
parent2ca373b7e8adf9cc0c17aecab5e1cc6c76a92f4c (diff)
downloadgcc-af6d8d0cc1ac56eba55ef658c664236208f88169.zip
gcc-af6d8d0cc1ac56eba55ef658c664236208f88169.tar.gz
gcc-af6d8d0cc1ac56eba55ef658c664236208f88169.tar.bz2
tree-optimization/113898 - ICE with sanity checking for VN ref adjustment
The following fixes a missing add to the accumulated offset when adjusting an ARRAY_REF op for value-ranges applied to by get_ref_base_and_extent. PR tree-optimization/113898 * tree-ssa-sccvn.cc (copy_reference_ops_from_ref): Add missing accumulated off adjustment. * gcc.dg/torture/pr113898.c: New testcase.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr113898.c16
-rw-r--r--gcc/tree-ssa-sccvn.cc1
2 files changed, 17 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/torture/pr113898.c b/gcc/testsuite/gcc.dg/torture/pr113898.c
new file mode 100644
index 0000000..6832a34
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr113898.c
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+
+int a, d;
+unsigned **b;
+long c, f;
+long e[2][1];
+void g() {
+ int h = 0;
+ for (; h < 2; h++) {
+ e[h][d + **b + a] = c;
+ if (f)
+ for (;;)
+ ;
+ }
+}
+void main() {}
diff --git a/gcc/tree-ssa-sccvn.cc b/gcc/tree-ssa-sccvn.cc
index 2823573..5a49390 100644
--- a/gcc/tree-ssa-sccvn.cc
+++ b/gcc/tree-ssa-sccvn.cc
@@ -1126,6 +1126,7 @@ copy_reference_ops_from_ref (tree ref, vec<vn_reference_op_s> *result)
op.op0 = wide_int_to_tree (TREE_TYPE (op.op0),
wi::to_poly_wide (op.op1) + idx);
op.off = idx * elsz;
+ off += op.off;
}
else
{