Index: trunk/gcc/match.pd =================================================================== --- trunk/gcc/match.pd (revision 235654) +++ trunk/gcc/match.pd (working copy) @@ -783,21 +783,21 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) @0) /* (~x | y) & x -> x & y */ /* (~x & y) | x -> x | y */ (simplify (bitop:c (rbitop:c (bit_not @0) @1) @0) (bitop @0 @1))) /* Simplify (A & B) OP0 (C & B) to (A OP0 C) & B. */ (for bitop (bit_and bit_ior bit_xor) (simplify - (bitop (bit_and:c @0 @1) (bit_and @2 @1)) + (bitop (bit_and:c @0 @1) (bit_and:c @2 @1)) (bit_and (bitop @0 @2) @1))) /* (x | CST1) & CST2 -> (x & CST2) | (CST1 & CST2) */ (simplify (bit_and (bit_ior @0 CONSTANT_CLASS_P@1) CONSTANT_CLASS_P@2) (bit_ior (bit_and @0 @2) (bit_and @1 @2))) /* Combine successive equal operations with constants. */ (for bitop (bit_and bit_ior bit_xor) (simplify @@ -1914,20 +1914,24 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) (simplify (cmp @0 @0) (if (cmp != NE_EXPR || ! FLOAT_TYPE_P (TREE_TYPE (@0)) || ! HONOR_NANS (@0)) { constant_boolean_node (false, type); }))) (for cmp (unle unge uneq) (simplify (cmp @0 @0) { constant_boolean_node (true, type); })) +(for cmp (unlt ungt) + (simplify + (cmp @0 @0) + (unordered @0 @0))) (simplify (ltgt @0 @0) (if (!flag_trapping_math) { constant_boolean_node (false, type); })) /* Fold ~X op ~Y as Y op X. */ (for cmp (simple_comparison) (simplify (cmp (bit_not@2 @0) (bit_not@3 @1)) (if (single_use (@2) && single_use (@3)) Index: trunk/gcc/testsuite/gcc.dg/tree-ssa/unord.c =================================================================== --- trunk/gcc/testsuite/gcc.dg/tree-ssa/unord.c (revision 0) +++ trunk/gcc/testsuite/gcc.dg/tree-ssa/unord.c (working copy) @@ -0,0 +1,7 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fdump-tree-optimized" } */ + +int f(double a){double b=a;return !__builtin_islessequal(a,b);} +int g(double a){double b=a;return !__builtin_isgreaterequal(a,b);} + +/* { dg-final { scan-tree-dump-times " unord " 2 "optimized" } } */