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 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.


> 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?

>
> --
> H.J.


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