+2018-10-28 Kugan Vivekanandarajah <kuganv@linaro.org>
+
+ * doc/generic.texi (ABSU_EXPR): Document.
+ * match.pd (absu(x)*absu(x) -> x*x): Handle.
+ (absu(absu(X)) -> absu(X)): Likewise.
+ (absu(-X) -> absu(X)): Likewise.
+ (absu(X) where X is nonnegative -> X): Likewise.
+
2018-10-28 Iain Buclaw <ibuclaw@gdcproject.org>
* Makefile.in (tm_d_file_list, tm_d_include_list): New variables.
@subsection Unary and Binary Expressions
@tindex NEGATE_EXPR
@tindex ABS_EXPR
+@tindex ABSU_EXPR
@tindex BIT_NOT_EXPR
@tindex TRUTH_NOT_EXPR
@tindex PREDECREMENT_EXPR
to implement the C99 @code{cabs}, @code{cabsf} and @code{cabsl}
built-in functions.
+@item ABSU_EXPR
+These nodes represent the absolute value of the single operand in
+equivalent unsigned type such that @code{ABSU_EXPR} of TYPE_MIN is
+well defined.
+
@item BIT_NOT_EXPR
These nodes represent bitwise complement, and will always have integral
type. The only operand is the value to be complemented.
(mult (abs@1 @0) @1)
(mult @0 @0))
+/* Convert absu(x)*absu(x) -> x*x. */
+(simplify
+ (mult (absu@1 @0) @1)
+ (mult (convert@2 @0) @2))
+
/* cos(copysign(x, y)) -> cos(x). Similarly for cosh. */
(for coss (COS COSH)
copysigns (COPYSIGN)
&& tree_nop_conversion_p (type, TREE_TYPE (@2)))
(bit_xor (convert @1) (convert @2))))
+/* Convert abs (abs (X)) into abs (X).
+ also absu (absu (X)) into absu (X). */
(simplify
(abs (abs@1 @0))
@1)
+
+(simplify
+ (absu (convert@2 (absu@1 @0)))
+ (if (tree_nop_conversion_p (TREE_TYPE (@2), TREE_TYPE (@1)))
+ @1))
+
+/* Convert abs[u] (-X) -> abs[u] (X). */
(simplify
(abs (negate @0))
(abs @0))
+
+(simplify
+ (absu (negate @0))
+ (absu @0))
+
+/* Convert abs[u] (X) where X is nonnegative -> (X). */
(simplify
(abs tree_expr_nonnegative_p@0)
@0)
+(simplify
+ (absu tree_expr_nonnegative_p@0)
+ (convert @0))
+
/* A few cases of fold-const.c negate_expr_p predicate. */
(match negate_expr_p
INTEGER_CST
+2018-10-28 Kugan Vivekanandarajah <kuganv@linaro.org>
+
+ * gcc.dg/gimplefe-30.c: New test.
+ * gcc.dg/gimplefe-31.c: New test.
+ * gcc.dg/gimplefe-32.c: New test.
+ * gcc.dg/gimplefe-33.c: New test.
+
2018-10-28 Iain Buclaw <ibuclaw@gdcproject.org>
* gcc.misc-tests/help.exp: Add D to option descriptions check.
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O -fgimple -fdump-tree-optimized" } */
+
+unsigned int __GIMPLE() f(int a)
+{
+ unsigned int t0;
+ unsigned int t1;
+ unsigned int t2;
+ t0 = __ABSU a;
+ t1 = __ABSU a;
+ t2 = t0 * t1;
+ return t2;
+}
+
+
+/* { dg-final { scan-tree-dump-times "ABSU" 0 "optimized" } } */
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O -fgimple -fdump-tree-optimized" } */
+
+
+unsigned int __GIMPLE() f(int a)
+{
+ unsigned int t0;
+ int t1;
+ unsigned int t2;
+ t0 = __ABSU a;
+ t1 = (int) t0;
+ t2 = __ABSU t1;
+ return t2;
+}
+
+/* { dg-final { scan-tree-dump-times "ABSU" 1 "optimized" } } */
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O -fgimple -fdump-tree-optimized" } */
+
+unsigned int __GIMPLE() f(int a)
+{
+ int t0;
+ unsigned int t1;
+ t0 = -a;
+ t1 = __ABSU a;
+ return t1;
+}
+
+
+/* { dg-final { scan-tree-dump-times "= -" 0 "optimized" } } */
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O -fgimple -fdump-tree-optimized" } */
+
+int __GIMPLE() f(int c)
+{
+ int D;
+ int _1;
+ unsigned int _2;
+ _1 = __ABS c;
+ _2 = __ABSU _1;
+ D = (int) _2;
+ return D;
+}
+
+
+/* { dg-final { scan-tree-dump-times "ABSU" 0 "optimized" } } */