diff options
author | Janne Blomqvist <jb@gcc.gnu.org> | 2007-07-01 19:24:38 +0300 |
---|---|---|
committer | Janne Blomqvist <jb@gcc.gnu.org> | 2007-07-01 19:24:38 +0300 |
commit | 31c97dfe34220de54c1d93ce858af83bfda31fd3 (patch) | |
tree | 15fabe5c15ab032733629223977c9d3590761024 /gcc/fortran/trans-expr.c | |
parent | c7b6844eb5412f068bbb097d4129fbc5181a3d67 (diff) | |
download | gcc-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/fortran/trans-expr.c')
-rw-r--r-- | gcc/fortran/trans-expr.c | 29 |
1 files changed, 26 insertions, 3 deletions
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: |