On Tue, 12 Nov 2013 17:50:27, Sriraman Tallam wrote:
>
> On Tue, Nov 12, 2013 at 5:17 PM, Sriraman Tallam <tmsri...@google.com> wrote:
>> On Tue, Nov 12, 2013 at 2:53 PM, Bernd Edlinger
>> <bernd.edlin...@hotmail.de> wrote:
>>> Hi,
>>>
>>>
>>> On Tue, 12 Nov 2013 10:30:16, Sriraman Tallam wrote:
>>>>
>>>> On Mon, Nov 11, 2013 at 11:30 PM, Uros Bizjak <ubiz...@gmail.com> wrote:
>>>>> There was something wrong with Bernd's address, retrying.
>>>>>
>>>>>>> Currently on trunk the option -mpreferred-stack-boundary does not work
>>>>>>> together with #pragma GCC target("sse") or 
>>>>>>> __attribute__((target("sse"))).
>>>>>>>
>>>>>>> There is already a test case that detects this: 
>>>>>>> gcc.target/i386/fastcall-sseregparm.c
>>>>>>>
>>>>>>> The attached patch fixes this test case under i686-pc-linux-gnu.
>>>>>>>
>>>>>>> Boot-strapped and regression-tested under i686-pc-linux-gnu.
>>>>>>>
>>>>>>> OK for trunk?
>>
>> No, this is not what I had in mind. This is simply reverting my
>> refactoring work which was to make ix86_option_override_internal get
>> rid of the global_options dependency. Here is the problem:
>> global_options gets some flags set after command-line options are read
>> (ix86_preferred_stack_boundary_arg in this case). But, this does not
>> get saved into target_option_default_node because there is no
>> corresponding field in cl_target_option for
>> ix86_preferred_stack_boundary_arg. So, when you restore
>> target_option_default_node to func_options in
>> ix86_valid_target_attribute_p, this particular flag does not get
>> copied. So, you can either copy this explicitly to func_options which
>> was your first patch or you could extend cl_target_option to include
>> this field too which is done by making
>> ix86_preferred_stack_boundary_arg a Variable in i386.opt. The latter
>> is cleaner because it always saves the default flags into
>> target_option_default_node.
>
> I quickly hacked up what I had in mind and attached the patch. Can you
> check if this fixes your problem?
>
> Thanks
> Sri
>
>

Well, this way it could be fixed too. 

But opts->x_ix86_preferred_stack_bounary_arg is not dependent on any
pragma or target attribute. Correct me if that is wrong.

And this code 

  if (opts_set->x_ix86_preferred_stack_boundary_arg)
    {
      int min = (TARGET_64BIT_P (opts->x_ix86_isa_flags)
                 ? (TARGET_SSE_P (opts->x_ix86_isa_flags) ? 4 : 3) : 2);
      int max = (TARGET_SEH ? 4 : 12);

      if (opts->x_ix86_preferred_stack_boundary_arg < min
          || opts->x_ix86_preferred_stack_boundary_arg> max)

checks func_options against global_options_set:

  new_target = ix86_valid_target_attribute_tree (args, &func_options,
                                                 &global_options_set);

So this code as it is will fail if this option was ever made target specific.
There is still a reason why this check needs to be executed each time
the opts->x_ix86_isa_flags changes.

Because of this I still would prefer my second attempt of fixing this issue,
because it is simple and it removes the different handling between
-mpreferred-stack-boundary and -mincoming-stack-boundary.

If that should be re-factored for any reason, I think all similar options
should be changed on one sweep. But in that case the global_options_set
must somehow also become target specific.
And we need to invent something like a target pragma to change this options
because it must somehow be possible to test this code.

Thanks
Bernd.

>>
>> Thanks
>> Sri
>>
>>
>>>>>>
>>>>>> I'm not experienced enough in this new option handling stuff, let's
>>>>>> ask Sriraman for his opinion on the patch.
>>>>
>>>>
>>>> I do not think this is the right fix, I am wondering how many other
>>>> target flags we may have to copy this way from global_options. I
>>>> notice that other flags like ix86_regparm and
>>>> ix86_incoming_stack_boundary_arg are very similar. Why should this
>>>> need to be restored from global_options explicitly? This patch may fix
>>>> the issue but it seems like a hack to me. We should be able to restore
>>>> whatever we need from target_option_default_node via
>>>> ix86_function_specific_restore. Maybe modifying the i386.opt file to
>>>> make ix86_preferred_stack_boundary_arg a variable might fix it. See
>>>> ix86_isa_flags for instance in i386.opt.
>>>>
>>>>
>>>> Please let me know what you think.
>>>
>>> Thanks, now I see what you mean. I can change it the other way round
>>> and implement ix86_preferred_stack_boundary like 
>>> ix86_incoming_stack_boundary.
>>>
>>> using this define in options.h:
>>> #define ix86_preferred_stack_boundary_arg 
>>> global_options.x_ix86_preferred_stack_boundary_arg
>>>
>>> the global option is never copied into function specific options.
>>>
>>> Attached is the updated patch.
>>>
>>> OK for trunk after boot-strap and regression-testing?
>>>
>>> Bernd.
>>>
>>>
>>> PS: I have one more patch pending, and would like to know what you think
>>> about it: http://gcc.gnu.org/ml/gcc-patches/2013-11/msg00133.html
>>> That has also to do with global state variables that are modified due to
>>> target options, and initially I was expecting that the patch for PR57756 
>>> would
>>> be fixing it automatically, but I was wrong...
>>>
>>>>
>>>> Thanks
>>>> Sri
>>>>
>>>>
>>>>>
>>>>> Uros.                                       

Reply via email to