<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/55410>55410</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [SVE] Assertion fails in PtrToInt with scalable vector
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          stevesuzuki-arm
      </td>
    </tr>
</table>

<pre>
    ```
/llvm-project/llvm/include/llvm/Support/Casting.h:269: typename llvm::cast_retty<X, Y*>::ret_type llvm::cast(Y*) [with X = llvm::FixedVectorType; Y = llvm::Type; typename llvm::cast_retty<X, Y*>::ret_type = llvm::FixedVectorType*]: Assertion `isa<X>(Val) && "cast<Ty>() argument of incompatible type!"' failed.
```
, which is probably called from
```
Constant *ConstantExpr::getPtrToInt(Constant *C, Type *DstTy,
                                    bool OnlyIfReduced) {
  assert(C->getType()->isPtrOrPtrVectorTy() &&
         "PtrToInt source must be pointer or pointer vector");
  assert(DstTy->isIntOrIntVectorTy() &&
         "PtrToInt destination must be integer or integer vector");
  assert(isa<VectorType>(C->getType()) == isa<VectorType>(DstTy));
  if (isa<VectorType>(C->getType()))
    assert(cast<FixedVectorType>(C->getType())->getNumElements() ==
               cast<FixedVectorType>(DstTy)->getNumElements() &&
           "Invalid cast between a different number of vector elements");
  return getFoldedCast(Instruction::PtrToInt, C, DstTy, OnlyIfReduced);
}
```
Pseudo code for this case is as follows. This happens with scalable vector and not with fixed sized vector.
```
{
    auto ec = ElementCount::getScalable(4);
    // auto ec = ElementCount::getFixed(4);
    Type *Int64Ty = Type::getInt64Ty(M->getContext());
    Type *Int64x4Ty = VectorType::get(Int64Ty, ec);
    PointerType *Int8PtrTy = Type::getInt8PtrTy(M->getContext());

    FunctionType *MainFty = FunctionType::get(Int64Ty, {}, false);
    Function *MainFn = Function::Create(MainFty, GlobalValue::ExternalLinkage, "main", M);
    BasicBlock *BB = BasicBlock::Create(M->getContext(), "entry", MainFn);
    Builder.SetInsertPoint(BB);

    Value *p = ConstantPointerNull::get(Int8PtrTy);
    Value *p_bc = Builder.CreateVectorSplat(ec, p);
    V = Builder.CreatePtrToInt(p_bc, Int64x4Ty);
    Builder.CreateRet(V);
}
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJylVltv4joQ_jXhxSoK4RJ44KEEOKq03VZbVO0-VU4yAZ-aOPKlLfvrd2wnQNPQ3dVWUUg9nm--udqpyA_zYBLWT7gMwusgWnP-sr-qpPgfMl3_iz-szLjJ4bTwYKpKSLsjoUqzctvfBcPraDLDN9GHCkq6B-I2D6_xyXDXkwStD8Ew-R5ECfkRRChYeTFKnqxWSyOIpm5bNCPBePHK9I58J8FwebZtzd4gf0SyQm4QIBguyI_Wlmb9H2h9bhM1xkvr-LVSIDUTJcGQMkUdKIJF00fKnRfRBB_8iZx7w2Rz8HIrpHJr9lBqIgqCARf7imqWcnDEg2iAWkEUk4IyDnm_zlg7gQl53bFsR5gimMWUpvxAMspRgxRS7Du1ElEqTdEwetJ8r94q6b3dgr7XciNuSpuPd3utuY2LT3S9VBqdiRIPSf7gLxWCk7uSH26Kb5CbDHIXonjRQFAXTmv0CqOEPHy0bbDsAlPI607iq8lFHUgf5RYRjF7jBlHCyAzI3ihNUiCVYKUGSYQ8fr44RBdxLOmPjJy3ngQC3kl8_S2JHGzjUFcuDRNrfOuZNJ-_Y-LL7LwDVp0Rc5yGS1vJ3Sp1Amfv7bCC_J0R-xydPrKsy_1Dt16Eqde-mv2Kg-0K1cTV-dBZZZ8Zaby7jNuVL5exm_KFcpY7eEySfgUoCSU5KwqQtl9Ls09t0oo6WQSO0K2s4UAxsiRIYC14Dnnih9wN9pQ0mS0F33OnhkuI67Kmuz70yxE8iJedzX2vwOSCZCIHUiA3vcPRgK6AHRFU4Rrn4lX1ycYKdrTCIamIm7UKBwe1A6h2i5Y5KYX2wsJGmSj2E99efmEknfoZ68FoQSBz87SOfyIM-tlMmofaJAZl9D50NhVrfH6P4fLfBdCMKgzsZLQ5OARfIbVmLUDd27pOcNxpeNOn6r6I99YgnldejetSXEMnyL0NdO-nzhne1FZAN0Mv-hOOJwNrU7rqaizcUlautcc_l11gbHOI5YVfBeUK2vQbhCNy-Q7YgyYSqLZ5rW1btP84nlAcz0ZTW169YRhKyr-w8pluwdmOoj1quFZKyG3b9oIqli24yJ6t9cXCWT4ttm13h8xZwTqSh8aM8-KDLcOwaWX_webBDjaXNwRZLLrD7jyzvCpHqzk763R_NZy3At7k9r3dE8xT6uu-YeId8xX3UHFqYWx5JaT6ANKheHauW2ird6zlS857zW-O8ePnA6iXz4f5bDijPc00hzne4R4eV3hXOrso2duMwsOOHM_FrtHTM5LPd1pXygbMzYEtbjNpH69Jp1tp6_LKlDKAQ3g9Ho8GYW83H43yKBykKUzG8Qhm4yIGiMM4nMQTGmZZ1kObwJUliix7bB6FURSOB9FgOh6MJ_04Dqe0GMaTcBpnUTYNRiFgcfK-NdwXctuTc8chNVuFQs6UVichnoZsWwI0-DjJdkLOlYYXUOaneWZXVO57jvbccf4FxDx1Fg">