diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 0bd68b5e2d4..52414f7729e 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -3462,11 +3462,35 @@ operand_equal_p (const_tree arg0, const_tree arg1, unsigned int flags) } case tcc_declaration: - /* Consider __builtin_sqrt equal to sqrt. */ - return (TREE_CODE (arg0) == FUNCTION_DECL - && fndecl_built_in_p (arg0) && fndecl_built_in_p (arg1) - && DECL_BUILT_IN_CLASS (arg0) == DECL_BUILT_IN_CLASS (arg1) - && DECL_FUNCTION_CODE (arg0) == DECL_FUNCTION_CODE (arg1)); + switch (TREE_CODE (arg0)) + { + case FUNCTION_DECL: + /* Consider __builtin_sqrt equal to sqrt. */ + return (fndecl_built_in_p (arg0) && fndecl_built_in_p (arg1) + && DECL_BUILT_IN_CLASS (arg0) == DECL_BUILT_IN_CLASS (arg1) + && DECL_FUNCTION_CODE (arg0) == DECL_FUNCTION_CODE (arg1)); + case FIELD_DECL: + { + tree fo0 = DECL_FIELD_OFFSET (arg0); + tree fo1 = DECL_FIELD_OFFSET (arg1); + if (fo0 != NULL && fo1 != NULL + && !operand_equal_p (fo0, fo1, OEP_ONLY_CONST)) + return false; + else if (fo0 != fo1) + return false; + + tree fbo0 = DECL_FIELD_BIT_OFFSET (arg0); + tree fbo1 = DECL_FIELD_BIT_OFFSET (arg1); + if (fbo0 != NULL && fbo1 != NULL + && !operand_equal_p (fbo0, fbo1, OEP_ONLY_CONST)) + return false; + else if (fbo0 != fbo1) + return false; + return true; + } + default: + return false; + } case tcc_exceptional: if (TREE_CODE (arg0) == CONSTRUCTOR) diff --git a/gcc/testsuite/gcc.dg/torture/pr70740.c b/gcc/testsuite/gcc.dg/pr70740.c similarity index 77% rename from gcc/testsuite/gcc.dg/torture/pr70740.c rename to gcc/testsuite/gcc.dg/pr70740.c index 5bf8e4adc91..186da1b2637 100644 --- a/gcc/testsuite/gcc.dg/torture/pr70740.c +++ b/gcc/testsuite/gcc.dg/pr70740.c @@ -1,4 +1,5 @@ /* { dg-do compile } */ +/* { dg-options "-O2" } */ extern int foo (void); extern void *memcpy (void *, const void *, __SIZE_TYPE__); @@ -32,7 +33,7 @@ baz () e = c.a3; else e = c.a1; - memcpy (d.a, e, 6); + memcpy (d.a, e, 6); /* { dg-warning "reading 5 bytes from a region of size 0" } */ f = bar (); memcpy (d.a, f, 1); } diff --git a/gcc/testsuite/gcc.dg/vect/vect-35-big-array.c b/gcc/testsuite/gcc.dg/vect/vect-35-big-array.c index ca57a10f714..fa356c2c4a2 100644 --- a/gcc/testsuite/gcc.dg/vect/vect-35-big-array.c +++ b/gcc/testsuite/gcc.dg/vect/vect-35-big-array.c @@ -47,5 +47,4 @@ int main (void) } -/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { xfail { ia64-*-* sparc*-*-* } } } } */ -/* { dg-final { scan-tree-dump "can't determine dependence between" "vect" } } */ +/* { dg-final { scan-tree-dump-times "vectorized 2 loops" 1 "vect" { xfail { ia64-*-* sparc*-*-* } } } } */ diff --git a/gcc/testsuite/gcc.dg/vect/vect-35.c b/gcc/testsuite/gcc.dg/vect/vect-35.c index 76fe32d68ad..3023c8c714f 100644 --- a/gcc/testsuite/gcc.dg/vect/vect-35.c +++ b/gcc/testsuite/gcc.dg/vect/vect-35.c @@ -47,5 +47,4 @@ int main (void) } -/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { xfail { ia64-*-* sparc*-*-* } } } } */ -/* { dg-final { scan-tree-dump "can't determine dependence between" "vect" } } */ +/* { dg-final { scan-tree-dump-times "vectorized 2 loops" 1 "vect" { xfail { ia64-*-* sparc*-*-* } } } } */ diff --git a/gcc/testsuite/gfortran.dg/vect/vect-8.f90 b/gcc/testsuite/gfortran.dg/vect/vect-8.f90 index e26cdf95e51..f83f0d0aa27 100644 --- a/gcc/testsuite/gfortran.dg/vect/vect-8.f90 +++ b/gcc/testsuite/gfortran.dg/vect/vect-8.f90 @@ -704,5 +704,5 @@ CALL track('KERNEL ') RETURN END SUBROUTINE kernel -! { dg-final { scan-tree-dump-times "vectorized 22 loops" 1 "vect" { target vect_intdouble_cvt } } } +! { dg-final { scan-tree-dump-times "vectorized 23 loops" 1 "vect" { target vect_intdouble_cvt } } } ! { dg-final { scan-tree-dump-times "vectorized 17 loops" 1 "vect" { target { ! vect_intdouble_cvt } } } } diff --git a/gcc/tree.c b/gcc/tree.c index efa49e99d65..91ebc9eddc4 100644 --- a/gcc/tree.c +++ b/gcc/tree.c @@ -7887,6 +7887,10 @@ add_expr (const_tree t, inchash::hash &hstate, unsigned int flags) case IDENTIFIER_NODE: hstate.add_object (IDENTIFIER_HASH_VALUE (t)); return; + case FIELD_DECL: + inchash::add_expr (DECL_FIELD_OFFSET (t), hstate, flags); + inchash::add_expr (DECL_FIELD_BIT_OFFSET (t), hstate, flags); + return; case FUNCTION_DECL: /* When referring to a built-in FUNCTION_DECL, use the __builtin__ form. Otherwise nodes that compare equal according to operand_equal_p might