[PATCH] Restrict jump threading statement simplifier to scalar types (PR71077)

Uros Bizjak ubizjak@gmail.com
Sun Aug 21 21:56:00 GMT 2016


On Sun, Aug 21, 2016 at 11:04 PM, Patrick Palka <patrick@parcs.ath.cx> wrote:
> On Sat, 20 Aug 2016, Uros Bizjak wrote:
>
>> > Turning it into a compile test that counts the number of jumps threaded
>> > seems potentially flaky but I'm not against it.  And I'm not sure how to
>> > reliably turn it into an execution test.  Would the directives
>> >
>> > /* { dg-do run }  */
>> > /* { dg-require-effective-target avx2 }  */
>> > /* { dg-require-effective-target ia32 }  */
>> > /* { dg-options "-O3 -mavx2" }  */
>> >
>> > work?
>>
>> No, this only checks that the target is able to compile the testcase.
>> In gcc.target/i386, there is ialready present nfrastructure that
>> handles runtime checks (avx2_test) in your case. You can see many
>> examples there.
>>
>> Uros.
>>
>
> I see, thank you.  Here's a version of the test case that should fail without
> the patch and pass with the patch.  I can't test it myself because I don't have
> access to a machine with AVX2.  But I can confirm that with the patch the two
> bogus jump threads through the vector conditionals that were incorrectly folded
> are no longered registered.

Looks good to me (but I'm also not in the position to runtime test).
However, please remove ia32 effective target requirement, as the
testcase is able to compile and run on 64bit target.

Thanks,
Uros.

> /* { dg-do run }  */
> /* { dg-require-effective-target avx2 }  */
> /* { dg-require-effective-target ia32 }  */
> /* { dg-options "-O3 -mavx2" }  */
>
> #include "avx2-check.h"
>
> typedef unsigned int ui;
> ui x[32*32];
> ui y[32];
> ui z[32];
> void __attribute__ ((noinline, noclone)) foo (ui n, ui z)
> {
>   ui i, b;
>   ui v;
>  for (i = 0; i< n; i++)
>   {
>     v = y[i];
>     if (v) {
>       for (b = 0; b < 32; b++)
>         if ((v >> b) & 1)
>           x[i*32 +b] = z;
>       y[i] = 0;
>     }
>   }
> }
>
> static void
> avx2_test (void)
> {
>   int i;
>   unsigned int val;
>   for (i = 0; i<32; i++)
>     {
>       val = 1U << i;
>       y[i] = (i & 1)? 0 : val;
>       z[i] = i;
>     }
>   foo (32, 10);
>   for (i=0; i<1024; i+=66)
>     if (x[i] != 10)
>       __builtin_abort ();
> }
>



More information about the Gcc-patches mailing list