For the complete fix for Assertion Predicates, we must be able to copy Template Assertion Predicates around efficiently. To do that, we eventually want to get rid of UCT for the fail path of Template Assertion Predicates and only create them with Halt nodes. Currently, we have both variants around which makes it somewhat difficult to match them.
On top of that, Opaque4 nodes are shared between Template Assertion Predicates and not null checks for intrinsics. To differentiate between them, we need to walk the graph to check if OpaqueLoop* nodes can be found (if so, it is a Template Assertion Predicate). This is somewhat cumbersome and slow. To simplified pattern matching, it would be a lot easier if we split the Opaque4 nodes into OpaqueTemplateAssertionPredicateNode for Template Assertion Predicates and OpaqueNotNullNode for non null checks with intrinsics. This is proposed with this task.