HomePhabricator

[InstSimplify] fold and/or of fcmp ord/uno when operand is known nnan

Description

[InstSimplify] fold and/or of fcmp ord/uno when operand is known nnan

The 'ord' and 'uno' predicates have a logic operation for NAN built into their definitions:

FCMP_ORD = 7, /< 0 1 1 1 True if ordered (no nans)
FCMP_UNO = 8,
/< 1 0 0 0 True if unordered: isnan(X) | isnan(Y)

So we can simplify patterns like this:

(fcmp ord (known NNAN), X) && (fcmp ord X, Y) --> fcmp ord X, Y
(fcmp uno (known NNAN), X) || (fcmp uno X, Y) --> fcmp uno X, Y

It might be better to split this into (X uno 0) | (Y uno 0) as a canonicalization, but that
would be another patch.

Differential Revision: https://reviews.llvm.org/D40130

Details