[llvm-commits] [llvm] r137572 - in /llvm/trunk: lib/Transforms/InstCombine/InstructionCombining.cpp test/Transforms/InstCombine/nsw.ll

Nick Lewycky nicholas at mxc.ca
Sat Aug 13 21:48:59 PDT 2011


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.

Nick



More information about the llvm-commits mailing list