On Wed, May 2, 2012 at 9:05 AM, H.J. Lu <hjl.to...@gmail.com> wrote:
> On Wed, May 2, 2012 at 8:08 AM, Sriraman Tallam <tmsri...@google.com> wrote:
>> On Wed, May 2, 2012 at 6:42 AM, H.J. Lu <hjl.to...@gmail.com> wrote:
>>> On Tue, May 1, 2012 at 7:45 PM, Sriraman Tallam <tmsri...@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.to...@gmail.com> wrote:
>>>>> On Tue, May 1, 2012 at 4:51 PM, Sriraman Tallam <tmsri...@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.

I am not sure it is always possible keep this dispatching unambiguous
to the user. It might be better to let the user specify a priority for
each version to control the order of dispatching.

 Still, one way to implement what you said is to assign a significance
number to each ISA, where the number of sse4 > sse, for instance.
Then, the dispatching can be done in the descending order of
significance. What do you think?

I thought about this earlier and I was thinking along the lines of
letting the user specify a priority for each version, when there is
ambiguity.

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

Oh, you mean like doing a CPUID again in the test case itself and checking, ok.

Thanks,
-Sri.

>
>
> --
> H.J.

Reply via email to