public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r14-3721] MATCH: `(nop_convert)-(convert)a` into -(convert)a if we are converting from something smaller
@ 2023-09-05 21:16 Andrew Pinski
  0 siblings, 0 replies; only message in thread
From: Andrew Pinski @ 2023-09-05 21:16 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:e6bcf83989478348428c732c11e6c0f1719e9214

commit r14-3721-ge6bcf83989478348428c732c11e6c0f1719e9214
Author: Andrew Pinski <apinski@marvell.com>
Date:   Thu Aug 31 16:17:35 2023 -0700

    MATCH: `(nop_convert)-(convert)a` into -(convert)a if we are converting from something smaller
    
    This allows removal of one conversion and in the case of booleans, might be able to remove
    the negate and the other conversion later on.
    
    OK? Bootstrapped and tested on x86_64-linux-gnu with no regressions.
    
            PR tree-optimization/107137
    
    gcc/ChangeLog:
    
            * match.pd (`(nop_convert)-(convert)a`): New pattern.
    
    gcc/testsuite/ChangeLog:
    
            * gcc.dg/tree-ssa/neg-cast-2.c: New test.
            * gcc.dg/tree-ssa/neg-cast-3.c: New test.

Diff:
---
 gcc/match.pd                               | 11 +++++++++++
 gcc/testsuite/gcc.dg/tree-ssa/neg-cast-2.c | 20 ++++++++++++++++++++
 gcc/testsuite/gcc.dg/tree-ssa/neg-cast-3.c | 15 +++++++++++++++
 3 files changed, 46 insertions(+)

diff --git a/gcc/match.pd b/gcc/match.pd
index bccd227b7352..41382f73a2f9 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -1039,6 +1039,17 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
 #undef exact_mod
 #endif
 
+/* (nop_outer_cast)-(inner_cast)var -> -(outer_cast)(var)
+   if var is smaller in precision.
+   This is always safe for both doing the negative in signed or unsigned
+   as the value for undefined will not show up.  */
+(simplify
+ (convert (negate:s@1 (convert:s @0)))
+ (if (INTEGRAL_TYPE_P (type)
+      && tree_nop_conversion_p (type, TREE_TYPE (@1))
+      && TYPE_PRECISION (type) > TYPE_PRECISION (TREE_TYPE (@0)))
+    (negate (convert @0))))
+
 (for op (negate abs)
  /* Simplify cos(-x) and cos(|x|) -> cos(x).  Similarly for cosh.  */
  (for coss (COS COSH)
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/neg-cast-2.c b/gcc/testsuite/gcc.dg/tree-ssa/neg-cast-2.c
new file mode 100644
index 000000000000..c1d5066cd4ab
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/neg-cast-2.c
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-O1 -fdump-tree-fre1 -fdump-tree-optimized" } */
+/* part of PR tree-optimization/108397 */
+
+long long
+foo (unsigned char o)
+{
+  unsigned long long t1 = -(long long) (o == 0);
+  unsigned long long t2 = -(long long) (t1 != 0);
+  unsigned long long t3 = -(long long) (t1 <= t2);
+  return t3;
+}
+
+/* Should be able to optimize this down to just `return -1;` during fre1. */
+/* { dg-final { scan-tree-dump "return -1;" "fre1" } } */
+/* FRE does not remove all dead statements so a few negate expressions are left behind. */
+/* { dg-final { scan-tree-dump-not " -\[^1\]" "fre1" { xfail *-*-* } } } */
+
+/* { dg-final { scan-tree-dump "return -1;" "optimized" } } */
+/* { dg-final { scan-tree-dump-not " - " "optimized" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/neg-cast-3.c b/gcc/testsuite/gcc.dg/tree-ssa/neg-cast-3.c
new file mode 100644
index 000000000000..7b23ca85d1f9
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/neg-cast-3.c
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-options "-O1 -fdump-tree-forwprop1 -fdump-tree-optimized" } */
+/* PR tree-optimization/107137 */
+
+unsigned f(_Bool a)
+{
+  int t = a;
+  t = -t;
+  return t;
+}
+
+/* There should be no cast to int at all. */
+/* Forwprop1 does not remove all of the statements. */
+/* { dg-final { scan-tree-dump-not "\\\(int\\\)" "forwprop1" { xfail *-*-* } } } */
+/* { dg-final { scan-tree-dump-not "\\\(int\\\)" "optimized" } } */

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2023-09-05 21:16 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-09-05 21:16 [gcc r14-3721] MATCH: `(nop_convert)-(convert)a` into -(convert)a if we are converting from something smaller Andrew Pinski

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).