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
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.