[llvm] r284239 - [DAG] add folds for negated shifted sign bit

Sanjay Patel via llvm-commits llvm-commits at lists.llvm.org
Fri Oct 14 12:58:32 PDT 2016


Thanks, Eli!
Hopefully fixed with:
https://reviews.llvm.org/rL284268

Still looking for a test case.

On Fri, Oct 14, 2016 at 12:04 PM, Friedman, Eli <efriedma at codeaurora.org>
wrote:

> On 10/14/2016 7:26 AM, Sanjay Patel via llvm-commits wrote:
>
>> Author: spatel
>> Date: Fri Oct 14 09:26:47 2016
>> New Revision: 284239
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=284239&view=rev
>> Log:
>> [DAG] add folds for negated shifted sign bit
>>
>> The same folds exist in InstCombine already.
>>
>> This came up as part of:
>> https://reviews.llvm.org/D25485
>>
>>
>> Modified:
>>      llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
>>      llvm/trunk/test/CodeGen/X86/negate-shift.ll
>>
>> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/
>> SelectionDAG/DAGCombiner.cpp?rev=284239&r1=284238&r2=284239&view=diff
>> ============================================================
>> ==================
>> --- llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Fri Oct 14
>> 09:26:47 2016
>> @@ -1954,6 +1954,19 @@ SDValue DAGCombiner::visitSUB(SDNode *N)
>>                          DAG.getConstant(-N1C->getAPIntValue(), DL, VT));
>>     }
>>   +  // Right-shifting everything out but the sign bit followed by
>> negation is the
>> +  // same as flipping arithmetic/logical shift type without the negation:
>> +  // -(X >>u 31) -> (X >>s 31)
>> +  // -(X >>s 31) -> (X >>u 31)
>> +  if (isNullConstantOrNullSplatConstant(N0) &&
>> +      (N1->getOpcode() == ISD::SRA || N1->getOpcode() == ISD::SRL)) {
>> +    ConstantSDNode *ShiftAmt = isConstOrConstSplat(N1.getOperand(1));
>> +    if (ShiftAmt && ShiftAmt->getZExtValue() == VT.getScalarSizeInBits()
>> - 1) {
>> +      auto NewOpcode = N1->getOpcode() == ISD::SRA ? ISD::SRL :ISD::SRA;
>> +      return DAG.getNode(NewOpcode, DL, VT, N1.getOperand(0),
>> N1.getOperand(1));
>> +    }
>> +  }
>>
>
> You need to check whether the new node is legal.  It's possible to have a
> target where SRL is legal, but SRA isn't.
>
> Not sure what targets would actually trigger this issue off the top of my
> head, but they probably exist. SSE2 is missing an arithmetic shift right
> for <2 x i64>, but you can't trigger the issue there because it doesn't use
> ISD::SRL for vectors after legalization.
>
> -Eli
>
> --
> Employee of Qualcomm Innovation Center, Inc.
> Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux
> Foundation Collaborative Project
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20161014/69a08782/attachment.html>


More information about the llvm-commits mailing list