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