================
@@ -1684,7 +1684,8 @@ void EmitterBase::EmitBuiltinCG(raw_ostream &OS) {
         OS << "  case ARM::BI__builtin_arm_" << OI.Int->builtinExtension()
            << "_" << OI.Name << ":\n";
         for (size_t i = 0, e = MG.ParamTypes.size(); i < e; ++i)
-          OS << "    Param" << utostr(i) << " = " << OI.ParamValues[i] << 
";\n";
+          OS << "    Param" << utostr(i) << " = static_cast<"
+             << MG.ParamTypes[i] << ">(" << OI.ParamValues[i] << ");\n";
----------------
statham-arm wrote:

I'd guessed that much, but I was still confused about why the cast _there_, 
when the `static_cast<Align>` was already present in the actual call to 
`Builder.CreateMaskedStore`.

But now I've looked at the output of your modified clang-tblgen, I understand:

```c++
case ARM::BI__builtin_arm_mve_vst1q_p_f16:
// ...
case ARM::BI__builtin_arm_mve_vstrwq_p_u32: {
  llvm::Type * Param0;
  Align  Param1;
  switch (BuiltinID) {
  case ARM::BI__builtin_arm_mve_vst1q_p_f16:
    Param0 = static_cast<llvm::Type 
*>(llvm::FixedVectorType::get(Builder.getInt1Ty(), 8));
    Param1 = static_cast<Align>(2);
    break;
    // ...
  case ARM::BI__builtin_arm_mve_vstrwq_p_u32:
    Param0 = static_cast<llvm::Type 
*>(llvm::FixedVectorType::get(Builder.getInt1Ty(), 4));
    Param1 = static_cast<Align>(4);
    break;
  }
  // ...
  return Builder.CreateMaskedStore(Val0, Val2, static_cast<Align>(Param1), 
Val5);
}
```

If the cast in the `CreateMaskedStore` were to be enough, it would have to be 
because `Param1` had some other type which could be initialized via an integer 
literal, and it's easier to add a second cast to the same type than to invent 
an appropriate alternative type.

https://github.com/llvm/llvm-project/pull/163790
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to