aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYury Gribov <tetra2005@gmail.com>2018-10-22 20:26:32 +0000
committerYury Gribov <ygribov@gcc.gnu.org>2018-10-22 20:26:32 +0000
commitf38428472d7dfd61cc0397cc85eb45b8f7fe0348 (patch)
treeab2d0addcc8414a6fe5e32c12caf572d093e5246
parent8d2d39587d941a40f25ea0144cceb677df115040 (diff)
downloadgcc-f38428472d7dfd61cc0397cc85eb45b8f7fe0348.zip
gcc-f38428472d7dfd61cc0397cc85eb45b8f7fe0348.tar.gz
gcc-f38428472d7dfd61cc0397cc85eb45b8f7fe0348.tar.bz2
re PR tree-optimization/87633 (ice in compare_range_wit h_value, at vr-values.c:1702)
2018-10-22 Yury Gribov <tetra2005@gmail.com> gcc/ PR tree-optimization/87633 * match.pd: Do not generate unordered integer comparisons. gcc/testsuite/ PR tree-optimization/87633 * g++.dg/pr87633.C: New test. From-SVN: r265399
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/match.pd23
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/pr87633.C21
4 files changed, 44 insertions, 10 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 1cfcc31..472d8f7 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2018-10-22 Yury Gribov <tetra2005@gmail.com>
+
+ PR tree-optimization/87633
+ * match.pd: Do not generate unordered integer comparisons.
+
2018-10-22 Segher Boessenkool <segher@kernel.crashing.org>
PR rtl-optimization/87600
diff --git a/gcc/match.pd b/gcc/match.pd
index b36d7cc..8796a40 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -3401,7 +3401,8 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
(cmp @0 @1))))))
/* Optimize various special cases of (FTYPE) N CMP (FTYPE) M. */
-(for cmp (tcc_comparison)
+(for cmp (lt le eq ne ge gt unordered ordered unlt unle ungt unge uneq ltgt)
+ icmp (lt le eq ne ge gt unordered ordered lt le gt ge eq ne)
(simplify
(cmp (float@0 @1) (float @2))
(if (SCALAR_FLOAT_TYPE_P (TREE_TYPE (@0))
@@ -3416,15 +3417,17 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
}
(if (fmt.can_represent_integral_type_p (type1)
&& fmt.can_represent_integral_type_p (type2))
- (if (TYPE_PRECISION (type1) > TYPE_PRECISION (type2)
- && type1_signed_p >= type2_signed_p)
- (cmp @1 (convert @2))
- (if (TYPE_PRECISION (type1) < TYPE_PRECISION (type2)
- && type1_signed_p <= type2_signed_p)
- (cmp (convert:type2 @1) @2)
- (if (TYPE_PRECISION (type1) == TYPE_PRECISION (type2)
- && type1_signed_p == type2_signed_p)
- (cmp @1 @2)))))))))
+ (if (cmp == ORDERED_EXPR || cmp == UNORDERED_EXPR)
+ { constant_boolean_node (cmp == ORDERED_EXPR, type); }
+ (if (TYPE_PRECISION (type1) > TYPE_PRECISION (type2)
+ && type1_signed_p >= type2_signed_p)
+ (icmp @1 (convert @2))
+ (if (TYPE_PRECISION (type1) < TYPE_PRECISION (type2)
+ && type1_signed_p <= type2_signed_p)
+ (icmp (convert:type2 @1) @2)
+ (if (TYPE_PRECISION (type1) == TYPE_PRECISION (type2)
+ && type1_signed_p == type2_signed_p)
+ (icmp @1 @2))))))))))
/* Optimize various special cases of (FTYPE) N CMP CST. */
(for cmp (lt le eq ne ge gt)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 976b4b1..0a4700a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2018-10-22 Yury Gribov <tetra2005@gmail.com>
+
+ PR tree-optimization/87633
+ * g++.dg/pr87633.C: New test.
+
2018-10-22 Marek Polacek <polacek@redhat.com>
PR testsuite/87694
diff --git a/gcc/testsuite/g++.dg/pr87633.C b/gcc/testsuite/g++.dg/pr87633.C
new file mode 100644
index 0000000..86926cd
--- /dev/null
+++ b/gcc/testsuite/g++.dg/pr87633.C
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+
+class a {
+public:
+ double b() const;
+};
+class c {
+public:
+ int m_fn2() const;
+};
+double a::b() const {
+ return 0 == 0 ? reinterpret_cast<const c *>(this)->m_fn2() : 0;
+}
+bool d;
+void e() {
+ a f;
+ double g = f.b();
+ /* { dg-final { scan-tree-dump-not "unord" "optimized" } } */
+ d = __builtin_isnan(g);
+}