On Mon, Jul 25, 2022 at 1:59 PM Sam Feifer <sfei...@redhat.com> wrote: > > >> I suspect for eq and mult you might want to add :c to them even though >> in your testcase you don't need them, you might be able to get it via >> using different statements and looking at the forwprop gimple dump. >> Also, did you send the wrong patch as it looks like the function call >> to build_zero_cst has been eaten ... (or is it just because TREE_TYPE >> has parentheses inside the macro and it just accidently works :)). > > > I got lucky and it works without parentheses :). I just added them in for > readability. > >> You might also want to make sure it does the right thing for vector >> types and complex types (yes both are valid for trunc_div still). >> > > I made a vector test case, but it's giving me errors when using " == " > between two vectors. I'm running it with the C++ front end and it's saying > the return value cannot be converted. Any tips for this? > > I'm not sure exactly what you mean by "complex types" in terms of testing > this patch. Could I get an example?
int f(_Complex int x, _Complex int y) { return x == x / y * y; } For vector try (which works for both the C and C++ front-end): #define vector __attribute__((vector_size(4*sizeof(int)) )) vector int f(vector int x, vector int y) { return x == x / y * y; } That is for the vector case, == still returns a vector type. Thanks, Andrew Pinski > > Thanks > -Sam > >> Thanks, >> Andrew Pinski >> >> > diff --git a/gcc/testsuite/gcc.dg/pr104992-1.c >> > b/gcc/testsuite/gcc.dg/pr104992-1.c >> > new file mode 100644 >> > index 00000000000..a80e5e180ce >> > --- /dev/null >> > +++ b/gcc/testsuite/gcc.dg/pr104992-1.c >> > @@ -0,0 +1,30 @@ >> > +/* PR tree-optimization/104992 */ >> > +/* { dg-do run } */ >> > +/* { dg-options "-O2"} */ >> > + >> > +#include "pr104992.c" >> > + >> > +int main () { >> > + >> > + /* Should be true. */ >> > + if (!foo(6, 3) >> > + || !bar(12, 2) >> > + || !baz(34, 17) >> > + || !qux(50, 10) >> > + || !fred(16, 8) >> > + || !baz(-9, 3) >> > + || !baz(9, -3) >> > + || !baz(-9, -3) >> > + ) { >> > + __builtin_abort(); >> > + } >> > + >> > + /* Should be false. */ >> > + if (foo(5, 30) >> > + || bar(72, 27) >> > + || baz(42, 15)) { >> > + __builtin_abort(); >> > + } >> > + >> > + return 0; >> > +} >> > diff --git a/gcc/testsuite/gcc.dg/pr104992.c >> > b/gcc/testsuite/gcc.dg/pr104992.c >> > new file mode 100644 >> > index 00000000000..b4b0ca53118 >> > --- /dev/null >> > +++ b/gcc/testsuite/gcc.dg/pr104992.c >> > @@ -0,0 +1,35 @@ >> > +/* PR tree-optimization/104992 */ >> > +/* { dg-do compile } */ >> > +/* { dg-options "-O2 -fdump-tree-optimized" } */ >> > + >> > +/* Form from PR. */ >> > +__attribute__((noipa)) unsigned foo(unsigned x, unsigned y) >> > +{ >> > + return x / y * y == x; >> > +} >> > + >> > +__attribute__((noipa)) unsigned bar(unsigned x, unsigned y) { >> > + return x == x / y * y; >> > +} >> > + >> > +/* Signed test case. */ >> > +__attribute__((noipa)) unsigned baz (int x, int y) { >> > + return x / y * y == x; >> > +} >> > + >> > +/* Changed order. */ >> > +__attribute__((noipa)) unsigned qux (unsigned x, unsigned y) { >> > + return y * (x / y) == x; >> > +} >> > + >> > +/* Wrong order. */ >> > +__attribute__((noipa)) unsigned fred (unsigned x, unsigned y) { >> > + return y * x / y == x; >> > +} >> > + >> > +/* Wrong pattern. */ >> > +__attribute__((noipa)) unsigned waldo (unsigned x, unsigned y, unsigned >> > z) { >> > + return x / y * z == x; >> > +} >> > + >> > +/* { dg-final {scan-tree-dump-times " % " 4 "optimized" } } */ >> > >> > base-commit: 633e9920589ddfaf2d6da1c24ce99b18a2638db4 >> > -- >> > 2.31.1 >> > >>