From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1666) id DB1F4385842D; Wed, 26 Apr 2023 09:34:00 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org DB1F4385842D DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1682501640; bh=oLDhlIY45733QzZ2XyrQqoDP5gzyQiupYY4PbMjSPkw=; h=From:To:Subject:Date:From; b=buHYqTz45azFtbBXc9lsH/RxCCv5fPGMgK0WudM5o0xdkqr0gWnbJjYG7cjSSSUVu kT/w2HFFwwLpRZVJBljqVEyP4IBFCrEbuBLU2dYc2yYNvOND3uKaFJlfXXXhNC9ZCx HfZE3Szh9p/pm1shH5Vnml0AlVlRy9RcMq7KaTOI= 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 r13-7252] 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-13 X-Git-Oldrev: bb406a6aea336966681927a27f54ee89c4fd4ea1 X-Git-Newrev: df49e4602882eabe0642699fb71a70f6e120e263 Message-Id: <20230426093400.DB1F4385842D@sourceware.org> Date: Wed, 26 Apr 2023 09:34:00 +0000 (GMT) List-Id: https://gcc.gnu.org/g:df49e4602882eabe0642699fb71a70f6e120e263 commit r13-7252-gdf49e4602882eabe0642699fb71a70f6e120e263 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 acf1c5f6be7..99d5f896e8b 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 8a1ec9091fa..e0693e146bf 100644 --- a/gcc/tree-ssa-alias.cc +++ b/gcc/tree-ssa-alias.cc @@ -2726,9 +2726,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; }