[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