This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH 2/9] operand_equal_p: add support for FIELD_DECL
- From: Martin Liska <mliska at suse dot cz>
- To: gcc-patches at gcc dot gnu dot org
- Date: Mon, 10 Jun 2019 13:05:58 +0200
- Subject: [PATCH 2/9] operand_equal_p: add support for FIELD_DECL
- References: <cover.1565105736.git.mliska@suse.cz>
gcc/ChangeLog:
2019-07-24 Martin Liska <mliska@suse.cz>
* fold-const.c (operand_equal_p): Support FIELD_DECL
as well.
* tree.c (add_expr): Hast DECL_FIELD_OFFSET and
DECL_FIELD_BIT_OFFSET for FIELD_DECL.
gcc/testsuite/ChangeLog:
2019-07-24 Martin Liska <mliska@suse.cz>
* gcc.dg/vect/vect-35-big-array.c: Vectorize one more loop.
* gcc.dg/vect/vect-35.c: Likewise.
* gcc.dg/pr70740.c: Move from torture and set -O2.
* gfortran.dg/vect/vect-8.f90: Update scanned pattern.
---
gcc/fold-const.c | 34 ++++++++++++++++---
gcc/testsuite/gcc.dg/{torture => }/pr70740.c | 3 +-
gcc/testsuite/gcc.dg/vect/vect-35-big-array.c | 3 +-
gcc/testsuite/gcc.dg/vect/vect-35.c | 3 +-
gcc/testsuite/gfortran.dg/vect/vect-8.f90 | 2 +-
gcc/tree.c | 4 +++
6 files changed, 38 insertions(+), 11 deletions(-)
rename gcc/testsuite/gcc.dg/{torture => }/pr70740.c (77%)
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