on 2021/12/9 上午9:43, Jeff Law wrote:
>
>
> On 12/6/2021 7:15 PM, Kewen.Lin via Gcc-patches wrote:
>> Hi,
>>
>> For a function with optimize pragma, it's possible that the target
>> options change as optimization options change. Now we create one
>> optimization option node when parsing pragma optimize, but don't
>> create target option node for possible target option changes. It
>> makes later processing not detect the target options have actually
>> changed and doesn't update the target options accordingly.
>>
>> This patch is to check whether target options have changed when
>> creating one optimization option node for pragma optimize, and
>> make one target option node if needed. The associated test case
>> shows the difference. Without this patch, the function foo1 will
>> perform unrolling which is unexpected. The reason is that flag
>> unroll_only_small_loops isn't correctly set for it. The value
>> is updated after parsing function foo2, but doesn't get restored
>> later since both decls don't have DECL_FUNCTION_SPECIFIC_TARGET
>> set and the hook think we don't need to switch. With this patch,
>> there is no unrolling for foo1, which is also consistent with the
>> behavior by replacing pragma by attribute whether w/ and w/o this
>> patch.
>>
>> Bootstrapped and regtested on x86_64-redhat-linux, aarch64-linux-gnu
>> and powerpc64{,le}-linux-gnu.
>>
>> Is it ok for trunk?
>>
>> BR,
>> Kewen
>> ---
>> gcc/ChangeLog:
>>
>> PR target/103515
>> * attribs.c (decl_attributes): Check if target options change and
>> create one node if so.
>>
>> gcc/testsuite/ChangeLog:
>>
>> PR target/103515
>> * gcc.target/powerpc/pr103515.c: New test.
> OK
> jeff
>
Thanks for the review, Jeff! Committed as r12-5920.
BR,
Kewen