Correspondence between IR and AST branch ways

Hi all,

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?


Gwangmu Lee.

Let me answer to my own question. As far as I searched for, there is no option that forces the front-end not to change the branch way, but you can guess it (i.e., which IR branch way is equivalent to the source code level if statement way) by looking at the basic block labels. These basic block labels are discarded by default, so one may need to specify the ¡®-fno-discard-value-names¡¯ compiler option to prevent them discarded. The basic block followed by the taken branches are usually named as ¡®%if.then¡¯ in the IR level.

Note that this solution assumes no preliminary optimizations (O0).

Hope this would help anybody.