aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJanne Blomqvist <jb@gcc.gnu.org>2007-07-01 19:24:38 +0300
committerJanne Blomqvist <jb@gcc.gnu.org>2007-07-01 19:24:38 +0300
commit31c97dfe34220de54c1d93ce858af83bfda31fd3 (patch)
tree15fabe5c15ab032733629223977c9d3590761024 /gcc
parentc7b6844eb5412f068bbb097d4129fbc5181a3d67 (diff)
downloadgcc-31c97dfe34220de54c1d93ce858af83bfda31fd3.zip
gcc-31c97dfe34220de54c1d93ce858af83bfda31fd3.tar.gz
gcc-31c97dfe34220de54c1d93ce858af83bfda31fd3.tar.bz2
re PR fortran/32239 (optimize power in loops, use __builtin_powi instead of _gfortran_pow_r4_i4)
gcc/fortran: 2007-07-01 Janne Blomqvist <jb@gcc.gnu.org> PR fortran/32239 * trans-expr.c (gfc_conv_power_op): Use builtin_powi for real**int4 powers. * f95-lang.c (gfc_init_builtin_functions): Add builtin_powi to the builtins table. libgfortran: 2007-07-01 Janne Blomqvist <jb@gcc.gnu.org> PR fortran/32239 * Makefile.am: Don't generate real**int4 pow functions. * gfortran.map: Remove real**int4 pow symbols. * Makefile.in: Regenerated. testsuite 2007-07-01 Janne Blomqvist <jb@gcc.gnu.org> PR fortran/32239 * gfortran.fortran-torture/execute/intrinsic_fraction_exponent.f90 (test_4): Use proper test for floating point equality. (test_8): Likewise. From-SVN: r126175
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog8
-rw-r--r--gcc/fortran/f95-lang.c7
-rw-r--r--gcc/fortran/trans-expr.c29
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/gfortran.fortran-torture/execute/intrinsic_fraction_exponent.f904
5 files changed, 50 insertions, 5 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index d76029d..d0fe5d7 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,5 +1,13 @@
2007-07-01 Janne Blomqvist <jb@gcc.gnu.org>
+ PR fortran/32239
+ * trans-expr.c (gfc_conv_power_op): Use builtin_powi for
+ real**int4 powers.
+ * f95-lang.c (gfc_init_builtin_functions): Add builtin_powi to the
+ builtins table.
+
+2007-07-01 Janne Blomqvist <jb@gcc.gnu.org>
+
* trans.h: Remove decls for 64-bit allocation functions.
* trans-array.c (gfc_grow_array): Always pick the standard realloc
function decl.
diff --git a/gcc/fortran/f95-lang.c b/gcc/fortran/f95-lang.c
index 558ba0c..314fc37 100644
--- a/gcc/fortran/f95-lang.c
+++ b/gcc/fortran/f95-lang.c
@@ -950,6 +950,13 @@ gfc_init_builtin_functions (void)
BUILT_IN_POW, "pow", true);
gfc_define_builtin ("__builtin_powf", mfunc_float[1],
BUILT_IN_POWF, "powf", true);
+ gfc_define_builtin ("__builtin_powil", mfunc_longdouble[2],
+ BUILT_IN_POWIL, "powil", true);
+ gfc_define_builtin ("__builtin_powi", mfunc_double[2],
+ BUILT_IN_POWI, "powi", true);
+ gfc_define_builtin ("__builtin_powif", mfunc_float[2],
+ BUILT_IN_POWIF, "powif", true);
+
if (TARGET_C99_FUNCTIONS)
{
diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c
index a466935..d70e4d5 100644
--- a/gcc/fortran/trans-expr.c
+++ b/gcc/fortran/trans-expr.c
@@ -780,9 +780,9 @@ gfc_conv_power_op (gfc_se * se, gfc_expr * expr)
gfc_add_block_to_block (&se->pre, &rse.pre);
if (expr->value.op.op2->ts.type == BT_INTEGER
- && expr->value.op.op2->expr_type == EXPR_CONSTANT)
+ && expr->value.op.op2->expr_type == EXPR_CONSTANT)
if (gfc_conv_cst_int_power (se, lse.expr, rse.expr))
- return;
+ return;
gfc_int4_type_node = gfc_get_int_type (4);
@@ -852,7 +852,30 @@ gfc_conv_power_op (gfc_se * se, gfc_expr * expr)
break;
case BT_REAL:
- fndecl = gfor_fndecl_math_powi[kind][ikind].real;
+ /* Use builtins for real ** int4. */
+ if (ikind == 0)
+ {
+ switch (kind)
+ {
+ case 0:
+ fndecl = built_in_decls[BUILT_IN_POWIF];
+ break;
+
+ case 1:
+ fndecl = built_in_decls[BUILT_IN_POWI];
+ break;
+
+ case 2:
+ case 3:
+ fndecl = built_in_decls[BUILT_IN_POWIL];
+ break;
+
+ default:
+ gcc_unreachable ();
+ }
+ }
+ else
+ fndecl = gfor_fndecl_math_powi[kind][ikind].real;
break;
case BT_COMPLEX:
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 2a7786c..6a556cd 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2007-07-01 Janne Blomqvist <jb@gcc.gnu.org>
+
+ PR fortran/32239
+ * gfortran.fortran-torture/execute/intrinsic_fraction_exponent.f90
+ (test_4): Use proper test for floating point equality.
+ (test_8): Likewise.
+
2007-06-29 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR libgfortran/32554
diff --git a/gcc/testsuite/gfortran.fortran-torture/execute/intrinsic_fraction_exponent.f90 b/gcc/testsuite/gfortran.fortran-torture/execute/intrinsic_fraction_exponent.f90
index a22d0b9..c469cb4 100644
--- a/gcc/testsuite/gfortran.fortran-torture/execute/intrinsic_fraction_exponent.f90
+++ b/gcc/testsuite/gfortran.fortran-torture/execute/intrinsic_fraction_exponent.f90
@@ -66,7 +66,7 @@ if (z .gt. 0) then
else
y = (y / 2.) * (2. ** (z + 1))
end if
-if (abs (x - y) .gt. abs(x * 1e-6)) call abort()
+if (abs (x - y) .gt. spacing (max (abs (x), abs (y)))) call abort()
end
subroutine test_8(x)
@@ -79,6 +79,6 @@ if (z .gt. 0) then
else
y = (y / 2._8) * (2._8 ** (z + 1))
end if
-if (abs (x - y) .gt. abs(x * 1e-6)) call abort()
+if (abs (x - y) .gt. spacing (max (abs (x), abs(y)))) call abort()
end