mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 03:33:20 +01:00
[DAG] add convenience function to get -1 constant; NFCI
llvm-svn: 296004
This commit is contained in:
parent
2e3937b806
commit
f14bbf566d
@ -480,6 +480,13 @@ public:
|
||||
bool isTarget = false, bool isOpaque = false);
|
||||
SDValue getConstant(const APInt &Val, const SDLoc &DL, EVT VT,
|
||||
bool isTarget = false, bool isOpaque = false);
|
||||
|
||||
SDValue getAllOnesConstant(const SDLoc &DL, EVT VT, bool IsTarget = false,
|
||||
bool IsOpaque = false) {
|
||||
return getConstant(APInt::getAllOnesValue(VT.getScalarSizeInBits()), DL,
|
||||
VT, IsTarget, IsOpaque);
|
||||
}
|
||||
|
||||
SDValue getConstant(const ConstantInt &Val, const SDLoc &DL, EVT VT,
|
||||
bool isTarget = false, bool isOpaque = false);
|
||||
SDValue getIntPtrConstant(uint64_t Val, const SDLoc &DL,
|
||||
|
@ -2493,20 +2493,17 @@ SDValue DAGCombiner::visitREM(SDNode *N) {
|
||||
if (DAG.SignBitIsZero(N1) && DAG.SignBitIsZero(N0))
|
||||
return DAG.getNode(ISD::UREM, DL, VT, N0, N1);
|
||||
} else {
|
||||
// fold (urem x, pow2) -> (and x, pow2-1)
|
||||
SDValue NegOne = DAG.getAllOnesConstant(DL, VT);
|
||||
if (DAG.isKnownToBeAPowerOfTwo(N1)) {
|
||||
APInt NegOne = APInt::getAllOnesValue(VT.getScalarSizeInBits());
|
||||
SDValue Add =
|
||||
DAG.getNode(ISD::ADD, DL, VT, N1, DAG.getConstant(NegOne, DL, VT));
|
||||
// fold (urem x, pow2) -> (and x, pow2-1)
|
||||
SDValue Add = DAG.getNode(ISD::ADD, DL, VT, N1, NegOne);
|
||||
AddToWorklist(Add.getNode());
|
||||
return DAG.getNode(ISD::AND, DL, VT, N0, Add);
|
||||
}
|
||||
// fold (urem x, (shl pow2, y)) -> (and x, (add (shl pow2, y), -1))
|
||||
if (N1.getOpcode() == ISD::SHL &&
|
||||
DAG.isKnownToBeAPowerOfTwo(N1.getOperand(0))) {
|
||||
APInt NegOne = APInt::getAllOnesValue(VT.getScalarSizeInBits());
|
||||
SDValue Add =
|
||||
DAG.getNode(ISD::ADD, DL, VT, N1, DAG.getConstant(NegOne, DL, VT));
|
||||
// fold (urem x, (shl pow2, y)) -> (and x, (add (shl pow2, y), -1))
|
||||
SDValue Add = DAG.getNode(ISD::ADD, DL, VT, N1, NegOne);
|
||||
AddToWorklist(Add.getNode());
|
||||
return DAG.getNode(ISD::AND, DL, VT, N0, Add);
|
||||
}
|
||||
@ -3731,12 +3728,9 @@ SDValue DAGCombiner::MatchBSwapHWord(SDNode *N, SDValue N0, SDValue N1) {
|
||||
SDValue DAGCombiner::visitORLike(SDValue N0, SDValue N1, SDNode *LocReference) {
|
||||
EVT VT = N1.getValueType();
|
||||
// fold (or x, undef) -> -1
|
||||
if (!LegalOperations &&
|
||||
(N0.isUndef() || N1.isUndef())) {
|
||||
EVT EltVT = VT.isVector() ? VT.getVectorElementType() : VT;
|
||||
return DAG.getConstant(APInt::getAllOnesValue(EltVT.getSizeInBits()),
|
||||
SDLoc(LocReference), VT);
|
||||
}
|
||||
if (!LegalOperations && (N0.isUndef() || N1.isUndef()))
|
||||
return DAG.getAllOnesConstant(SDLoc(LocReference), VT);
|
||||
|
||||
// fold (or (setcc x), (setcc y)) -> (setcc (or x, y))
|
||||
SDValue LL, LR, RL, RR, CC0, CC1;
|
||||
if (isSetCCEquivalent(N0, LL, LR, CC0) && isSetCCEquivalent(N1, RL, RR, CC1)){
|
||||
@ -3852,14 +3846,10 @@ SDValue DAGCombiner::visitOR(SDNode *N) {
|
||||
// fold (or x, -1) -> -1, vector edition
|
||||
if (ISD::isBuildVectorAllOnes(N0.getNode()))
|
||||
// do not return N0, because undef node may exist in N0
|
||||
return DAG.getConstant(
|
||||
APInt::getAllOnesValue(N0.getScalarValueSizeInBits()), SDLoc(N),
|
||||
N0.getValueType());
|
||||
return DAG.getAllOnesConstant(SDLoc(N), N0.getValueType());
|
||||
if (ISD::isBuildVectorAllOnes(N1.getNode()))
|
||||
// do not return N1, because undef node may exist in N1
|
||||
return DAG.getConstant(
|
||||
APInt::getAllOnesValue(N1.getScalarValueSizeInBits()), SDLoc(N),
|
||||
N1.getValueType());
|
||||
return DAG.getAllOnesConstant(SDLoc(N), N1.getValueType());
|
||||
|
||||
// fold (or (shuf A, V_0, MA), (shuf B, V_0, MB)) -> (shuf A, B, Mask)
|
||||
// Do this only if the resulting shuffle is legal.
|
||||
@ -4198,8 +4188,7 @@ SDNode *DAGCombiner::MatchRotate(SDValue LHS, SDValue RHS, const SDLoc &DL) {
|
||||
|
||||
// If there is an AND of either shifted operand, apply it to the result.
|
||||
if (LHSMask.getNode() || RHSMask.getNode()) {
|
||||
APInt AllBits = APInt::getAllOnesValue(EltSizeInBits);
|
||||
SDValue Mask = DAG.getConstant(AllBits, DL, VT);
|
||||
SDValue Mask = DAG.getAllOnesConstant(DL, VT);
|
||||
|
||||
if (LHSMask.getNode()) {
|
||||
APInt RHSBits = APInt::getLowBitsSet(EltSizeInBits, LShVal);
|
||||
@ -5091,9 +5080,8 @@ SDValue DAGCombiner::visitSHL(SDNode *N) {
|
||||
// fold (shl (sra x, c1), c1) -> (and x, (shl -1, c1))
|
||||
if (N0.getOpcode() == ISD::SRA && N1 == N0.getOperand(1) &&
|
||||
isConstantOrConstantVector(N1, /* No Opaques */ true)) {
|
||||
unsigned BitSize = VT.getScalarSizeInBits();
|
||||
SDLoc DL(N);
|
||||
SDValue AllBits = DAG.getConstant(APInt::getAllOnesValue(BitSize), DL, VT);
|
||||
SDValue AllBits = DAG.getAllOnesConstant(DL, VT);
|
||||
SDValue HiBitsMask = DAG.getNode(ISD::SHL, DL, VT, AllBits, N1);
|
||||
return DAG.getNode(ISD::AND, DL, VT, N0.getOperand(0), HiBitsMask);
|
||||
}
|
||||
@ -5357,9 +5345,8 @@ SDValue DAGCombiner::visitSRL(SDNode *N) {
|
||||
if (N0.getOpcode() == ISD::SHL && N0.getOperand(1) == N1 &&
|
||||
isConstantOrConstantVector(N1, /* NoOpaques */ true)) {
|
||||
SDLoc DL(N);
|
||||
APInt AllBits = APInt::getAllOnesValue(N0.getScalarValueSizeInBits());
|
||||
SDValue Mask =
|
||||
DAG.getNode(ISD::SRL, DL, VT, DAG.getConstant(AllBits, DL, VT), N1);
|
||||
DAG.getNode(ISD::SRL, DL, VT, DAG.getAllOnesConstant(DL, VT), N1);
|
||||
AddToWorklist(Mask.getNode());
|
||||
return DAG.getNode(ISD::AND, DL, VT, N0.getOperand(0), Mask);
|
||||
}
|
||||
@ -6770,12 +6757,8 @@ SDValue DAGCombiner::visitSIGN_EXTEND(SDNode *N) {
|
||||
// If the type of the setcc is larger (say, i8) then the value of the high
|
||||
// bit depends on getBooleanContents(), so ask TLI for a real "true" value
|
||||
// of the appropriate width.
|
||||
SDValue ExtTrueVal =
|
||||
(SetCCWidth == 1)
|
||||
? DAG.getConstant(APInt::getAllOnesValue(VT.getScalarSizeInBits()),
|
||||
DL, VT)
|
||||
: TLI.getConstTrueVal(DAG, VT, DL);
|
||||
|
||||
SDValue ExtTrueVal = (SetCCWidth == 1) ? DAG.getAllOnesConstant(DL, VT)
|
||||
: TLI.getConstTrueVal(DAG, VT, DL);
|
||||
SDValue Zero = DAG.getConstant(0, DL, VT);
|
||||
if (SDValue SCC =
|
||||
SimplifySelectCC(DL, N00, N01, ExtTrueVal, Zero, CC, true))
|
||||
|
Loading…
Reference in New Issue
Block a user