[llvm] [X86] IsElementEquivalent - add handling for ISD::BITCASTS from smaller vector elements (PR #139741)
Phoebe Wang via llvm-commits
llvm-commits at lists.llvm.org
Sun May 18 16:22:04 PDT 2025
================
@@ -9987,19 +9987,29 @@ static bool IsElementEquivalent(int MaskSize, SDValue Op, SDValue ExpectedOp,
MaskSize == (int)ExpectedOp.getNumOperands())
return Op.getOperand(Idx) == ExpectedOp.getOperand(ExpectedIdx);
break;
- case ISD::BITCAST:
- if (Op == ExpectedOp && (int)VT.getVectorNumElements() == MaskSize) {
- SDValue Src = peekThroughBitcasts(Op);
- EVT SrcVT = Src.getValueType();
- if (SrcVT.isVector() &&
- (SrcVT.getScalarSizeInBits() % VT.getScalarSizeInBits()) == 0) {
+ case ISD::BITCAST: {
+ SDValue Src = peekThroughBitcasts(Op);
+ EVT SrcVT = Src.getValueType();
+ if (Op == ExpectedOp && SrcVT.isVector() &&
+ (int)VT.getVectorNumElements() == MaskSize) {
+ if ((SrcVT.getScalarSizeInBits() % VT.getScalarSizeInBits()) == 0) {
unsigned Scale = SrcVT.getScalarSizeInBits() / VT.getScalarSizeInBits();
return (Idx % Scale) == (ExpectedIdx % Scale) &&
IsElementEquivalent(SrcVT.getVectorNumElements(), Src, Src,
Idx / Scale, ExpectedIdx / Scale);
}
+ if ((VT.getScalarSizeInBits() % SrcVT.getScalarSizeInBits()) == 0) {
+ unsigned Scale = VT.getScalarSizeInBits() / SrcVT.getScalarSizeInBits();
+ bool AllEquiv = true;
+ for (unsigned I = 0; I != Scale && AllEquiv; ++I)
+ AllEquiv &=
+ IsElementEquivalent(SrcVT.getVectorNumElements(), Src, Src,
+ (Idx * Scale) + I, (ExpectedIdx * Scale) + I);
+ return AllEquiv;
----------------
phoebewang wrote:
```suggestion
for (unsigned I = 0; I != Scale; ++I)
if (IsElementEquivalent(SrcVT.getVectorNumElements(), Src, Src,
(Idx * Scale) + I, (ExpectedIdx * Scale) + I))
return false;
return true;
```
https://github.com/llvm/llvm-project/pull/139741
More information about the llvm-commits
mailing list