forked from OSchip/llvm-project
[DAGCombiner] improve readability
This is not quite NFC because I changed the SDLoc to use the more standard 'N' (the starting node for the fold). This transform is a special-case of a more general fold that we do in IR, but it seems like the general fold is needed here too to avoid a potential regression seen in D58017. https://rise4fun.com/Alive/3jZm
This commit is contained in:
parent
7ffe7d5ed7
commit
b39009bf1d
|
@ -7922,26 +7922,26 @@ SDValue DAGCombiner::visitSRL(SDNode *N) {
|
|||
}
|
||||
}
|
||||
|
||||
// fold (srl (trunc (srl x, c1)), c2) -> 0 or (trunc (srl x, (add c1, c2)))
|
||||
// TODO - support non-uniform vector shift amounts.
|
||||
if (N1C && N0.getOpcode() == ISD::TRUNCATE &&
|
||||
N0.getOperand(0).getOpcode() == ISD::SRL) {
|
||||
if (auto N001C = isConstOrConstSplat(N0.getOperand(0).getOperand(1))) {
|
||||
SDValue InnerShift = N0.getOperand(0);
|
||||
// TODO - support non-uniform vector shift amounts.
|
||||
if (auto *N001C = isConstOrConstSplat(InnerShift.getOperand(1))) {
|
||||
uint64_t c1 = N001C->getZExtValue();
|
||||
uint64_t c2 = N1C->getZExtValue();
|
||||
EVT InnerShiftVT = N0.getOperand(0).getValueType();
|
||||
EVT ShiftCountVT = N0.getOperand(0).getOperand(1).getValueType();
|
||||
EVT InnerShiftVT = InnerShift.getValueType();
|
||||
EVT ShiftAmtVT = InnerShift.getOperand(1).getValueType();
|
||||
uint64_t InnerShiftSize = InnerShiftVT.getScalarSizeInBits();
|
||||
// srl (trunc (srl x, c1)), c2 --> 0 or (trunc (srl x, (add c1, c2)))
|
||||
// This is only valid if the OpSizeInBits + c1 = size of inner shift.
|
||||
if (c1 + OpSizeInBits == InnerShiftSize) {
|
||||
SDLoc DL(N0);
|
||||
SDLoc DL(N);
|
||||
if (c1 + c2 >= InnerShiftSize)
|
||||
return DAG.getConstant(0, DL, VT);
|
||||
return DAG.getNode(ISD::TRUNCATE, DL, VT,
|
||||
DAG.getNode(ISD::SRL, DL, InnerShiftVT,
|
||||
N0.getOperand(0).getOperand(0),
|
||||
DAG.getConstant(c1 + c2, DL,
|
||||
ShiftCountVT)));
|
||||
SDValue NewShiftAmt = DAG.getConstant(c1 + c2, DL, ShiftAmtVT);
|
||||
SDValue NewShift = DAG.getNode(ISD::SRL, DL, InnerShiftVT,
|
||||
InnerShift.getOperand(0), NewShiftAmt);
|
||||
return DAG.getNode(ISD::TRUNCATE, DL, VT, NewShift);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue