summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAndrew Pinski <andrew_pinski@playstation.sony.com>2009-06-12 19:00:39 +0000
committerAndrew Pinski <pinskia@gcc.gnu.org>2009-06-12 12:00:39 -0700
commit737142ced7510afcd0144c866d9169ac7cbf3fb6 (patch)
treece8fe06a4a5b43d55c7335eddbcf12d9026c27d4 /gcc
parentd3a0d55d663e3837aaba816af1aabf983df0ffab (diff)
downloadgcc-737142ced7510afcd0144c866d9169ac7cbf3fb6.tar.gz
re PR tree-optimization/38865 (missing FRE with VIEW_CONVERT_EXPR)
2009-06-12 Andrew Pinski <andrew_pinski@playstation.sony.com> PR tree-opt/38865 * tree-ssa-sccvn.c (visit_reference_op_load): If vn_reference_lookup is returns NULL and OP is a VCE, look through the VCE. 2009-06-12 Andrew Pinski <andrew_pinski@playstation.sony.com> PR tree-opt/38865 * gcc.dg/tree-ssa/fre-vce-1.c : From-SVN: r148437
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/fre-vce-1.c35
-rw-r--r--gcc/tree-ssa-sccvn.c6
4 files changed, 52 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 93a0e896d26..2e8f5ebcca2 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2009-06-12 Andrew Pinski <andrew_pinski@playstation.sony.com>
+
+ PR tree-opt/38865
+ * tree-ssa-sccvn.c (visit_reference_op_load): If vn_reference_lookup
+ is returns NULL and OP is a VCE, look through the VCE.
+
2009-06-12 Ian Lance Taylor <iant@google.com>
PR bootstrap/40430
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index b5f0fbc1ed3..8c218933be2 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2009-06-12 Andrew Pinski <andrew_pinski@playstation.sony.com>
+
+ PR tree-opt/38865
+ * gcc.dg/tree-ssa/fre-vce-1.c
+
2009-06-12 H.J. Lu <hongjiu.lu@intel.com>
PR testsuite/40384
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/fre-vce-1.c b/gcc/testsuite/gcc.dg/tree-ssa/fre-vce-1.c
new file mode 100644
index 00000000000..f8c12c8d6c5
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/fre-vce-1.c
@@ -0,0 +1,35 @@
+/* { dg-options "-O2 -fdump-tree-fre -w" } */
+/* { dg-do compile } */
+#define vector __attribute__((vector_size(sizeof(int)*4) ))
+struct s { vector int i; };
+vector float f(struct s *sv)
+{
+ sv->i = (vector int){1, 2, 3, 4};
+ return (vector float)sv->i;
+}
+
+
+vector float f1(struct s *sv, vector int a)
+{
+ sv->i = a;
+ return (vector float)sv->i;
+}
+
+struct s1 { int i; };
+
+void g(struct s1 *, float);
+void a1 (struct s1 sv)
+{
+ sv.i = 1;
+ g(&sv, *(float*)&sv.i);
+}
+
+
+void a2 (struct s1 sv, int i)
+{
+ sv.i = i;
+ g(&sv, *(float*)&sv.i);
+}
+
+/* { dg-final { scan-tree-dump-times "sv_\[0-9\]\\\(D\\\)->i" 2 "fre" } } */
+/* { dg-final { scan-tree-dump-times "sv.i" 2 "fre" } } */
diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c
index 03fea751feb..6d263ded177 100644
--- a/gcc/tree-ssa-sccvn.c
+++ b/gcc/tree-ssa-sccvn.c
@@ -1976,6 +1976,12 @@ visit_reference_op_load (tree lhs, tree op, gimple stmt)
bool changed = false;
tree result = vn_reference_lookup (op, gimple_vuse (stmt), true, NULL);
+ /* If we have a VCE, try looking up its operand as it might be stored in
+ a different type. */
+ if (!result && TREE_CODE (op) == VIEW_CONVERT_EXPR)
+ result = vn_reference_lookup (TREE_OPERAND (op, 0), gimple_vuse (stmt),
+ true, NULL);
+
/* We handle type-punning through unions by value-numbering based
on offset and size of the access. Be prepared to handle a
type-mismatch here via creating a VIEW_CONVERT_EXPR. */