diff --git a/gcc/gimple-ssa-store-merging.cc b/gcc/gimple-ssa-store-merging.cc index 401496a92317..0d19b98ed73f 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 000000000000..3c3d12fb5324 --- /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); +}