[DAG] Use FoldConstantArithmetic for unary bitops constant folding.
BSWAP/BITREVERSE/CTPOP/CTLZ/CTLZ_ZERO_UNDEF/CTTZ/CTTZ_ZERO_UNDEF are all handled by FoldConstantArithmetic - so use directly instead of testing for isConstantIntBuildVectorOrConstantInt and relying on DAG.getNode() to perform the constant fold.
This commit is contained in:
parent
f972e4d343
commit
c1173e4e05
@ -10999,8 +10999,8 @@ SDValue DAGCombiner::visitBSWAP(SDNode *N) {
|
||||
SDLoc DL(N);
|
||||
|
||||
// fold (bswap c1) -> c2
|
||||
if (DAG.isConstantIntBuildVectorOrConstantInt(N0))
|
||||
return DAG.getNode(ISD::BSWAP, DL, VT, N0);
|
||||
if (SDValue C = DAG.FoldConstantArithmetic(ISD::BSWAP, DL, VT, {N0}))
|
||||
return C;
|
||||
// fold (bswap (bswap x)) -> x
|
||||
if (N0.getOpcode() == ISD::BSWAP)
|
||||
return N0.getOperand(0);
|
||||
@ -11059,10 +11059,11 @@ SDValue DAGCombiner::visitBSWAP(SDNode *N) {
|
||||
SDValue DAGCombiner::visitBITREVERSE(SDNode *N) {
|
||||
SDValue N0 = N->getOperand(0);
|
||||
EVT VT = N->getValueType(0);
|
||||
SDLoc DL(N);
|
||||
|
||||
// fold (bitreverse c1) -> c2
|
||||
if (DAG.isConstantIntBuildVectorOrConstantInt(N0))
|
||||
return DAG.getNode(ISD::BITREVERSE, SDLoc(N), VT, N0);
|
||||
if (SDValue C = DAG.FoldConstantArithmetic(ISD::BITREVERSE, DL, VT, {N0}))
|
||||
return C;
|
||||
// fold (bitreverse (bitreverse x)) -> x
|
||||
if (N0.getOpcode() == ISD::BITREVERSE)
|
||||
return N0.getOperand(0);
|
||||
@ -11072,16 +11073,16 @@ SDValue DAGCombiner::visitBITREVERSE(SDNode *N) {
|
||||
SDValue DAGCombiner::visitCTLZ(SDNode *N) {
|
||||
SDValue N0 = N->getOperand(0);
|
||||
EVT VT = N->getValueType(0);
|
||||
SDLoc DL(N);
|
||||
|
||||
// fold (ctlz c1) -> c2
|
||||
if (DAG.isConstantIntBuildVectorOrConstantInt(N0))
|
||||
return DAG.getNode(ISD::CTLZ, SDLoc(N), VT, N0);
|
||||
if (SDValue C = DAG.FoldConstantArithmetic(ISD::CTLZ, DL, VT, {N0}))
|
||||
return C;
|
||||
|
||||
// If the value is known never to be zero, switch to the undef version.
|
||||
if (!LegalOperations || TLI.isOperationLegal(ISD::CTLZ_ZERO_UNDEF, VT)) {
|
||||
if (!LegalOperations || TLI.isOperationLegal(ISD::CTLZ_ZERO_UNDEF, VT))
|
||||
if (DAG.isKnownNeverZero(N0))
|
||||
return DAG.getNode(ISD::CTLZ_ZERO_UNDEF, SDLoc(N), VT, N0);
|
||||
}
|
||||
return DAG.getNode(ISD::CTLZ_ZERO_UNDEF, DL, VT, N0);
|
||||
|
||||
return SDValue();
|
||||
}
|
||||
@ -11089,26 +11090,28 @@ SDValue DAGCombiner::visitCTLZ(SDNode *N) {
|
||||
SDValue DAGCombiner::visitCTLZ_ZERO_UNDEF(SDNode *N) {
|
||||
SDValue N0 = N->getOperand(0);
|
||||
EVT VT = N->getValueType(0);
|
||||
SDLoc DL(N);
|
||||
|
||||
// fold (ctlz_zero_undef c1) -> c2
|
||||
if (DAG.isConstantIntBuildVectorOrConstantInt(N0))
|
||||
return DAG.getNode(ISD::CTLZ_ZERO_UNDEF, SDLoc(N), VT, N0);
|
||||
if (SDValue C =
|
||||
DAG.FoldConstantArithmetic(ISD::CTLZ_ZERO_UNDEF, DL, VT, {N0}))
|
||||
return C;
|
||||
return SDValue();
|
||||
}
|
||||
|
||||
SDValue DAGCombiner::visitCTTZ(SDNode *N) {
|
||||
SDValue N0 = N->getOperand(0);
|
||||
EVT VT = N->getValueType(0);
|
||||
SDLoc DL(N);
|
||||
|
||||
// fold (cttz c1) -> c2
|
||||
if (DAG.isConstantIntBuildVectorOrConstantInt(N0))
|
||||
return DAG.getNode(ISD::CTTZ, SDLoc(N), VT, N0);
|
||||
if (SDValue C = DAG.FoldConstantArithmetic(ISD::CTTZ, DL, VT, {N0}))
|
||||
return C;
|
||||
|
||||
// If the value is known never to be zero, switch to the undef version.
|
||||
if (!LegalOperations || TLI.isOperationLegal(ISD::CTTZ_ZERO_UNDEF, VT)) {
|
||||
if (!LegalOperations || TLI.isOperationLegal(ISD::CTTZ_ZERO_UNDEF, VT))
|
||||
if (DAG.isKnownNeverZero(N0))
|
||||
return DAG.getNode(ISD::CTTZ_ZERO_UNDEF, SDLoc(N), VT, N0);
|
||||
}
|
||||
return DAG.getNode(ISD::CTTZ_ZERO_UNDEF, DL, VT, N0);
|
||||
|
||||
return SDValue();
|
||||
}
|
||||
@ -11116,20 +11119,23 @@ SDValue DAGCombiner::visitCTTZ(SDNode *N) {
|
||||
SDValue DAGCombiner::visitCTTZ_ZERO_UNDEF(SDNode *N) {
|
||||
SDValue N0 = N->getOperand(0);
|
||||
EVT VT = N->getValueType(0);
|
||||
SDLoc DL(N);
|
||||
|
||||
// fold (cttz_zero_undef c1) -> c2
|
||||
if (DAG.isConstantIntBuildVectorOrConstantInt(N0))
|
||||
return DAG.getNode(ISD::CTTZ_ZERO_UNDEF, SDLoc(N), VT, N0);
|
||||
if (SDValue C =
|
||||
DAG.FoldConstantArithmetic(ISD::CTTZ_ZERO_UNDEF, DL, VT, {N0}))
|
||||
return C;
|
||||
return SDValue();
|
||||
}
|
||||
|
||||
SDValue DAGCombiner::visitCTPOP(SDNode *N) {
|
||||
SDValue N0 = N->getOperand(0);
|
||||
EVT VT = N->getValueType(0);
|
||||
SDLoc DL(N);
|
||||
|
||||
// fold (ctpop c1) -> c2
|
||||
if (DAG.isConstantIntBuildVectorOrConstantInt(N0))
|
||||
return DAG.getNode(ISD::CTPOP, SDLoc(N), VT, N0);
|
||||
if (SDValue C = DAG.FoldConstantArithmetic(ISD::CTPOP, DL, VT, {N0}))
|
||||
return C;
|
||||
return SDValue();
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user