[PATCH] D42983: [clang-tidy] Add readability-simd-intrinsics check.
Roman Lebedev via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Feb 7 04:30:58 PST 2018
lebedev.ri added inline comments.
================
Comment at: clang-tidy/readability/SIMDIntrinsicsCheck.cpp:26
+
+ static const llvm::StringMap<std::string> Mapping{
+ // [simd.alg]
----------------
You probably want to move `Mapping` out of the function.
================
Comment at: clang-tidy/readability/SIMDIntrinsicsCheck.cpp:34
+ {"sub", "operator- on std::experimental::simd objects"},
+ {"mul", "operator* on std::experimental::simd objects"},
+ };
----------------
To point the obvious, this is not exhaustive list, at least `div` is missing.
================
Comment at: clang-tidy/readability/SIMDIntrinsicsCheck.cpp:55
+ // [simd.binary]
+ if (Name.startswith("add_"))
+ return "operator+ on std::experimental::simd objects";
----------------
This function was not updated to use the `Mapping` map.
================
Comment at: clang-tidy/readability/SIMDIntrinsicsCheck.cpp:75
+ // libcxx implementation of std::experimental::simd requires at least C++11.
+ if (!Result.Context->getLangOpts().CPlusPlus11)
+ return;
----------------
Is it reasonable to suggest to use `<experimental/*>`?
I would guess it should be `CPlusPlus2a`
================
Comment at: clang-tidy/readability/SIMDIntrinsicsCheck.cpp:84
+ // SIMD intrinsic call.
+ const FunctionDecl *Callee = Call->getDirectCallee();
+ if (!Callee)
----------------
I would refactor this as astmatcher, at least a local one, e.g. something like
```
AST_MATCHER(CallExpr, hasDirectCallee) {
return Node.getDirectCallee();
}
```
+
```
void SIMDIntrinsicsCheck::registerMatchers(MatchFinder *Finder) {
Finder->addMatcher(
callExpr(callee(
+ allOf(
functionDecl(matchesName("^::(_mm_|_mm256_|_mm512_|vec_)")
+ , hasDirectCallee()
+ )
)),
unless(isExpansionInSystemHeader()))
.bind("call"),
this);
}
```
Unless of course there is already a narrower that does that
================
Comment at: clang-tidy/readability/SIMDIntrinsicsCheck.cpp:87
+ return;
+ bool IsVector = Callee->getReturnType()->isVectorType();
+ for (const ParmVarDecl *Parm : Callee->parameters()) {
----------------
Same here, i *think* something like this would be better?
```
AST_MATCHER(FunctionDecl, isVectorFunction) {
bool IsVector = Node.getReturnType()->isVectorType();
for (const ParmVarDecl *Parm : Node.parameters()) {
QualType Type = Parm->getType();
if (Type->isPointerType())
Type = Type->getPointeeType();
if (Type->isVectorType())
IsVector = true;
return IsVector;
}
```
+
```
void SIMDIntrinsicsCheck::registerMatchers(MatchFinder *Finder) {
Finder->addMatcher(
callExpr(callee(
allOf(
functionDecl(
+ allOf(
matchesName("^::(_mm_|_mm256_|_mm512_|vec_)")
+ , isVectorFunction()
+ )
, hasDirectCallee()
)
)),
unless(isExpansionInSystemHeader()))
.bind("call"),
this);
}
```
================
Comment at: docs/clang-tidy/checks/readability-simd-intrinsics.rst:1
+.. title:: clang-tidy - simd-readability-intrinsics
+
----------------
This should be
```
.. title:: clang-tidy - readability-simd-intrinsics
```
================
Comment at: docs/clang-tidy/checks/readability-simd-intrinsics.rst:3
+
+simd-readability-intrinsics
+===========================
----------------
Here too
Repository:
rCTE Clang Tools Extra
https://reviews.llvm.org/D42983
More information about the cfe-commits
mailing list