I¡¯m currently writing an IR pass that¡¯s required to match a ¡®br¡¯ instruction (in IR) with a specific AST if statement. Matching itself can be done quite easily through DebugLoc, but I realized that the ¡®way¡¯ (as in where the control flow continues after it¡¯s been (not-)taken) of a branch can be changed in the course of IR optimizations. For example, a branch ¡®if (x == 0)¡¯ can be semantically transformed to ¡®if (x != 0)¡¯ in the resulting IR.
My question is, how can I know such way-changing transformation has been done on which branches? Or, is there any way I can prevent such way-changes during optimization?