[llvm-commits] [llvm] r137572 - in /llvm/trunk: lib/Transforms/InstCombine/InstructionCombining.cpp test/Transforms/InstCombine/nsw.ll
Eli Friedman
eli.friedman at gmail.com
Sat Aug 13 21:57:59 PDT 2011
On Sat, Aug 13, 2011 at 9:48 PM, Nick Lewycky <nicholas at mxc.ca> wrote:
> Eli Friedman wrote:
>>
>> On Sat, Aug 13, 2011 at 8:41 PM, Nick Lewycky<nicholas at mxc.ca> wrote:
>>>
>>> Author: nicholas
>>> Date: Sat Aug 13 22:41:33 2011
>>> New Revision: 137572
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=137572&view=rev
>>> Log:
>>> Don't attempt to add 'nsw' when intermediate instructions had no such
>>> guarantee.
>>>
>>> Modified:
>>> llvm/trunk/lib/Transforms/InstCombine/InstructionCombining.cpp
>>> llvm/trunk/test/Transforms/InstCombine/nsw.ll
>>>
>>> Modified: llvm/trunk/lib/Transforms/InstCombine/InstructionCombining.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstructionCombining.cpp?rev=137572&r1=137571&r2=137572&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/Transforms/InstCombine/InstructionCombining.cpp
>>> (original)
>>> +++ llvm/trunk/lib/Transforms/InstCombine/InstructionCombining.cpp Sat
>>> Aug 13 22:41:33 2011
>>> @@ -146,7 +146,6 @@
>>> return !Overflow;
>>> }
>>>
>>> -
>>> /// SimplifyAssociativeOrCommutative - This performs a few
>>> simplifications for
>>> /// operators which are associative or commutative:
>>> //
>>> @@ -197,7 +196,10 @@
>>> I.setOperand(1, V);
>>> // Conservatively clear the optional flags, since they may not
>>> be
>>> // preserved by the reassociation.
>>> - if (MaintainNoSignedWrap(I, B, C)) {
>>> + if (MaintainNoSignedWrap(I, B, C)&&
>>> + (!Op0 || (isa<BinaryOperator>(Op0)&&
>>> Op0->hasNoSignedWrap()))) {
>>> + // Note: this is only valid because SimplifyBinOp doesn't
>>> look at
>>> + // the operands to Op0.
>>> I.clearSubclassOptionalData();
>>> I.setHasNoSignedWrap(true);
>>> } else {
>>> @@ -292,10 +294,11 @@
>>> I.setOperand(1, Folded);
>>> // Conservatively clear the optional flags, since they may not be
>>> // preserved by the reassociation.
>>> - if (MaintainNoSignedWrap(I, C1, C2)) {
>>> + if (MaintainNoSignedWrap(I, C1, C2)&& Op0->hasNoSignedWrap()&&
>>> + Op1->hasNoSignedWrap()) {
>>> + New->setHasNoSignedWrap(true);
>>> I.clearSubclassOptionalData();
>>> I.setHasNoSignedWrap(true);
>>> - New->setHasNoSignedWrap(true);
>>> } else {
>>> I.clearSubclassOptionalData();
>>> }
>>>
>>> Modified: llvm/trunk/test/Transforms/InstCombine/nsw.ll
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/nsw.ll?rev=137572&r1=137571&r2=137572&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/test/Transforms/InstCombine/nsw.ll (original)
>>> +++ llvm/trunk/test/Transforms/InstCombine/nsw.ll Sat Aug 13 22:41:33
>>> 2011
>>> @@ -46,10 +46,38 @@
>>> ret i32 %add3
>>> }
>>>
>>> +; CHECK: @preserve2
>>> +; CHECK: add nsw i8 %A, %B
>>> +; CHECK: add nsw i8
>>> +define i8 @preserve2(i8 %A, i8 %B) nounwind {
>>> + %x = add nsw i8 %A, 10
>>> + %y = add nsw i8 %B, 10
>>> + %add = add nsw i8 %x, %y
>>> + ret i8 %add
>>> +}
>>
>> Is this transform actually safe? Take %A=-70, %B = -70. Unless I'm
>> mistaken, the original operations (-70 + 10 and -60+-60) don't
>> overflow, but the new operations (-70 + -70 and 116 + 20) both
>> overflow.
>
> Nope, you're right. Turning this transform off.
>
> If you can find a way in which @preserve1 is wrong, I'll revert the whole
> patch. As it stands, it seems to me that we want something more generally
> applicable than MaintainNoSignedWrap.
I'm pretty sure @preserve1 is correct. We discussed it pretty
extensively before the patch was committed.
-Eli
More information about the llvm-commits
mailing list