From 31c97dfe34220de54c1d93ce858af83bfda31fd3 Mon Sep 17 00:00:00 2001 From: Janne Blomqvist Date: Sun, 1 Jul 2007 19:24:38 +0300 Subject: re PR fortran/32239 (optimize power in loops, use __builtin_powi instead of _gfortran_pow_r4_i4) gcc/fortran: 2007-07-01 Janne Blomqvist 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 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 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 --- gcc/fortran/ChangeLog | 8 ++++++++ gcc/fortran/f95-lang.c | 7 +++++++ gcc/fortran/trans-expr.c | 29 ++++++++++++++++++++++++++--- 3 files changed, 41 insertions(+), 3 deletions(-) (limited to 'gcc/fortran') 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 + 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 + * 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: -- cgit v1.1