aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/match.pd8
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/negneq-1.c17
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/negneq-2.c17
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/negneq-3.c20
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/negneq-4.c20
5 files changed, 80 insertions, 2 deletions
diff --git a/gcc/match.pd b/gcc/match.pd
index 941f1be..dc36927 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -5919,13 +5919,17 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
(cmp (negate @0) (negate @1))
(if (FLOAT_TYPE_P (TREE_TYPE (@0))
|| (ANY_INTEGRAL_TYPE_P (TREE_TYPE (@0))
- && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (@0))))
+ && (cmp == EQ_EXPR
+ || cmp == NE_EXPR
+ || TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (@0)))))
(scmp @0 @1)))
(simplify
(cmp (negate @0) CONSTANT_CLASS_P@1)
(if (FLOAT_TYPE_P (TREE_TYPE (@0))
|| (ANY_INTEGRAL_TYPE_P (TREE_TYPE (@0))
- && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (@0))))
+ && (cmp == EQ_EXPR
+ || cmp == NE_EXPR
+ || TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (@0)))))
(with { tree tem = const_unop (NEGATE_EXPR, TREE_TYPE (@0), @1); }
(if (tem && !TREE_OVERFLOW (tem))
(scmp @0 { tem; }))))))
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/negneq-1.c b/gcc/testsuite/gcc.dg/tree-ssa/negneq-1.c
new file mode 100644
index 0000000..94ff57d
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/negneq-1.c
@@ -0,0 +1,17 @@
+/* PR tree-optimization/110134 */
+/* { dg-do compile } */
+/* { dg-options "-O1 -fdump-tree-optimized" } */
+
+int fu(unsigned a)
+{
+ a = -a;
+ return a != 0;
+}
+int fs(signed a)
+{
+ a = -a;
+ return a != 0;
+}
+
+/* We should have optimized out the a = -a; statements. */
+/* { dg-final { scan-tree-dump-not "= -a" "optimized" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/negneq-2.c b/gcc/testsuite/gcc.dg/tree-ssa/negneq-2.c
new file mode 100644
index 0000000..9a3bb48
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/negneq-2.c
@@ -0,0 +1,17 @@
+/* PR tree-optimization/110134 */
+/* { dg-do compile } */
+/* { dg-options "-O1 -fdump-tree-optimized" } */
+
+int fu(unsigned a)
+{
+ a = -a;
+ return a == 1;
+}
+int fs(signed a)
+{
+ a = -a;
+ return a == 1;
+}
+
+/* We should have optimized out the a = -a; statements. */
+/* { dg-final { scan-tree-dump-not "= -a" "optimized" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/negneq-3.c b/gcc/testsuite/gcc.dg/tree-ssa/negneq-3.c
new file mode 100644
index 0000000..14546a6
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/negneq-3.c
@@ -0,0 +1,20 @@
+/* PR tree-optimization/110134 */
+/* { dg-do compile } */
+/* { dg-options "-O1 -fdump-tree-optimized" } */
+
+int fu(unsigned a, unsigned b)
+{
+ a = -a;
+ b = -b;
+ return a == b;
+}
+int fs(signed a, signed b)
+{
+ a = -a;
+ b = -b;
+ return a == b;
+}
+
+/* We should have optimized out the a = -; statements. */
+/* { dg-final { scan-tree-dump-not "= -a" "optimized" } } */
+/* { dg-final { scan-tree-dump-not "= -b" "optimized" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/negneq-4.c b/gcc/testsuite/gcc.dg/tree-ssa/negneq-4.c
new file mode 100644
index 0000000..1b66854
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/negneq-4.c
@@ -0,0 +1,20 @@
+/* PR tree-optimization/110134 */
+/* { dg-do compile } */
+/* { dg-options "-O1 -fdump-tree-optimized" } */
+
+int fu(unsigned a, unsigned b)
+{
+ a = -a;
+ b = -b;
+ return a != b;
+}
+int fs(signed a, signed b)
+{
+ a = -a;
+ b = -b;
+ return a != b;
+}
+
+/* We should have optimized out the a = -; statements. */
+/* { dg-final { scan-tree-dump-not "= -a" "optimized" } } */
+/* { dg-final { scan-tree-dump-not "= -b" "optimized" } } */