From 94e8f152c16a2b4b6784b36572e3acabb92b283b Mon Sep 17 00:00:00 2001 From: Simon Pilgrim Date: Fri, 22 Mar 2019 20:53:49 +0000 Subject: [PATCH] [TargetLowering] SimplifyDemandedBits trunc(srl(x, C1)) - early out for out of range C1. NFCI. llvm-svn: 356810 --- llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp | 38 ++++++++++++------------ 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp index 8bddebd..5ebbd93 100644 --- a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp @@ -1257,29 +1257,29 @@ bool TargetLowering::SimplifyDemandedBits( // Do not turn (vt1 truncate (vt2 srl)) into (vt1 srl) if vt1 is // undesirable. break; - ConstantSDNode *ShAmt = dyn_cast(Src.getOperand(1)); - if (!ShAmt) + + auto *ShAmt = dyn_cast(Src.getOperand(1)); + if (!ShAmt || ShAmt->getAPIntValue().uge(BitWidth)) break; + SDValue Shift = Src.getOperand(1); - if (TLO.LegalTypes()) { - uint64_t ShVal = ShAmt->getZExtValue(); + uint64_t ShVal = ShAmt->getZExtValue(); + + if (TLO.LegalTypes()) Shift = TLO.DAG.getConstant(ShVal, dl, getShiftAmountTy(VT, DL)); - } - if (ShAmt->getZExtValue() < BitWidth) { - APInt HighBits = APInt::getHighBitsSet(OperandBitWidth, - OperandBitWidth - BitWidth); - HighBits.lshrInPlace(ShAmt->getZExtValue()); - HighBits = HighBits.trunc(BitWidth); - - if (!(HighBits & DemandedBits)) { - // None of the shifted in bits are needed. Add a truncate of the - // shift input, then shift it. - SDValue NewTrunc = - TLO.DAG.getNode(ISD::TRUNCATE, dl, VT, Src.getOperand(0)); - return TLO.CombineTo( - Op, TLO.DAG.getNode(ISD::SRL, dl, VT, NewTrunc, Shift)); - } + APInt HighBits = + APInt::getHighBitsSet(OperandBitWidth, OperandBitWidth - BitWidth); + HighBits.lshrInPlace(ShVal); + HighBits = HighBits.trunc(BitWidth); + + if (!(HighBits & DemandedBits)) { + // None of the shifted in bits are needed. Add a truncate of the + // shift input, then shift it. + SDValue NewTrunc = + TLO.DAG.getNode(ISD::TRUNCATE, dl, VT, Src.getOperand(0)); + return TLO.CombineTo( + Op, TLO.DAG.getNode(ISD::SRL, dl, VT, NewTrunc, Shift)); } break; } -- 2.7.4