From 268decb581d8a024b7b6652f8cf9cc7b82b3b4ee Mon Sep 17 00:00:00 2001
From: Kugan <kvivekanada@nvidia.com>
Date: Sun, 21 Jul 2024 16:22:17 +0530
Subject: [PATCH 1/2] abshalffloat[v2]

---
 gcc/match.pd                               | 44 +++++++++++++---------
 gcc/testsuite/gcc.dg/tree-ssa/absfloat16.c | 14 +++++++
 2 files changed, 41 insertions(+), 17 deletions(-)
 create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/absfloat16.c

diff --git a/gcc/match.pd b/gcc/match.pd
index 99968d316ed..0cc18aed42b 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -6122,31 +6122,41 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
 	 && bitwise_equal_p (@0, @1))
      @1))
  )
- /* A >=/> 0 ? A : -A    same as abs (A) */
+ /* (type)A >=/> 0 ? A : -A    same as abs (A) */
  (for cmp (ge gt)
   (simplify
-   (cnd (cmp @0 zerop) @1 (negate @1))
-    (if (!HONOR_SIGNED_ZEROS (TREE_TYPE(@0))
-	 && !TYPE_UNSIGNED (TREE_TYPE(@0))
-	 && bitwise_equal_p (@0, @1))
+   (cnd (cmp (convert?@0 @1) zerop) @2 (negate @2))
+    (if (!HONOR_SIGNED_ZEROS (TREE_TYPE (@1))
+	 && !TYPE_UNSIGNED (TREE_TYPE (@1))
+	 && ((VECTOR_TYPE_P (type)
+	      && tree_nop_conversion_p (TREE_TYPE (@0), TREE_TYPE (@1)))
+	    || (!VECTOR_TYPE_P (type)
+		&& (TYPE_PRECISION (TREE_TYPE (@1))
+		    <= TYPE_PRECISION (TREE_TYPE (@0)))))
+	 && bitwise_equal_p (@1, @2))
      (if (TYPE_UNSIGNED (type))
-      (absu:type @0)
-      (abs @0)))))
- /* A <=/< 0 ? A : -A    same as -abs (A) */
+      (absu:type @1)
+      (abs @1)))))
+ /* (type)A <=/< 0 ? A : -A    same as -abs (A) */
  (for cmp (le lt)
   (simplify
-   (cnd (cmp @0 zerop) @1 (negate @1))
-    (if (!HONOR_SIGNED_ZEROS (TREE_TYPE(@0))
-	 && !TYPE_UNSIGNED (TREE_TYPE(@0))
-	 && bitwise_equal_p (@0, @1))
-     (if ((ANY_INTEGRAL_TYPE_P (TREE_TYPE (@0))
-	   && !TYPE_OVERFLOW_WRAPS (TREE_TYPE (@0)))
+   (cnd (cmp (convert?@0 @1) zerop) @2 (negate @2))
+    (if (!HONOR_SIGNED_ZEROS (TREE_TYPE (@1))
+	 && !TYPE_UNSIGNED (TREE_TYPE (@1))
+	 && ((VECTOR_TYPE_P (type)
+	      && tree_nop_conversion_p (TREE_TYPE (@0), TREE_TYPE (@1)))
+	    || (!VECTOR_TYPE_P (type)
+		&& (TYPE_PRECISION (TREE_TYPE (@1))
+		    <= TYPE_PRECISION (TREE_TYPE (@0)))))
+	 && bitwise_equal_p (@1, @2))
+     (if ((ANY_INTEGRAL_TYPE_P (TREE_TYPE (@1))
+	   && !TYPE_OVERFLOW_WRAPS (TREE_TYPE (@1)))
 	  || TYPE_UNSIGNED (type))
       (with {
-	tree utype = unsigned_type_for (TREE_TYPE(@0));
+	tree utype = unsigned_type_for (TREE_TYPE (@1));
        }
-       (convert (negate (absu:utype @0))))
-       (negate (abs @0)))))
+       (convert (negate (absu:utype @1))))
+       (negate (abs @1)))))
  )
 
  /* (A - B) == 0 ? (A - B) : (B - A)    same as (B - A) */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/absfloat16.c b/gcc/testsuite/gcc.dg/tree-ssa/absfloat16.c
new file mode 100644
index 00000000000..a417fe281a9
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/absfloat16.c
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-add-options float16 } */
+/* { dg-require-effective-target float16 } */
+/* { dg-options "-Ofast -fdump-tree-optimized" } */
+/* { dg-final { scan-tree-dump-times " = ABS_EXPR <x_\[0-9]*\\\(D\\\)>;" 1 "optimized" } } */
+
+_Float16  absfloat16(_Float16 x) {
+    if (x < 0.0f) {
+        return -x;
+    } else {
+        return x;
+    }
+}
+
-- 
2.43.2

