Hi! HONOR_NANS when called on a tree or its type handles properly vector/complex element modes, but HONOR_NANS (TYPE_MODE (TREE_TYPE (...))) does not.
Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2016-03-21 Marc Glisse <marc.gli...@inria.fr> Jakub Jelinek <ja...@redhat.com> PR tree-optimization/70317 * match.pd (cmp @0 @0): Pass @0 instead of TYPE_MODE (TREE_TYPE (@0)) to HONOR_NANS. * gcc.dg/pr70317.c: New test. --- gcc/match.pd.jj 2016-03-17 12:43:28.000000000 +0100 +++ gcc/match.pd 2016-03-21 17:45:36.332282052 +0100 @@ -1866,7 +1866,7 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) (simplify (cmp @0 @0) (if (! FLOAT_TYPE_P (TREE_TYPE (@0)) - || ! HONOR_NANS (TYPE_MODE (TREE_TYPE (@0)))) + || ! HONOR_NANS (@0)) { constant_boolean_node (true, type); } (if (cmp != EQ_EXPR) (eq @0 @0))))) @@ -1875,7 +1875,7 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) (cmp @0 @0) (if (cmp != NE_EXPR || ! FLOAT_TYPE_P (TREE_TYPE (@0)) - || ! HONOR_NANS (TYPE_MODE (TREE_TYPE (@0)))) + || ! HONOR_NANS (@0)) { constant_boolean_node (false, type); }))) (for cmp (unle unge uneq) (simplify --- gcc/testsuite/gcc.dg/pr70317.c.jj 2016-03-21 17:43:47.167760535 +0100 +++ gcc/testsuite/gcc.dg/pr70317.c 2016-03-21 17:44:47.634941590 +0100 @@ -0,0 +1,26 @@ +/* PR tree-optimization/70317 */ +/* { dg-do compile } */ +/* { dg-skip-if "No NaN support" { spu*-*-* vax*-*-* pdp11*-*-* } } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ + +typedef double V __attribute__((vector_size (256))); +typedef __typeof ((V) {} < (V) {}) T; +T a, b; + +__attribute__((noinline, noclone, optimize ("finite-math-only"))) void +foo (V *x) +{ + V z = *x; + a = z <= z; +} + +/* { dg-final { scan-tree-dump "a\[^\n\r]*= . -1, -1," "optimized" } } */ + +__attribute__((noinline, noclone, optimize ("no-finite-math-only"))) void +bar (V *x) +{ + V z = *x; + b = z <= z; +} + +/* { dg-final { scan-tree-dump-not "b\[^\n\r]*= . -1, -1," "optimized" } } */ Jakub