aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@arm.com>2025-04-10 11:03:04 +0100
committerRichard Sandiford <richard.sandiford@arm.com>2025-04-10 11:03:04 +0100
commit4c8c373495d7d863dfb7102726ac3b4b41685df4 (patch)
treece9e1c6b620d05be673a05b703b732882163f5fa /gcc
parent72dff34bcdd6f05b64bbf07739ab815e673b5946 (diff)
downloadgcc-4c8c373495d7d863dfb7102726ac3b4b41685df4.zip
gcc-4c8c373495d7d863dfb7102726ac3b4b41685df4.tar.gz
gcc-4c8c373495d7d863dfb7102726ac3b4b41685df4.tar.bz2
Avoid using POINTER_DIFF_EXPR for overlap checks [PR119399]
In r10-4803-g8489e1f45b50600c I'd used POINTER_DIFF_EXPR to subtract the two pointers involved in an overlap test. I'm not sure whether I'd specifically chosen that over MINUS_EXPR or not; if so, the only reason I can think of is that it is probably faster on targets with PSImode pointers. Regardless, as the PR points out, subtracting unrelated pointers using POINTER_DIFF_EXPR is undefined behaviour. gcc/ PR tree-optimization/119399 * tree-data-ref.cc (create_waw_or_war_checks): Use a MINUS_EXPR on two converted pointers, rather than converting a POINTER_DIFF_EXPR on the pointers. gcc/testsuite/ PR tree-optimization/119399 * gcc.dg/vect/pr119399.c: New test.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr119399.c10
-rw-r--r--gcc/tree-data-ref.cc7
2 files changed, 14 insertions, 3 deletions
diff --git a/gcc/testsuite/gcc.dg/vect/pr119399.c b/gcc/testsuite/gcc.dg/vect/pr119399.c
new file mode 100644
index 0000000..8d868f4
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/pr119399.c
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-fdump-tree-vect-raw" } */
+
+void foo(int *p, int *q, int n)
+{
+ for (int i = 0; i < n; i++)
+ p[i] = q[i] + 1;
+}
+
+/* { dg-final { scan-tree-dump-not {<pointer_diff_expr,} "vect" } } */
diff --git a/gcc/tree-data-ref.cc b/gcc/tree-data-ref.cc
index 18d9f0f..8a46e6d 100644
--- a/gcc/tree-data-ref.cc
+++ b/gcc/tree-data-ref.cc
@@ -2498,9 +2498,10 @@ create_waw_or_war_checks (tree *cond_expr,
limit = fold_build2 (PLUS_EXPR, sizetype, limit,
size_int (last_chunk_a + last_chunk_b));
- tree subject = fold_build2 (POINTER_DIFF_EXPR, ssizetype, addr_b, addr_a);
- subject = fold_build2 (PLUS_EXPR, sizetype,
- fold_convert (sizetype, subject), bias);
+ tree subject = fold_build2 (MINUS_EXPR, sizetype,
+ fold_convert (sizetype, addr_b),
+ fold_convert (sizetype, addr_a));
+ subject = fold_build2 (PLUS_EXPR, sizetype, subject, bias);
*cond_expr = fold_build2 (GT_EXPR, boolean_type_node, subject, limit);
if (dump_enabled_p ())