[PATCH] D140992: clang: Add __builtin_elementwise_fma
Matt Arsenault via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Feb 23 03:59:13 PST 2023
arsenm marked an inline comment as done.
arsenm added inline comments.
================
Comment at: clang/lib/Sema/SemaChecking.cpp:2615
QualType ArgTy = TheCall->getArg(0)->getType();
- QualType EltTy = ArgTy;
-
- if (auto *VecTy = EltTy->getAs<VectorType>())
- EltTy = VecTy->getElementType();
- if (!EltTy->isFloatingType()) {
- Diag(TheCall->getArg(0)->getBeginLoc(),
- diag::err_builtin_invalid_arg_type)
- << 1 << /* float ty*/ 5 << ArgTy;
-
+ if (checkFPMathBuiltinElementType(*this, TheCall->getArg(0)->getBeginLoc(),
+ ArgTy, 1))
----------------
aaron.ballman wrote:
> arsenm wrote:
> > bob80905 wrote:
> > > This change appears to allow more types (such as integers) as args for this set of builtins in the above cases, where before the behavior was to just allow floats.
> > > Is this intended behavior?
> > >
> > No? test/Sema/builtins-elementwise-math.c already checks all of these reject integers and passes
> As best I can tell, it actually allows *less* types. The old code was calling `!EltTy->isFloatingType()` and the new code is calling `!EltTy->isRealFloatingType()`, so the old code would allow a complex float while the new code prohibits it. Is that intentional?
>
> We should add some explicit test coverage for how these builtins work with complex types.
There already are complex tests for these. For some reason the type check was split between here and checkMathBuiltinElementType through PrepareBuiltinElementwiseMathOneArgCall
================
Comment at: clang/lib/Sema/SemaChecking.cpp:17761-17766
+ for (int I = 0; I < 3; ++I) {
+ ExprResult Converted = UsualUnaryConversions(TheCall->getArg(I));
+ if (Converted.isInvalid())
+ return true;
+ Args[I] = Converted.get();
+ }
----------------
aaron.ballman wrote:
> This will cause conversions to happen *before* we check whether the types are the same; is that expected? e.g., it seems like this would allow you to pass a float and a double and thanks to the magic of usual unary conversions they both come out as double and thus don't get diagnosed.
The tests say that isn't happening, e.g. here:
```
f32 = __builtin_elementwise_fma(f64, f32, f32);
// expected-error at -1 {{arguments are of different types ('double' vs 'float')}}
f32 = __builtin_elementwise_fma(f32, f64, f32);
// expected-error at -1 {{arguments are of different types ('float' vs 'double')}}
```
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D140992/new/
https://reviews.llvm.org/D140992
More information about the cfe-commits
mailing list