This patch adds an extract callback checkOpStructureEquivalent to a method OperationEquivalence::isEquivalentTo so that users can use customize equivalence regarding structural properties of operations.
I'm not sure that "structural properties" is a best term to describe operation information used here. I think just "properties" is better but I added "structural" to clearly distinguish from operation properties.
This patch is preparation to provide dialect interface for CSE https://discourse.llvm.org/t/rfc-dialectinterface-for-cse/71831
I'm starting to wonder if callbacks is the right design for OperationEquivalence at this point. Users are basically passing in a vtable for each function call.