Please, don't make commits that large, and don't mix refactoring and development changes in the same commit. If you could also split the introduction of a test and the implementation required to satisfy that test, that would be even better.
I can spend time on that later, once it's decided how to proceed.
Also, even if we really want to have that field, do not call it `arg`; rather use some more descriptive name like `condition`. I still think it's inconsistent with the choice we made about the conditional statement, but at least one can understand what it means.
I don't see a big difference between arg and condition, and then again it's a cosmetic difference.
WRT having both `TEXKILL` and `DISCARD`, I think it's better than before, as at least the IR makes sense even without context. OTOH, the two names do not make much sense from the point of view of the IR itself. Maybe something like `DISCARD_NNEG` (for "discard on non-negative") and `DISCARD_NZ` would be more consistent?
Again, how to call it is another question. Important question is whether transform pass is better than creating separate paths in advance. Regarding names, having that closer to actual language elements seems easier to read, than NNEG.