In one of the loop transformations I am developing, I need to convert eq and neq loop latch condition into less than or greater than depending on the control flow.
The problem is that CmpInst::ICMP_EQ and CmpInst::ICMP_NE are neither signed nor unsigned in LLVM. Also, I did not find a way to find out if the integer operands of the CmpInst are signed or unsigned. Apparently, LLVM does not distinguish in its type system between signed and unsigned variables. So, I am not able to generate the appropriate signed or unsigned ICMP_(S|U)LT or ICMP_(S|U)GT.
Do you have a solution for this?
In what way would you expect a signed and unsigned integer to differ in equality comparison? Two integers are equal if they have the same bit pattern, they are not equal if they do not. If you want help in constructing a signed and unsigned notion of equality then you’ll first have to define what you want it to mean, or you are unlikely to find anyone able to help.
Can you figure out the induction variable range?
If it is within [0, signed-max], then both signed and unsigned operations produce the same result, no?
I am writing a decompiler. For this, i need to do type inference propagation. EQ/NEQ do not provide any indication of type. So the only solution is to infer it from other uses of the same registers.
I think you will have to do the same.
Also, there are problem edge cases. What if one register is signed and the other is unsigned?
This answers my question. I will have to retrieve other operations that use the same value. But even this won’t work in all case.
True. In the absence of other type info, i assume unsigned.
It is the least risky. For example if you had assumed signed, and it turned out to be a pointer, it could cause problems.
I am curious. In what situations is splitting and EQ into GE and LE etc. Helpful?