+2005-02-03 Richard Guenther <rguenth@gcc.gnu.org>
+
+ PR middle-end/19775
+
+ * builtins.c (fold_builtin_sqrt): Transform
+ sqrt(pow(x,y)) to pow(fabs(x),y*0.5), not
+ pow(x,y*0.5).
+
2005-02-01 Richard Earnshaw <rearnsha@arm.com>
PR target/16201
return build_function_call_expr (expfn, arglist);
}
- /* Optimize sqrt(pow(x,y)) = pow(x,y*0.5). */
+ /* Optimize sqrt(pow(x,y)) = pow(|x|,y*0.5). */
if (flag_unsafe_math_optimizations
&& (fcode == BUILT_IN_POW
|| fcode == BUILT_IN_POWF
tree powfn = TREE_OPERAND (TREE_OPERAND (arg, 0), 0);
tree arg0 = TREE_VALUE (TREE_OPERAND (arg, 1));
tree arg1 = TREE_VALUE (TREE_CHAIN (TREE_OPERAND (arg, 1)));
- tree narg1 = fold (build (MULT_EXPR, type, arg1,
- build_real (type, dconsthalf)));
+ tree narg1;
+ if (!tree_expr_nonnegative_p (arg0))
+ arg0 = build1 (ABS_EXPR, type, arg0);
+ narg1 = fold (build (MULT_EXPR, type, arg1,
+ build_real (type, dconsthalf)));
arglist = tree_cons (NULL_TREE, arg0,
build_tree_list (NULL_TREE, narg1));
return build_function_call_expr (powfn, arglist);
+2005-02-03 Richard Guenther <rguenth@gcc.gnu.org>
+
+ PR middle-end/19775
+
+ * gcc.dg/builtins-10.c: Disable test for
+ invalid transformation and one test we no
+ longer optimize.
+ * gcc.dg/builtins-47.c: New testcase.
+
2005-02-01 Alexandre Oliva <aoliva@redhat.com>
* g++.dg/parse/typename7.C: Adjust error messages.
extern double log(double);
extern double sqrt(double);
extern double pow(double,double);
+extern double fabs(double);
void test(double x)
{
- if (sqrt(pow(x,4.0)) != x*x)
- link_error ();
+ /*if (sqrt(pow(x,4.0)) != x*x)
+ link_error ();*/
if (pow(sqrt(x),4.0) != x*x)
link_error ();
void test2(double x, double y, double z)
{
- if (sqrt(pow(x,y)) != pow(x,y*0.5))
+ if (sqrt(pow(x,y)) != pow(fabs(x),y*0.5))
link_error ();
if (log(pow(x,y)) != y*log(x))
--- /dev/null
+/* { dg-do run } */
+/* { dg-options "-ffast-math" } */
+
+extern double sqrt (double);
+extern double pow (double, double);
+extern void abort (void);
+
+int main ()
+{
+ double x = -1.0;
+ if (sqrt (pow (x, 2)) != 1.0)
+ abort();
+ if (sqrt (x*x) != 1.0)
+ abort();
+ return 0;
+}