The bug was introduced in r225282. r225282 assumed that sub X, Y is the same as add X, -Y. This is not correct if we are going to upgrade the sub to sub nuw. This change fixes the issue by making the optimization ignore sub instructions.
Details
Diff Detail
- Repository
- rL LLVM
Event Timeline
LGTM.
Out of curiosity, why isn't this implemented like the code here:
http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/IndVarSimplify.cpp?revision=222213&view=markup#l1733
In retrospect, that would have been the right way to do it. Directly checking zext(A + B) == zext(A) + zext(B) does not catch test.unsigned.add.0 (in the test file), but I think that is fixable.
Moreover, the approach you pointed out can be easily generalized to subtraction. I don't think you can easily generalize it to multiplication (since checking for BitWidth + 1 may not be sufficient in that case); but we're not handling multiplication anyway.
I'll try to implement the approach LinearFunctionTestReplace and send in a patch for review sometime this week.