From 0de349f108d963219bd59aa374a68c15355236be Mon Sep 17 00:00:00 2001 From: Jeff Law Date: Wed, 29 Jan 2020 12:23:53 -0700 Subject: [PATCH] Improve DSE which in turn eliminates the need for jump threading and block duplication for the original testcase in pr89689 which in turn eliminates the false positive -Warray-bounds warning for the original testcase. PR tree-optimization/89689 * builtins.def (BUILT_IN_OBJECT_SIZE): Make it const rather than pure. PR tree-optimization/89689 * gcc.dg/pr89689.c: New test. --- gcc/ChangeLog | 5 ++++ gcc/builtins.def | 2 +- gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/gcc.dg/pr89689.c | 43 ++++++++++++++++++++++++++++++++++ 4 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/pr89689.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e2838c053a3e..567dff632f5e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2020-01-24 Jeff Law + + PR tree-optimization/89689 + * builtins.def (BUILT_IN_OBJECT_SIZE): Make it const rather than pure. + 2020-01-29 Richard Sandiford Revert: diff --git a/gcc/builtins.def b/gcc/builtins.def index 5ab842c34c2f..fa8b0641ab13 100644 --- a/gcc/builtins.def +++ b/gcc/builtins.def @@ -972,7 +972,7 @@ DEF_BUILTIN_STUB (BUILT_IN_STRCMP_EQ, "__builtin_strcmp_eq") DEF_BUILTIN_STUB (BUILT_IN_STRNCMP_EQ, "__builtin_strncmp_eq") /* Object size checking builtins. */ -DEF_GCC_BUILTIN (BUILT_IN_OBJECT_SIZE, "object_size", BT_FN_SIZE_CONST_PTR_INT, ATTR_PURE_NOTHROW_LEAF_LIST) +DEF_GCC_BUILTIN (BUILT_IN_OBJECT_SIZE, "object_size", BT_FN_SIZE_CONST_PTR_INT, ATTR_CONST_NOTHROW_LEAF_LIST) DEF_EXT_LIB_BUILTIN (BUILT_IN_MEMCPY_CHK, "__memcpy_chk", BT_FN_PTR_PTR_CONST_PTR_SIZE_SIZE, ATTR_RET1_NOTHROW_NONNULL_LEAF) DEF_EXT_LIB_BUILTIN (BUILT_IN_MEMMOVE_CHK, "__memmove_chk", BT_FN_PTR_PTR_CONST_PTR_SIZE_SIZE, ATTR_RET1_NOTHROW_NONNULL_LEAF) DEF_EXT_LIB_BUILTIN (BUILT_IN_MEMPCPY_CHK, "__mempcpy_chk", BT_FN_PTR_PTR_CONST_PTR_SIZE_SIZE, ATTR_RETNONNULL_NOTHROW_LEAF) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e38c4da8d72f..b62e7effb595 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2020-01-29 Jeff Law PR c++/91754 - Fix template arguments comparison with class NTTP. diff --git a/gcc/testsuite/gcc.dg/pr89689.c b/gcc/testsuite/gcc.dg/pr89689.c new file mode 100644 index 000000000000..ee81274d3c4a --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr89689.c @@ -0,0 +1,43 @@ +/* { dg-do-compile } */ +/* { dg-options "-O2 -Warray-bounds" } */ + +#include +#include +#include + +static inline __attribute__((__artificial__)) void *a(char *c, const char *d, long n) +{ + return __builtin___memcpy_chk(c, d, n, __builtin_object_size(c, 0)); +} +typedef struct { + char *data; + int len; +} sb_t; +const char __sb_slop[1]; +static void inline set0(sb_t *c) +{ + if (c->data != __sb_slop) + c->data[0] = 0; + else + assert (c->data[0] == 0); +} +char buf[5]; +sb_t l = { + .data = buf, + .len = 0 +}; +void o() +{ + char *data = "abcd"; + sb_t h = l; + set0(&h); + a(h.data, data, strlen(data)); + printf("%s\n", h.data); + printf("%d\n", h.data == __sb_slop); + printf("%d\n", h.data == buf); + set0(&h); +} +int main(void) { + o(); + return 0; +} -- 2.39.2