aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2021-04-01 10:51:03 +0200
committerJakub Jelinek <jakub@redhat.com>2021-04-01 10:51:03 +0200
commit5b9a65ecbeb22ef6dd3344baae97f85b645522e3 (patch)
tree41a6cb28406c7a1dc4403fad2d220cbf187e2485 /gcc
parentb75c4e1384c021ca94fc8e8db8e517e802b820f3 (diff)
downloadgcc-5b9a65ecbeb22ef6dd3344baae97f85b645522e3.zip
gcc-5b9a65ecbeb22ef6dd3344baae97f85b645522e3.tar.gz
gcc-5b9a65ecbeb22ef6dd3344baae97f85b645522e3.tar.bz2
bswap: Handle bswapping of pointers [PR96573]
In GCC8/9 we used to optimize this into a bswap, but we no longer do. Handling byteswapping of pointers is easy, all we need is to allow them, for the __builtin_bswap* we already use TYPE_PRECISION to determine the precision and we cast the operand and result to the correct type if they aren't uselessly convertible to what the builtin expects. 2021-04-01 Jakub Jelinek <jakub@redhat.com> PR tree-optimization/96573 * gimple-ssa-store-merging.c (init_symbolic_number): Handle also pointer types. * gcc.dg/pr96573.c: New test.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/gimple-ssa-store-merging.c2
-rw-r--r--gcc/testsuite/gcc.dg/pr96573.c20
2 files changed, 21 insertions, 1 deletions
diff --git a/gcc/gimple-ssa-store-merging.c b/gcc/gimple-ssa-store-merging.c
index 213c155..30bd663 100644
--- a/gcc/gimple-ssa-store-merging.c
+++ b/gcc/gimple-ssa-store-merging.c
@@ -333,7 +333,7 @@ init_symbolic_number (struct symbolic_number *n, tree src)
{
int size;
- if (! INTEGRAL_TYPE_P (TREE_TYPE (src)))
+ if (!INTEGRAL_TYPE_P (TREE_TYPE (src)) && !POINTER_TYPE_P (TREE_TYPE (src)))
return false;
n->base_addr = n->offset = n->alias_set = n->vuse = NULL_TREE;
diff --git a/gcc/testsuite/gcc.dg/pr96573.c b/gcc/testsuite/gcc.dg/pr96573.c
new file mode 100644
index 0000000..3acf117
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr96573.c
@@ -0,0 +1,20 @@
+/* PR tree-optimization/96573 */
+/* { dg-do compile { target { lp64 || ilp32 } } } */
+/* { dg-require-effective-target bswap } */
+/* { dg-options "-O3 -fdump-tree-optimized" } */
+/* { dg-final { scan-tree-dump "__builtin_bswap" "optimized" } } */
+
+typedef __SIZE_TYPE__ size_t;
+
+void *
+foo (void * const p)
+{
+ const size_t m = sizeof (p) - 1;
+ const unsigned char * const o = (unsigned char*) &p;
+ void *n;
+ unsigned char * const q = (unsigned char *) &n;
+ unsigned char i;
+ for (i = 0; i <= m; ++i)
+ q[m - i] = o[i];
+ return n;
+}