[PATCH] D111617: [RISCV] Lazily add RVV C intrinsics.

Aaron Ballman via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Fri Jul 1 06:53:31 PDT 2022


aaron.ballman added a comment.

Some drive-by comments from the peanut gallery.



================
Comment at: clang/lib/Parse/ParsePragma.cpp:3963
+        << PP.getSpelling(Tok) << "riscv" << /*Expected=*/true << "'intrinsic'";
+    return;
+  }
----------------
It's fine to warn on this, but then you need to eat tokens until the end of directive is found so that parsing recovery is correct. e.g.,
```
#pragma clang riscv int i = 12;
```
See `HandlePragmaAttribute()` for an example (though you'll look for `eod` instead of `eof`).


================
Comment at: clang/lib/Parse/ParsePragma.cpp:3971
+        << PP.getSpelling(Tok) << "riscv" << /*Expected=*/true << "'vector'";
+    return;
+  }
----------------
Same here.


================
Comment at: clang/lib/Parse/ParsePragma.cpp:3978
+        << "clang riscv intrinsic";
+    return;
+  }
----------------
And here as well.


================
Comment at: clang/lib/Sema/SemaRISCVVectorLookup.cpp:100
+    switch (Type->getElementBitwidth()) {
+    case 64:
+      QT = Context.DoubleTy;
----------------
I almost hate to ask, but... `long double`? Any of the 16-bit float types?


================
Comment at: clang/lib/Sema/SemaRISCVVectorLookup.cpp:111
+    break;
+  default:
+    llvm_unreachable("Unhandled type.");
----------------
Might as well handle `Invalid` and then drop the `default` entirely so it's a fully covered switch.


================
Comment at: clang/lib/Sema/SemaRISCVVectorLookup.cpp:121
+  // Transform the type to a pointer as the last step, if necessary.
+  if (Type->isPointer())
+    QT = Context.getPointerType(QT);
----------------
Double-checking -- do you have to care about references as well?


================
Comment at: clang/lib/Sema/SemaRISCVVectorLookup.cpp:185-186
+                                                   Record.OverloadedSuffixSize);
+    for (int TypeRangeMaskShift = 0;
+         TypeRangeMaskShift <= static_cast<int>(BasicType::MaxOffset);
+         ++TypeRangeMaskShift) {
----------------
Given that we're bit twiddling with this, I'd feel more comfortable if this was `unsigned int` rather than `int` (same for `BaseTypeI`).


================
Comment at: clang/lib/Sema/SemaRISCVVectorLookup.cpp:223-225
+        if (!Types.hasValue()) {
+          continue;
+        }
----------------



================
Comment at: clang/lib/Sema/SemaRISCVVectorLookup.cpp:227-229
+        auto SuffixStr =
+            RVVIntrinsic::getSuffixStr(BaseType, Log2LMUL, SuffixProto);
+        auto OverloadedSuffixStr = RVVIntrinsic::getSuffixStr(
----------------
You should spell the type explicitly here instead of using `auto`.


================
Comment at: clang/lib/Sema/SemaRISCVVectorLookup.cpp:235-237
+        bool HasMask = Record.MaskedPrototypeLength != 0;
+
+        if (HasMask) {
----------------



================
Comment at: clang/lib/Sema/SemaRISCVVectorLookup.cpp:299-301
+  auto Sigs = IDef.Signature;
+  size_t SigLength = Sigs.size();
+  auto ReturnType = Sigs[0];
----------------
Spell out the types instead of using `auto`.


================
Comment at: clang/lib/Sema/SemaRISCVVectorLookup.cpp:322
+      SC_Extern, S.getCurFPFeatures().isFPConstrained(), false,
+      BuiltinFuncType->isFunctionProtoType());
+
----------------
No need to calculate this, we already know.


================
Comment at: clang/lib/Sema/SemaRISCVVectorLookup.cpp:328
+  SmallVector<ParmVarDecl *, 8> ParmList;
+  for (unsigned IParm = 0, e = FP->getNumParams(); IParm != e; ++IParm) {
+    ParmVarDecl *Parm =
----------------
Naming style fix.


================
Comment at: clang/lib/Sema/SemaRISCVVectorLookup.cpp:342
+  // Setup alias to __builtin_rvv_*
+  auto &IntrinsicII = PP.getIdentifierTable().get(IDef.BuiltinName);
+  RVVIntrinsicDecl->addAttr(
----------------
Spell out type name.


================
Comment at: clang/lib/Sema/SemaRISCVVectorLookup.cpp:358
+  if (OvIItr != OverloadIntrinsics.end()) {
+    auto OvIntrinsicDef = OvIItr->second;
+    for (auto Index : OvIntrinsicDef.Indexs)
----------------
Spell out the type.


================
Comment at: clang/utils/TableGen/RISCVVEmitter.cpp:41
+
+  // Supported type, mask of BasicType
+  unsigned TypeRangeMask;
----------------



================
Comment at: clang/utils/TableGen/RISCVVEmitter.cpp:74
+public:
+  static constexpr unsigned INVALID_INDEX = (unsigned)-1;
+
----------------



================
Comment at: clang/utils/TableGen/RISCVVEmitter.cpp:232-237
+  for (const auto &SemaRecord : SemaRecords) {
+    InsertToSignatureSet(SemaRecord.Prototype);
+    InsertToSignatureSet(SemaRecord.MaskedPrototype);
+    InsertToSignatureSet(SemaRecord.Suffix);
+    InsertToSignatureSet(SemaRecord.OverloadedSuffix);
   }
----------------



================
Comment at: clang/utils/TableGen/RISCVVEmitter.cpp:239-240
+
+  for (const auto &Sig : Signatures)
+    insert(Sig);
+}
----------------
Pretty sure you can go with this instead.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D111617/new/

https://reviews.llvm.org/D111617



More information about the cfe-commits mailing list