From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1666) id E5E40385734C; Wed, 26 Apr 2023 10:41:25 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org E5E40385734C DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1682505685; bh=DpRqwWrCpvOutIBW/SajTTCYdliOLPi8NEQuwAsm9oo=; h=From:To:Subject:Date:From; b=eodpt8xahLV35686D/hwddwfrJ3sR2P1XAhXhQMQI94n9N/7v2QTBRvydskvMF5Pa gJMoRAKIb4AJPurrG2RBv9jw6JlwcPp270hUX16iEYtHYejsYBdbqtH1ojy6O7zKCg KQnpiCJnLe7mBXfNiGNW5dSspPwNx1332GWw+Pf8= MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Richard Biener To: gcc-cvs@gcc.gnu.org Subject: [gcc r12-9474] tree-optimization/109609 - correctly interpret arg size in fnspec X-Act-Checkin: gcc X-Git-Author: Richard Biener X-Git-Refname: refs/heads/releases/gcc-12 X-Git-Oldrev: ef6051b36241bf130bf76af0b775248635dc616e X-Git-Newrev: 2c7e89510fe41265b285e886d19f9895adf545e8 Message-Id: <20230426104125.E5E40385734C@sourceware.org> Date: Wed, 26 Apr 2023 10:41:25 +0000 (GMT) List-Id: https://gcc.gnu.org/g:2c7e89510fe41265b285e886d19f9895adf545e8 commit r12-9474-g2c7e89510fe41265b285e886d19f9895adf545e8 Author: Richard Biener Date: Tue Apr 25 14:56:44 2023 +0200 tree-optimization/109609 - correctly interpret arg size in fnspec By majority vote and a hint from the API name which is arg_max_access_size_given_by_arg_p this interprets a memory access size specified as given as other argument such as for strncpy in the testcase which has "1cO313" as specifying the _maximum_ size read/written rather than the exact size. There are two uses interpreting it that way already and one differing. The following adjusts the differing and clarifies the documentation. PR tree-optimization/109609 * attr-fnspec.h (arg_max_access_size_given_by_arg_p): Clarify semantics. * tree-ssa-alias.cc (check_fnspec): Correctly interpret the size given by arg_max_access_size_given_by_arg_p as maximum, not exact, size. * gcc.dg/torture/pr109609.c: New testcase. (cherry picked from commit e8d00353017f895d03a9eabae3506fd126ce1a2d) Diff: --- gcc/attr-fnspec.h | 4 ++-- gcc/testsuite/gcc.dg/torture/pr109609.c | 26 ++++++++++++++++++++++++++ gcc/tree-ssa-alias.cc | 18 +++++++++++++++--- 3 files changed, 43 insertions(+), 5 deletions(-) diff --git a/gcc/attr-fnspec.h b/gcc/attr-fnspec.h index d506c75a6a6..f12cada6816 100644 --- a/gcc/attr-fnspec.h +++ b/gcc/attr-fnspec.h @@ -54,7 +54,7 @@ ' ' nothing is known 't' the size of value written/read corresponds to the size of of the pointed-to type of the argument type - '1'...'9' specifies the size of value written/read is given by the + '1'...'9' specifies the size of value written/read is bound by the specified argument */ @@ -169,7 +169,7 @@ public: && str[idx] != 'x' && str[idx] != 'X'; } - /* Return true if load of memory pointed to by argument I is specified + /* Return true if load of memory pointed to by argument I is bound by another argument. In this case set ARG. */ bool arg_max_access_size_given_by_arg_p (unsigned int i, unsigned int *arg) diff --git a/gcc/testsuite/gcc.dg/torture/pr109609.c b/gcc/testsuite/gcc.dg/torture/pr109609.c new file mode 100644 index 00000000000..0e191cd1ee8 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr109609.c @@ -0,0 +1,26 @@ +/* { dg-do run } */ + +#define N 23 +#define MAX_LEN 13 +char dst[N + 1]; + +void __attribute__((noipa)) +invert(const char *id) +{ + char buf[MAX_LEN]; + char *ptr = buf + sizeof(buf); // start from the end of buf + *(--ptr) = '\0'; // terminate string + while (*id && ptr > buf) { + *(--ptr) = *(id++); // copy id backwards + } + __builtin_strncpy(dst, ptr, N); // copy ptr/buf to dst +} + + +int main() +{ + invert("abcde"); + if (__builtin_strcmp(dst, "edcba")) + __builtin_abort(); + return 0; +} diff --git a/gcc/tree-ssa-alias.cc b/gcc/tree-ssa-alias.cc index be7b597266f..1b404e055f8 100644 --- a/gcc/tree-ssa-alias.cc +++ b/gcc/tree-ssa-alias.cc @@ -2722,9 +2722,21 @@ check_fnspec (gcall *call, ao_ref *ref, bool clobber) t = TREE_CHAIN (t); size = TYPE_SIZE_UNIT (TREE_TYPE (TREE_VALUE (t))); } - ao_ref_init_from_ptr_and_size (&dref, - gimple_call_arg (call, i), - size); + poly_int64 size_hwi; + if (size + && poly_int_tree_p (size, &size_hwi) + && coeffs_in_range_p (size_hwi, 0, + HOST_WIDE_INT_MAX / BITS_PER_UNIT)) + { + size_hwi = size_hwi * BITS_PER_UNIT; + ao_ref_init_from_ptr_and_range (&dref, + gimple_call_arg (call, i), + true, 0, -1, size_hwi); + } + else + ao_ref_init_from_ptr_and_range (&dref, + gimple_call_arg (call, i), + false, 0, -1, -1); if (refs_may_alias_p_1 (&dref, ref, false)) return 1; }