forked from OSchip/llvm-project
Added checking code whehter target supports specific dag combining about rotate
or not. The corresponding dag patterns are as following: "DAGCombier::MatchRotate" function in DAGCombiner.cpp Pattern1 // fold (or (shl (*ext x), (*ext y)), // (srl (*ext x), (*ext (sub 32, y)))) -> // (*ext (rotl x, y)) // fold (or (shl (*ext x), (*ext y)), // (srl (*ext x), (*ext (sub 32, y)))) -> // (*ext (rotr x, (sub 32, y))) pattern2 // fold (or (shl (*ext x), (*ext (sub 32, y))), // (srl (*ext x), (*ext y))) -> // (*ext (rotl x, y)) // fold (or (shl (*ext x), (*ext (sub 32, y))), // (srl (*ext x), (*ext y))) -> // (*ext (rotr x, (sub 32, y))) llvm-svn: 191905
This commit is contained in:
parent
19a1302046
commit
0bf8241d4b
|
@ -3415,11 +3415,15 @@ SDNode *DAGCombiner::MatchRotate(SDValue LHS, SDValue RHS, SDLoc DL) {
|
|||
// (*ext (rotr x, (sub 32, y)))
|
||||
SDValue LArgExtOp0 = LHSShiftArg.getOperand(0);
|
||||
EVT LArgVT = LArgExtOp0.getValueType();
|
||||
if (LArgVT.getSizeInBits() == SUBC->getAPIntValue()) {
|
||||
SDValue V =
|
||||
DAG.getNode(HasROTL ? ISD::ROTL : ISD::ROTR, DL, LArgVT,
|
||||
LArgExtOp0, HasROTL ? LHSShiftAmt : RHSShiftAmt);
|
||||
return DAG.getNode(LHSShiftArg.getOpcode(), DL, VT, V).getNode();
|
||||
bool HasROTRWithLArg = TLI.isOperationLegalOrCustom(ISD::ROTR, LArgVT);
|
||||
bool HasROTLWithLArg = TLI.isOperationLegalOrCustom(ISD::ROTL, LArgVT);
|
||||
if (HasROTRWithLArg || HasROTLWithLArg) {
|
||||
if (LArgVT.getSizeInBits() == SUBC->getAPIntValue()) {
|
||||
SDValue V =
|
||||
DAG.getNode(HasROTLWithLArg ? ISD::ROTL : ISD::ROTR, DL, LArgVT,
|
||||
LArgExtOp0, HasROTL ? LHSShiftAmt : RHSShiftAmt);
|
||||
return DAG.getNode(LHSShiftArg.getOpcode(), DL, VT, V).getNode();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -3444,11 +3448,15 @@ SDNode *DAGCombiner::MatchRotate(SDValue LHS, SDValue RHS, SDLoc DL) {
|
|||
// (*ext (rotr x, (sub 32, y)))
|
||||
SDValue RArgExtOp0 = RHSShiftArg.getOperand(0);
|
||||
EVT RArgVT = RArgExtOp0.getValueType();
|
||||
if (RArgVT.getSizeInBits() == SUBC->getAPIntValue()) {
|
||||
SDValue V =
|
||||
DAG.getNode(HasROTR ? ISD::ROTR : ISD::ROTL, DL, RArgVT,
|
||||
RArgExtOp0, HasROTR ? RHSShiftAmt : LHSShiftAmt);
|
||||
return DAG.getNode(RHSShiftArg.getOpcode(), DL, VT, V).getNode();
|
||||
bool HasROTRWithRArg = TLI.isOperationLegalOrCustom(ISD::ROTR, RArgVT);
|
||||
bool HasROTLWithRArg = TLI.isOperationLegalOrCustom(ISD::ROTL, RArgVT);
|
||||
if (HasROTRWithRArg || HasROTLWithRArg) {
|
||||
if (RArgVT.getSizeInBits() == SUBC->getAPIntValue()) {
|
||||
SDValue V =
|
||||
DAG.getNode(HasROTRWithRArg ? ISD::ROTR : ISD::ROTL, DL, RArgVT,
|
||||
RArgExtOp0, HasROTR ? RHSShiftAmt : LHSShiftAmt);
|
||||
return DAG.getNode(RHSShiftArg.getOpcode(), DL, VT, V).getNode();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue