[PATCH] D95016: [Clang][RISCV] Add custom TableGen backend for riscv-vector intrinsics.

Jessica Clarke via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Jan 25 07:57:42 PST 2021


jrtc27 added inline comments.


================
Comment at: clang/test/CodeGen/RISCV/riscv-rvv-intrinsics-generic/vadd.c:7-8
+// RUN: %clang_cc1 -triple riscv64 -target-feature +f -target-feature +d -target-feature +experimental-v \
+// RUN:   -target-feature +experimental-zfh -Werror -Wall -o - %s >/dev/null 2>%t
+// RUN: FileCheck --check-prefix=ASM --allow-empty %s <%t
+
----------------
This is poor style, but should be unnecessary per my comment below


================
Comment at: clang/test/CodeGen/RISCV/riscv-rvv-intrinsics-generic/vadd.c:10
+
+// ASM-NOT: warning
+#include <riscv_vector_generic.h>
----------------
Asm checks are discouraged in Clang. If you want to check for Clang warnings, use -verify, and in this case you want `// expected-no-diagnostics`.


================
Comment at: clang/test/CodeGen/RISCV/riscv-rvv-intrinsics-generic/vadd.c:38
+vint8m1_t test_vadd_vv_i8m1_m_vl(vbool8_t arg_1, vint8m1_t arg_2, vint8m1_t arg_3, vint8m1_t arg_4, size_t arg_5) {
+//
+  return vadd_m_vl(arg_1, arg_2, arg_3, arg_4, arg_5);
----------------
Delete


================
Comment at: clang/utils/TableGen/RISCVVEmitter.cpp:36
+public:
+  ELMULType() : ELMULType(0) {}
+  ELMULType(int ELMUL);
----------------
Surely being uninitialised is an error and we expect to always have it specified in the source?


================
Comment at: clang/utils/TableGen/RISCVVEmitter.cpp:48-55
+  bool Float, Bool, Signed;
+  // Constant indices are "int", but have the constant expression.
+  bool Immediate;
+  bool Void;
+  // const qualifier.
+  bool Constant;
+  bool Pointer;
----------------
These are poor names; many of them don't sound like bools, and are some of them not mutually exclusive? If so, an enum would be better.


================
Comment at: clang/utils/TableGen/RISCVVEmitter.cpp:55
+  bool Pointer;
+  bool SIZE_T, PtrDiff_T;
+  unsigned ElementBitwidth;
----------------
Capitalisation.


================
Comment at: clang/utils/TableGen/RISCVVEmitter.cpp:56
+  bool SIZE_T, PtrDiff_T;
+  unsigned ElementBitwidth;
+  VScaleVal Vscale;
----------------
Capital W.


================
Comment at: clang/utils/TableGen/RISCVVEmitter.cpp:57
+  unsigned ElementBitwidth;
+  VScaleVal Vscale;
+  bool Valid;
----------------
VScale. Or just drop the V and use Scale?


================
Comment at: clang/utils/TableGen/RISCVVEmitter.cpp:87-95
+  bool isHalfVector() const {
+    return isVector() && Float && ElementBitwidth == 16;
+  }
+  bool isFloatVector() const {
+    return isVector() && Float && ElementBitwidth == 32;
+  }
+  bool isDoubleVector() const {
----------------
though at that point the wrappers are a bit unnecessary as they only seem to be used once.


================
Comment at: clang/utils/TableGen/RISCVVEmitter.cpp:109
+  // Compute and record a string for legal type.
+  void compute_builtin_str();
+  // Compute and record a builtin RVV vector type string.
----------------
Camel-case?


================
Comment at: clang/utils/TableGen/RISCVVEmitter.cpp:121
+
+enum class RISCV_Extension : uint8_t {
+  Basic = 0,
----------------
Using an `enum class` for a bitmask doesn't make much sense.


================
Comment at: clang/utils/TableGen/RISCVVEmitter.cpp:294
+
+// type\lmul |1/8    |1/4      |1/2     |1       |2       |4        |8
+// --------  |------ |-------- |------- |------- |--------|-------- |--------
----------------
Please make sure there's at least 1 space around things


================
Comment at: clang/utils/TableGen/RISCVVEmitter.cpp:308
+    return false;
+  if (Float && ElementBitwidth == 8)
+    return false;
----------------
or 1? Clearer to move this into the switch below IMO.


================
Comment at: clang/utils/TableGen/RISCVVEmitter.cpp:315
+    // Check Vscale is 1,2,4,8,16,32,64
+    return (V <= 64 && countPopulation(V) == 1);
+  case 16:
----------------
isPowerOf2_32 from llvm/Support/MathExtras.h


================
Comment at: clang/utils/TableGen/RISCVVEmitter.cpp:380
+  }
+  if (!Float && !Bool) {
+    if (Signed)
----------------
Move into the !Float above


================
Comment at: clang/utils/TableGen/RISCVVEmitter.cpp:386
+  }
+  if (Immediate) {
+    assert(!Float && "fp immediates are not supported");
----------------
Move into the !Float above


================
Comment at: clang/utils/TableGen/RISCVVEmitter.cpp:512
+
+void RVVType::applyModifier(StringRef transformer) {
+  if (transformer.empty())
----------------
Capital T


================
Comment at: clang/utils/TableGen/RISCVVEmitter.cpp:693
+
+void RVVIntrinsic::emitFuncDelc(raw_ostream &OS, bool IsMangled) const {
+  // Index 0 is output type
----------------
Decl?


================
Comment at: clang/utils/TableGen/RISCVVEmitter.cpp:714
+  OS << "{\n";
+  OS << Twine("  return " + getName() + "(").str();
+  // Emit parameter variables
----------------
This is odd, why not `OS << "  return " + getName() + "(";` or `OS << "  return " << getName() << "(";`


================
Comment at: clang/utils/TableGen/RISCVVEmitter.cpp:777
+  // Dump RVV int/float types.
+  for (char I : StringRef("csil"))
+    for (int ELMUL : ELMULs) {
----------------
Personally not a fan of omitting the curly braces in cases like this, it's non-obvious and more error-prone than when you don't have nesting.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D95016



More information about the llvm-commits mailing list