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. /* { 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 (); }