introduces MaxNode::*_max() and MaxNode::*_min() methods. They are implemented with a subgraph that relies on CMove (except for signed max and min on ints which take advantage of existing MinI and MaxI nodes). Instead, they could all have their own node type similar to MinI/MaxI implemented either in the backend or lowered as a CMove subgraph after optimizations. In the current implementation, the type of the result is passed as an argument to the factory method. It should be computed from the type of the inputs.