From 2acca37a2dccea9e84a116c610e8f67f9abbd0a4 Mon Sep 17 00:00:00 2001 From: Simon Pilgrim Date: Wed, 20 Mar 2019 11:41:52 +0000 Subject: [PATCH] [X86] Use getConstantOperandAPInt to detect out-of-range shifts. llvm-svn: 356549 --- llvm/lib/Target/X86/X86ISelLowering.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index d8fe437..1185b8b 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -41161,11 +41161,12 @@ static SDValue combineCMP(SDNode *N, SelectionDAG &DAG) { onlyZeroFlagUsed(SDValue(N, 0))) { EVT VT = Op.getValueType(); unsigned BitWidth = VT.getSizeInBits(); - unsigned ShAmt = Op.getConstantOperandVal(1); - if (ShAmt < BitWidth) { // Avoid undefined shifts. + const APInt &ShAmt = Op.getConstantOperandAPInt(1); + if (ShAmt.ult(BitWidth)) { // Avoid undefined shifts. + unsigned MaskBits = BitWidth - ShAmt.getZExtValue(); APInt Mask = Op.getOpcode() == ISD::SRL - ? APInt::getHighBitsSet(BitWidth, BitWidth - ShAmt) - : APInt::getLowBitsSet(BitWidth, BitWidth - ShAmt); + ? APInt::getHighBitsSet(BitWidth, MaskBits) + : APInt::getLowBitsSet(BitWidth, MaskBits); if (Mask.isSignedIntN(32)) { Op = DAG.getNode(ISD::AND, dl, VT, Op.getOperand(0), DAG.getConstant(Mask, dl, VT)); @@ -41175,7 +41176,6 @@ static SDValue combineCMP(SDNode *N, SelectionDAG &DAG) { } } - // Look for a truncate with a single use. if (Op.getOpcode() != ISD::TRUNCATE || !Op.hasOneUse()) return SDValue(); -- 2.7.4