aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2012-05-07 15:31:00 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2012-05-07 15:31:00 +0200
commit7a04f01cb7752b4c9fab847cbb6775e4b020f6d9 (patch)
treeb20b7dea8ea2b3e8146eed68b755b81ed224d16c /gcc
parent4f22d4300fa45bd54c3ff48296f9d085c7a7a3eb (diff)
downloadgcc-7a04f01cb7752b4c9fab847cbb6775e4b020f6d9.zip
gcc-7a04f01cb7752b4c9fab847cbb6775e4b020f6d9.tar.gz
gcc-7a04f01cb7752b4c9fab847cbb6775e4b020f6d9.tar.bz2
re PR tree-optimization/53239 (VRP vs named value return opt)
PR tree-optimization/53239 * tree-vrp.c (get_value_range): Set VR of SSA_NAME_IS_DEFAULT_DEF of DECL_BY_REFERENCE RESULT_DECL to nonnull. * g++.dg/opt/vrp3.C: New test. * g++.dg/opt/vrp3-aux.cc: New file. * g++.dg/opt/vrp3.h: New file. From-SVN: r187240
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/g++.dg/opt/vrp3-aux.cc21
-rw-r--r--gcc/testsuite/g++.dg/opt/vrp3.C47
-rw-r--r--gcc/testsuite/g++.dg/opt/vrp3.h9
-rw-r--r--gcc/tree-vrp.c25
6 files changed, 106 insertions, 10 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index dd7073b..664bd50 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2012-05-07 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/53239
+ * tree-vrp.c (get_value_range): Set VR of
+ SSA_NAME_IS_DEFAULT_DEF of DECL_BY_REFERENCE RESULT_DECL
+ to nonnull.
+
2012-05-07 Richard Guenther <rguenther@suse.de>
PR tree-optimization/53195
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index e556702..323c652 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2012-05-07 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/53239
+ * g++.dg/opt/vrp3.C: New test.
+ * g++.dg/opt/vrp3-aux.cc: New file.
+ * g++.dg/opt/vrp3.h: New file.
+
2012-05-07 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
* g++.dg/debug/dwarf2/nested-3.C: Allow for / comments and missing
diff --git a/gcc/testsuite/g++.dg/opt/vrp3-aux.cc b/gcc/testsuite/g++.dg/opt/vrp3-aux.cc
new file mode 100644
index 0000000..fb68f6b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/opt/vrp3-aux.cc
@@ -0,0 +1,21 @@
+// { dg-do compile }
+// { dg-options "" }
+
+#include "vrp3.h"
+
+R::R ()
+{
+ r1 = r2 = 1;
+}
+
+R::R (int n, int d)
+{
+ r1 = n;
+ r2 = d;
+}
+
+int
+R::compare (R const &r, R const &s)
+{
+ return (int) (r.r1 * s.r2 - s.r1 * r.r2);
+}
diff --git a/gcc/testsuite/g++.dg/opt/vrp3.C b/gcc/testsuite/g++.dg/opt/vrp3.C
new file mode 100644
index 0000000..90162bf
--- /dev/null
+++ b/gcc/testsuite/g++.dg/opt/vrp3.C
@@ -0,0 +1,47 @@
+// PR tree-optimization/53239
+// { dg-do run }
+// { dg-options "-O2" }
+// { dg-additional-sources "vrp3-aux.cc" }
+
+#include "vrp3.h"
+
+struct M
+{
+ M (R m);
+ R val;
+ static int compare (M const &, M const &);
+};
+
+inline M const &
+min (M const & t1, M const & t2)
+{
+ return R::compare (t1.val, t2.val) < 0 ? t1 : t2;
+}
+
+M::M (R m)
+{
+ val = m;
+}
+
+M
+test (M *x)
+{
+ M n (R (0, 0));
+
+ for (int i = 0; i < 2; i++)
+ {
+ M p = x[i];
+ n = min (n, p);
+ }
+
+ if (n.val.r2 != 2 || n.val.r1 != 1)
+ __builtin_abort ();
+ return n;
+}
+
+int
+main ()
+{
+ M x[2] = { M (R (1, 2)), M (R (1, 1)) };
+ test (x);
+}
diff --git a/gcc/testsuite/g++.dg/opt/vrp3.h b/gcc/testsuite/g++.dg/opt/vrp3.h
new file mode 100644
index 0000000..0e97d0c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/opt/vrp3.h
@@ -0,0 +1,9 @@
+struct R
+{
+ long long r1, r2;
+ void copy (R const &r) { r1 = r.r1; r2 = r.r2; }
+ R ();
+ explicit R (int, int);
+ R (R const &r) { copy (r); }
+ static int compare (R const &, R const &);
+};
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c
index 9066096..72c647f 100644
--- a/gcc/tree-vrp.c
+++ b/gcc/tree-vrp.c
@@ -695,17 +695,22 @@ get_value_range (const_tree var)
/* If VAR is a default definition of a parameter, the variable can
take any value in VAR's type. */
sym = SSA_NAME_VAR (var);
- if (SSA_NAME_IS_DEFAULT_DEF (var)
- && TREE_CODE (sym) == PARM_DECL)
- {
- /* Try to use the "nonnull" attribute to create ~[0, 0]
- anti-ranges for pointers. Note that this is only valid with
- default definitions of PARM_DECLs. */
- if (POINTER_TYPE_P (TREE_TYPE (sym))
- && nonnull_arg_p (sym))
+ if (SSA_NAME_IS_DEFAULT_DEF (var))
+ {
+ if (TREE_CODE (sym) == PARM_DECL)
+ {
+ /* Try to use the "nonnull" attribute to create ~[0, 0]
+ anti-ranges for pointers. Note that this is only valid with
+ default definitions of PARM_DECLs. */
+ if (POINTER_TYPE_P (TREE_TYPE (sym))
+ && nonnull_arg_p (sym))
+ set_value_range_to_nonnull (vr, TREE_TYPE (sym));
+ else
+ set_value_range_to_varying (vr);
+ }
+ else if (TREE_CODE (sym) == RESULT_DECL
+ && DECL_BY_REFERENCE (sym))
set_value_range_to_nonnull (vr, TREE_TYPE (sym));
- else
- set_value_range_to_varying (vr);
}
return vr;