[llvm] [VectorCombine] Add type shrinking and zext propagation for fixed-width vector types (PR #104606)
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 4 10:27:49 PDT 2024
================
@@ -2493,6 +2494,91 @@ bool VectorCombine::foldSelectShuffle(Instruction &I, bool FromReduction) {
return true;
}
+/// Check if instruction depends on ZExt and this ZExt can be moved after the
+/// instruction. Move ZExt if it is profitable
+bool VectorCombine::shrinkType(llvm::Instruction &I) {
+ Value *ZExted, *OtherOperand;
+ if (!match(&I, m_c_BitwiseLogic(m_ZExt(m_Value(ZExted)),
+ m_Value(OtherOperand))) &&
+ !match(&I, m_LShr(m_ZExt(m_Value(ZExted)), m_Value(OtherOperand))))
+ return false;
+
+ Instruction *ZExtOperand =
+ cast<Instruction>(I.getOperand(I.getOperand(0) == OtherOperand ? 1 : 0));
+
+ auto *BigTy = cast<FixedVectorType>(I.getType());
+ auto *SmallTy = cast<FixedVectorType>(ZExted->getType());
+ unsigned BW = SmallTy->getElementType()->getPrimitiveSizeInBits();
+
+ // Check that the expression overall uses at most the same number of bits as
+ // ZExted
+ KnownBits KB = computeKnownBits(&I, *DL);
+ unsigned IBW = KB.getBitWidth() - KB.Zero.countLeadingOnes();
----------------
RKSimon wrote:
In fact, we could just use `unsigned IBW = KB.countMaxActiveBits()` (and similar below)
https://github.com/llvm/llvm-project/pull/104606
More information about the llvm-commits
mailing list