> It looks like parse_optimize_options has nothing c-family specific in
> it, so it could be moved to attribs.c. Then you'd use
> build_optimization_node to set DECL_FUNCTION_SPECIFIC_OPTIMIZATION, as
> done in c-common.c:handle_optimize_attribute.

Yep, I’ve done it that way, it works fine.

There’s one surprise: a few flags (flag_finite_math_only, flag_signed_zeros, 
flag_trapping_math, flag_unsafe_math_optimizations) seem to appear or disappear 
when I set specific flags for a function. What I do is this:

--------------------
static void
add_ieee_options (tree fndecl)
{
  struct cl_optimization cur_opts;

  /* Save current options.  */
  cl_optimization_save (&cur_opts, &global_options);

  /* Parse options, and update the vector.  */
 /*  parse_optimize_options (opts, true);*/
  DECL_FUNCTION_SPECIFIC_OPTIMIZATION (fndecl)
    = build_optimization_node (&global_options);

  debug_tree (optimization_current_node);
  debug_tree (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (fndecl));

  /* Restore current options.  */
  cl_optimization_restore (&global_options, &cur_opts);
}
--------------------

So, even if I don’t change anything to the local options (global is: -O3 
-ffast-math), I see some differences between “optimization_current_node” and 
"DECL_FUNCTION_SPECIFIC_OPTIMIZATION (fndecl)”:

> 1,3d0
> <     align_functions (0x10)
> <     align_jumps (0x10)
> <     align_loops (0x10)
> 26d22
> <     flag_finite_math_only (0x1)
> 71a68
> >     flag_signed_zeros (0x1)
> 78a76
> >     flag_trapping_math (0x1)
> 113d110
> <     flag_unsafe_math_optimizations (0x1)


Is that a bug in optimization handling, or am I missing something?

FX


Reply via email to