[InstCombine] use m_APInt to allow shift-shift folds for vectors with splat constants

Some existing 'FIXME' tests are still not folded because of splat holes in value tracking.

llvm-svn: 292151
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineShifts.cpp b/llvm/lib/Transforms/InstCombine/InstCombineShifts.cpp
index 8ccbd5cf..2a42fe7 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineShifts.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineShifts.cpp
@@ -72,9 +72,9 @@
                                     Instruction *CxtI) {
   assert(SecondShift->isLogicalShift() && "Unexpected instruction type");
 
-  // We need constant shifts.
-  auto *SecondShiftConst = dyn_cast<ConstantInt>(SecondShift->getOperand(1));
-  if (!SecondShiftConst)
+  // We need constant scalar or constant splat shifts.
+  const APInt *SecondShiftConst;
+  if (!match(SecondShift->getOperand(1), m_APInt(SecondShiftConst)))
     return false;
 
   unsigned SecondShiftAmt = SecondShiftConst->getZExtValue();
@@ -200,7 +200,8 @@
   unsigned TypeWidth = ShType->getScalarSizeInBits();
 
   // We only accept shifts-by-a-constant in canEvaluateShifted().
-  ConstantInt *C1 = cast<ConstantInt>(InnerShift->getOperand(1));
+  const APInt *C1;
+  match(InnerShift->getOperand(1), m_APInt(C1));
   unsigned InnerShAmt = C1->getZExtValue();
 
   // Change the shift amount and clear the appropriate IR flags.