Some predicates, can be considered the same as long as the operands are flipped. For example, a > b gives the same result as b > a. This maps instructions in a greater than form, to their appropriate less than form, swapping the operands in the IRInstructionData only, allowing for more flexible matching.
Tests:
- llvm/test/Transforms/IROutliner/outlining-isomorphic-predicates.ll
- llvm/unittests/Analysis/IRSimilarityIdentifierTest.cpp
Since we generally don't build with exceptions turned on, it makes more sense to talk about what's allowed/not in the function's contract, rather than mentioning that assertion failures "throw".