[llvm] r237645 - DAGCombiner: Factor common pattern into isOneConstant() function. NFC

Matthias Braun matze at braunis.de
Tue May 19 10:42:00 PDT 2015


> On May 19, 2015, at 9:59 AM, Quentin Colombet <qcolombet at apple.com> wrote:
> 
> Hi Matthias,
> 
> 
>> On May 18, 2015, at 5:25 PM, Matthias Braun <matze at braunis.de> wrote:
>> 
>> Author: matze
>> Date: Mon May 18 19:25:21 2015
>> New Revision: 237645
>> 
>> URL: http://llvm.org/viewvc/llvm-project?rev=237645&view=rev
>> Log:
>> DAGCombiner: Factor common pattern into isOneConstant() function. NFC
>> 
>> Modified:
>>   llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
>> 
>> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp?rev=237645&r1=237644&r2=237645&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Mon May 18 19:25:21 2015
>> @@ -1590,6 +1590,11 @@ static bool isAllOnesConstant(SDValue V)
>>  return Const != nullptr && Const->isAllOnesValue();
>> }
>> 
>> +static bool isOneConstant(SDValue V) {
>> +  ConstantSDNode *Const = dyn_cast<ConstantSDNode>(V);
>> +  return Const != nullptr && Const->isOne();
>> +}
>> +
>> SDValue DAGCombiner::visitADD(SDNode *N) {
>>  SDValue N0 = N->getOperand(0);
>>  SDValue N1 = N->getOperand(1);
>> @@ -1722,13 +1727,12 @@ SDValue DAGCombiner::visitADD(SDNode *N)
>> 
>>  if (N1.getOpcode() == ISD::AND) {
>>    SDValue AndOp0 = N1.getOperand(0);
>> -    ConstantSDNode *AndOp1 = dyn_cast<ConstantSDNode>(N1->getOperand(1));
>>    unsigned NumSignBits = DAG.ComputeNumSignBits(AndOp0);
>>    unsigned DestBits = VT.getScalarType().getSizeInBits();
>> 
>>    // (add z, (and (sbbl x, x), 1)) -> (sub z, (sbbl x, x))
>>    // and similar xforms where the inner op is either ~0 or 0.
>> -    if (NumSignBits == DestBits && AndOp1 && AndOp1->isOne()) {
>> +    if (NumSignBits == DestBits && isOneConstant(N1->getOperand(1))) {
>>      SDLoc DL(N);
>>      return DAG.getNode(ISD::SUB, DL, VT, N->getOperand(0), AndOp0);
>>    }
>> @@ -2123,7 +2127,7 @@ SDValue DAGCombiner::visitSDIV(SDNode *N
>>  if (N0C && N1C && !N1C->isNullValue())
>>    return DAG.FoldConstantArithmetic(ISD::SDIV, SDLoc(N), VT, N0C, N1C);
>>  // fold (sdiv X, 1) -> X
>> -  if (N1C && N1C->getAPIntValue() == 1LL)
>> +  if (N1C && N1C->isOne())
> 
> Simply N1C->isOneConstant()?

Unfortunately no, at this (and several other places) the code doesn't just check for ConstantSDNodes but also for ConstSplats and sets N1C accordingly so exchanging with isOneConstant(X) changes the semantics. I didn't want to introduce a isOneContantOrSplat function for a handful of places.

- Matthias



More information about the llvm-commits mailing list