From: Kugan Vivekanandarajah Date: Thu, 26 Sep 2024 05:56:06 +0000 (+1000) Subject: [match.pd] Handle abs pattern with convert X-Git-Tag: basepoints/gcc-16~5666 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=454371d850797600872e20da9464504cb80b0788;p=thirdparty%2Fgcc.git [match.pd] Handle abs pattern with convert gcc/ChangeLog: * match.pd: Extend A CMP 0 ? A : -A into (type)A CMP 0 ? A : -A. Extend A CMP 0 ? A : -A into (type) A CMP 0 ? A : -A. gcc/testsuite/ChangeLog: * g++.dg/absvect.C: New test. * gcc.dg/tree-ssa/absfloat16.c: New test. Signed-off-by: Kugan Vivekanandarajah --- diff --git a/gcc/match.pd b/gcc/match.pd index ca48c47fcc4..e06a812e976 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -6467,31 +6467,45 @@ 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)) - (if (TYPE_UNSIGNED (type)) - (absu:type @0) - (abs @0))))) - /* 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))) - || TYPE_UNSIGNED (type)) + (cnd (cmp (convert?@0 @1) zerop) @2 (negate @2)) + (if (!HONOR_SIGNED_ZEROS (TREE_TYPE (@1)) + /* Support SEXT of @0 only. */ + && !TYPE_UNSIGNED (TREE_TYPE (@1)) + && element_precision (@1) + <= element_precision (@0) + && bitwise_equal_p (@1, @2)) + (if (TYPE_UNSIGNED (TREE_TYPE (@2))) (with { - tree utype = unsigned_type_for (TREE_TYPE(@0)); + tree stype = signed_type_for (TREE_TYPE (@2)); } - (convert (negate (absu:utype @0)))) - (negate (abs @0))))) + (if (types_match (@0, stype)) + (absu @0) + (absu (convert:stype @2)))) + (abs @2))))) + /* (type)A <=/< 0 ? A : -A same as -abs (A) */ + (for cmp (le lt) + (simplify + (cnd (cmp (convert?@0 @1) zerop) @2 (negate @2)) + (if (!HONOR_SIGNED_ZEROS (TREE_TYPE (@1)) + /* Support SEXT of @0 only. */ + && !TYPE_UNSIGNED (TREE_TYPE (@1)) + && element_precision (@1) + <= element_precision (@0) + && bitwise_equal_p (@1, @2)) + (if ((ANY_INTEGRAL_TYPE_P (TREE_TYPE (@2)) + && !TYPE_OVERFLOW_WRAPS (TREE_TYPE (@2))) + || TYPE_UNSIGNED (TREE_TYPE (@2))) + (with { + tree stype = signed_type_for (TREE_TYPE (@2)); + tree utype = unsigned_type_for (TREE_TYPE (@2)); + } + (if (types_match (@0, stype)) + (convert (negate (absu:utype @0))) + (convert (negate (absu:utype (convert:stype @2)))))) + (convert (negate (abs @2)))))) ) /* (A - B) == 0 ? (A - B) : (B - A) same as (B - A) */ diff --git a/gcc/testsuite/g++.dg/absvect.C b/gcc/testsuite/g++.dg/absvect.C new file mode 100644 index 00000000000..5cf2ca307f4 --- /dev/null +++ b/gcc/testsuite/g++.dg/absvect.C @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-Ofast -fdump-tree-phiopt1" } */ +/* { dg-final { scan-tree-dump-times " = ABS_EXPR ;" 1 "phiopt1" } } */ + +typedef int v2si __attribute__ ((vector_size (2 * sizeof(int)))); +typedef short v2hi __attribute__ ((vector_size (2 * sizeof(short)))); + +v2hi absvect1 (v2hi x, int i) { + v2hi neg = -x; + return (x > 0) ? x : neg; +} + 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 ;" 1 "optimized" } } */ + +_Float16 absfloat16(_Float16 x) { + if (x < 0.0f) { + return -x; + } else { + return x; + } +} +