diff options
Diffstat (limited to 'llvm/lib/CodeGen')
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp | 27 | 
1 files changed, 27 insertions, 0 deletions
| diff --git a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp index d439a6f8699..14f0ef518fe 100644 --- a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp @@ -2342,6 +2342,33 @@ TargetLowering::SimplifySetCC(EVT VT, SDValue N0, SDValue N1,              return DAG.getSetCC(dl, VT, Shift, CmpRHS, Cond);            }          } +      } else if (Cond == ISD::SETULT || Cond == ISD::SETUGE || +                 Cond == ISD::SETULE || Cond == ISD::SETUGT) { +        bool AdjOne = (Cond == ISD::SETULE || Cond == ISD::SETUGT); +        // X <  0x100000000 -> (X >> 32) <  1 +        // X >= 0x100000000 -> (X >> 32) >= 1 +        // X <= 0x0ffffffff -> (X >> 32) <  1 +        // X >  0x0ffffffff -> (X >> 32) >= 1 +        unsigned ShiftBits; +        APInt NewC = C1; +        ISD::CondCode NewCond = Cond; +        if (AdjOne) { +          ShiftBits = C1.countTrailingOnes(); +          NewC = NewC + 1; +          NewCond = (Cond == ISD::SETULE) ? ISD::SETULT : ISD::SETUGE; +        } else { +          ShiftBits = C1.countTrailingZeros(); +        } +        NewC = NewC.lshr(ShiftBits); +        if (ShiftBits && isLegalICmpImmediate(NewC.getSExtValue())) { +          EVT ShiftTy = DCI.isBeforeLegalize() ? +            getPointerTy() : getShiftAmountTy(N0.getValueType()); +          EVT CmpTy = N0.getValueType(); +          SDValue Shift = DAG.getNode(ISD::SRL, dl, CmpTy, N0, +                                      DAG.getConstant(ShiftBits, ShiftTy)); +          SDValue CmpRHS = DAG.getConstant(NewC, CmpTy); +          return DAG.getSetCC(dl, VT, Shift, CmpRHS, NewCond); +        }        }      }    } | 

