aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2023-06-30 12:03:26 +0200
committerRichard Biener <rguenther@suse.de>2023-06-30 12:59:36 +0200
commit4f8e31e01bd04ab17a53deb5aa44bd82c885b228 (patch)
treeb9bbfa488e39d5cbf198b3fa82203d9bd42f2014
parent50cb9df7209125f9466336d23efdd4fbeda9c4d5 (diff)
downloadgcc-4f8e31e01bd04ab17a53deb5aa44bd82c885b228.zip
gcc-4f8e31e01bd04ab17a53deb5aa44bd82c885b228.tar.gz
gcc-4f8e31e01bd04ab17a53deb5aa44bd82c885b228.tar.bz2
tree-optimization/110496 - TYPE_PRECISION issue with store-merging
When store-merging looks for bswap opportunities we also handle BIT_FIELD_REFs where we verify the refed object is of scalar type but we don't check for the result type we eventually use. That's done later but after we eventually query TYPE_PRECISION. The following re-orders this. PR tree-optimization/110496 * gimple-ssa-store-merging.cc (find_bswap_or_nop_1): Re-order verifying and TYPE_PRECISION query for the BIT_FIELD_REF case. * gcc.dg/pr110496.c: New testcase.
-rw-r--r--gcc/gimple-ssa-store-merging.cc5
-rw-r--r--gcc/testsuite/gcc.dg/pr110496.c26
2 files changed, 30 insertions, 1 deletions
diff --git a/gcc/gimple-ssa-store-merging.cc b/gcc/gimple-ssa-store-merging.cc
index 401496a..0d19b98 100644
--- a/gcc/gimple-ssa-store-merging.cc
+++ b/gcc/gimple-ssa-store-merging.cc
@@ -650,10 +650,13 @@ find_bswap_or_nop_1 (gimple *stmt, struct symbolic_number *n, int limit)
/* Convert. */
n->type = TREE_TYPE (rhs1);
+ if (!verify_symbolic_number_p (n, stmt))
+ return NULL;
+
if (!n->base_addr)
n->range = TYPE_PRECISION (n->type) / BITS_PER_UNIT;
- return verify_symbolic_number_p (n, stmt) ? stmt : NULL;
+ return stmt;
}
return NULL;
diff --git a/gcc/testsuite/gcc.dg/pr110496.c b/gcc/testsuite/gcc.dg/pr110496.c
new file mode 100644
index 0000000..3c3d12f
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr110496.c
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+long contents, f_num;
+int decide();
+int f_MV0__x;
+void f() {
+ unsigned char *rptr;
+ unsigned char valbuf[6];
+ rptr = (unsigned char *)contents;
+ if (decide())
+ do {
+ __builtin_memcpy(valbuf, &f_MV0__x, sizeof(int));
+ (&valbuf[0])[4] = (&valbuf[0])[5] = 0;
+ } while (0);
+ else {
+ int MV0__x = f_num;
+ __builtin_memcpy(valbuf, &MV0__x, sizeof(int));
+ (&valbuf[0])[4] = (&valbuf[0])[5] = 0;
+ }
+ rptr[1] = valbuf[4];
+ rptr[2] = valbuf[5];
+ rptr[4] = valbuf[1];
+ rptr[5] = valbuf[2];
+ __builtin_memset(valbuf, 0, 8);
+}