This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: User directed Function Multiversioning via Function Overloading (issue5752064)


On Wed, May 2, 2012 at 8:08 AM, Sriraman Tallam <tmsriram@google.com> wrote:
> On Wed, May 2, 2012 at 6:42 AM, H.J. Lu <hjl.tools@gmail.com> wrote:
>> On Tue, May 1, 2012 at 7:45 PM, Sriraman Tallam <tmsriram@google.com> wrote:
>>> Hi H.J,
>>>
>>> ? Done now. Patch attached.
>>>
>>> Thanks,
>>> -Sri.
>>>
>>> On Tue, May 1, 2012 at 5:08 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
>>>> On Tue, May 1, 2012 at 4:51 PM, Sriraman Tallam <tmsriram@google.com> wrote:
>>>>> Hi,
>>>>>
>>>>> New patch attached, updated test case and fixed bugs related to
>>>>> __PRETTY_FUNCTION_.
>>>>>
>>>>> Patch also available for review here: ?http://codereview.appspot.com/5752064
>>>>
>>>> @@ -0,0 +1,39 @@
>>>> +/* Simple test case to check if Multiversioning works. ?*/
>>>> +/* { dg-do run } */
>>>> +/* { dg-options "-O2 -fPIC" } */
>>>> +
>>>> +#include <assert.h>
>>>> +
>>>> +int foo ();
>>>> +int foo () __attribute__ ((target("arch=corei7,sse4.2,popcnt")));
>>>> +/* The target operands in this declaration and the definition are re-ordered.
>>>> + ? This should still work. ?*/
>>>> +int foo () __attribute__ ((target("ssse3,avx2")));
>>>> +
>>>> +int (*p)() = &foo;
>>>> +int main ()
>>>> +{
>>>> + ?return foo () + (*p)();
>>>> +}
>>>> +
>>>> +int foo ()
>>>> +{
>>>> + ?return 0;
>>>> +}
>>>> +
>>>> +int __attribute__ ((target("arch=corei7,sse4.2,popcnt")))
>>>> +foo ()
>>>> +{
>>>> + ?assert (__builtin_cpu_is ("corei7")
>>>> + ? ? ? ? && __builtin_cpu_supports ("sse4.2")
>>>> + ? ? ? ? && __builtin_cpu_supports ("popcnt"));
>>>> + ?return 0;
>>>> +}
>>>> +
>>>> +int __attribute__ ((target("avx2,ssse3")))
>>>> +foo ()
>>>> +{
>>>> + ?assert (__builtin_cpu_supports ("avx2")
>>>> + ? ? ? ? && __builtin_cpu_supports ("ssse3"));
>>>> + ?return 0;
>>>> +}
>>>>
>>>> This test will pass if
>>>>
>>>> int foo ()
>>>> {
>>>> ?return 0;
>>>> }
>>>>
>>>> is selected on processors with AVX. ?The run-time test should
>>>> check that the right function is selected on the target processor,
>>>> not the selected function matches the target attribute. You can
>>>> do it by returning different values for each foo and call cpuid
>>>> to check if the right foo is selected.
>>>>
>>>> You should add a testcase for __builtin_cpu_supports to check
>>>> all valid arguments.
>>>>
>>>> --
>>>> H.J.
>>
>> 2 questions:
>>
>> 1. ?Since AVX > SSE4 > SSSE3 > SSE3 > SSE2 > SSE, with
>> foo for AVX and SSE3, on AVX processors, which foo will be
>> selected?
>
> foo for AVX will get called since that appears ahead.
>
> The dispatching is done in the same order in which the functions are
> specified. If, potentially, two foo versions can be dispatched for an
> architecture, the first foo will get called. ?There is no way right
> now to specify the order in which the dispatching should be done.

This is very fragile.  We know ISAs and processors.  The source
order should be irrelevant.

>
>> 2. ?I don't see any tests for __builtin_cpu_supports ("XXX")
>> nor __builtin_cpu_is ("XXX"). ?I think you need tests for
>> them.
>
> This is already there as part of the previous CPU detection patch that
> was submitted. Please see gcc.target/i386/builtin_target.c. Did you
> want something else?

gcc.target/i386/builtin_target.c doesn't test if __builtin_cpu_supports ("XXX")
and __builtin_cpu_is ("XXX") are implemented correctly.


-- 
H.J.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]