Commit Message

Hi,
I have attached a patch to fix PR57756. Description: The
following program,
__attribute__((always_inline,target("sse4.2")))
__inline int callee ()
{
return 0;
}
__attribute__((target("sse")))
__inline int caller ()
{
return callee();
}
does not generate an error and callee is inlined into caller. This is
because callee has a higher target ISA. Interchanging the position of
caller and callee will generate the correct error. Also, removing the
target attribute from caller will generate the error.
The reason for the bug is that when the caller's target options are
processed, global_options contain the ISA flags of the callee
(previously processed) and doing this in i386-common.c, where opts is
global_options:
opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSE_SET;
is not changing global options. The fix is to reset global_options to
the default each time a new target option needs to be processed.
Patch ok?
Thanks
Sri
* config/i386/i386.c (ix86_valid_target_attribute_p): Restore
global_options to default before modifying it.
* gcc.target/i386/pr57756.c: New test.

Comments

On Wed, Aug 14, 2013 at 3:38 AM, Richard Biener
<richard.guenther@gmail.com> wrote:
> On Wed, Aug 14, 2013 at 2:02 AM, Sriraman Tallam <tmsriram@google.com>> wrote:>>>> Hi,>>>> I have attached a patch to fix PR57756. Description: The>> following program,>>>> __attribute__((always_inline,target("sse4.2")))>> __inline int callee ()>> {>> return 0;>> }>>>> __attribute__((target("sse")))>> __inline int caller ()>> {>> return callee();>> }>>>> does not generate an error and callee is inlined into caller. This is>> because callee has a higher target ISA. Interchanging the position of>> caller and callee will generate the correct error. Also, removing the>> target attribute from caller will generate the error.>>>> The reason for the bug is that when the caller's target options are>> processed, global_options contain the ISA flags of the callee>> (previously processed) and doing this in i386-common.c, where opts is>> global_options:>>>> opts->x_ix86_isa_flags |= OPTION_MASK_ISA_SSE_SET;>>>> is not changing global options. The fix is to reset global_options to>> the default each time a new target option needs to be processed.>>> Shouldn't ix86_valid_target_attribute_tree be refactored to work on a> selected> opt structure rather than global_options?
Yes, that would be the ideal fix. The code here seems hairy and many
functions set and use global_options directly (in the call chain of
ix86_valid_target_attribute_tree). I will take a stab at it.
Thanks
Sri
>> Richard.>>>>> Patch ok?>>>> Thanks>> Sri>>