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.
This commit is contained in:
parent
2812a28418
commit
0de349f108
4 changed files with 54 additions and 1 deletions
|
@ -1,3 +1,8 @@
|
|||
2020-01-24 Jeff Law <law@redhat.com>
|
||||
|
||||
PR tree-optimization/89689
|
||||
* builtins.def (BUILT_IN_OBJECT_SIZE): Make it const rather than pure.
|
||||
|
||||
2020-01-29 Richard Sandiford <richard.sandiford@arm.com>
|
||||
|
||||
Revert:
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2020-01-29 Jeff Law <law@redhat.com
|
||||
|
||||
PR tree-optimization/89689
|
||||
* gcc.dg/pr89689.c: New test.
|
||||
|
||||
2020-01-29 Marek Polacek <polacek@redhat.com>
|
||||
|
||||
PR c++/91754 - Fix template arguments comparison with class NTTP.
|
||||
|
|
43
gcc/testsuite/gcc.dg/pr89689.c
Normal file
43
gcc/testsuite/gcc.dg/pr89689.c
Normal file
|
@ -0,0 +1,43 @@
|
|||
/* { dg-do-compile } */
|
||||
/* { dg-options "-O2 -Warray-bounds" } */
|
||||
|
||||
#include <string.h>
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
|
||||
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;
|
||||
}
|
Loading…
Add table
Reference in a new issue