diff options
author | Kugan Vivekanandarajah <kvivekananda@nvidia.com> | 2024-09-26 15:56:06 +1000 |
---|---|---|
committer | Kugan Vivekanandarajah <kvivekananda@nvidia.com> | 2024-09-26 16:03:35 +1000 |
commit | 454371d850797600872e20da9464504cb80b0788 (patch) | |
tree | fe8905432b31cfd682631b3f144c01abe9db4d47 /gcc | |
parent | 85910e650a61de6da37e3d67a7ac208904dd3c0d (diff) | |
download | gcc-454371d850797600872e20da9464504cb80b0788.zip gcc-454371d850797600872e20da9464504cb80b0788.tar.gz gcc-454371d850797600872e20da9464504cb80b0788.tar.bz2 |
[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 <kvivekananda@nvidia.com>
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/match.pd | 56 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/absvect.C | 12 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/absfloat16.c | 14 |
3 files changed, 61 insertions, 21 deletions
diff --git a/gcc/match.pd b/gcc/match.pd index ca48c47..e06a812 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 0000000..5cf2ca3 --- /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 <x_\[0-9]*\\\(D\\\)>;" 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 0000000..a417fe2 --- /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; + } +} + |