Possible missing x86 JCC rules in the backend


I was trying to verify if it’s possible to generate all the possible x86 conditional jumps from Clang, but I didn’t manage to obtain 3 jumps: JA/JNA, JL/JGE, JG/JLE

This is an example illustrating the flags calculation (hopefully correct) and the conditional jump generation: https://godbolt.org/z/a13qPa. I know these jumps are not common and that the example is weird, but I still think they should be foldable.

My assumption is that there are no backend rules to fold the generated patterns (including Jcc and SETcc instruction) into a single conditional jump instruction, but maybe I’m just missing a command line argument.

Am I missing something? If the rules are missing, what would it be the best place to implement them?

Thanks, Matteo

Answering my own question, just for future reference: the ideal solution seems to be adding a custom FunctionPass based on the PatternMatch API to match and convert the patterns to the proper ICmpInst instructions, enabling the backend to generate the correct conditional jumps. Hence, this could be something to be integrated into InstCombine, unless there’s a more specific pass to match and normalise the conditional jumps at the LLVM-IR level.