llvmorg-github-actions[bot] wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang

Author: Craig Topper (topperc)

<details>
<summary>Changes</summary>

These types have a fixed size of 1, 2, 4. The formula used for the other types 
does not apply.

Assisted-by: Claude

---
Full diff: https://github.com/llvm/llvm-project/pull/204498.diff


2 Files Affected:

- (modified) clang/lib/AST/TypePrinter.cpp (+38-13) 
- (added) clang/test/AST/ast-dump-riscv-rvv-fixed-length-mask-types.c (+51) 


``````````diff
diff --git a/clang/lib/AST/TypePrinter.cpp b/clang/lib/AST/TypePrinter.cpp
index 53b869e019074..e8fbffb9f954d 100644
--- a/clang/lib/AST/TypePrinter.cpp
+++ b/clang/lib/AST/TypePrinter.cpp
@@ -725,13 +725,25 @@ void TypePrinter::printVectorBefore(const VectorType *T, 
raw_ostream &OS) {
     // FIXME: We prefer to print the size directly here, but have no way
     // to get the size of the type.
     OS << "__attribute__((__riscv_rvv_vector_bits__(";
-
-    OS << T->getNumElements();
-
-    OS << " * sizeof(";
-    print(T->getElementType(), OS, StringRef());
-    // Multiply by 8 for the number of bits.
-    OS << ") * 8))) ";
+    switch (T->getVectorKind()) {
+    case VectorKind::RVVFixedLengthMask_1:
+      OS << '1';
+      break;
+    case VectorKind::RVVFixedLengthMask_2:
+      OS << '2';
+      break;
+    case VectorKind::RVVFixedLengthMask_4:
+      OS << '4';
+      break;
+    default:
+      OS << T->getNumElements();
+      OS << " * sizeof(";
+      print(T->getElementType(), OS, StringRef());
+      // Multiply by 8 for the number of bits.
+      OS << ") * 8";
+      break;
+    }
+    OS << "))) ";
     printBefore(T->getElementType(), OS);
     break;
   }
@@ -808,12 +820,25 @@ void TypePrinter::printDependentVectorBefore(
     // FIXME: We prefer to print the size directly here, but have no way
     // to get the size of the type.
     OS << "__attribute__((__riscv_rvv_vector_bits__(";
-    if (T->getSizeExpr()) {
-      T->getSizeExpr()->printPretty(OS, nullptr, Policy);
-      OS << " * sizeof(";
-      print(T->getElementType(), OS, StringRef());
-      // Multiply by 8 for the number of bits.
-      OS << ") * 8";
+    switch (T->getVectorKind()) {
+    case VectorKind::RVVFixedLengthMask_1:
+      OS << '1';
+      break;
+    case VectorKind::RVVFixedLengthMask_2:
+      OS << '2';
+      break;
+    case VectorKind::RVVFixedLengthMask_4:
+      OS << '4';
+      break;
+    default:
+      if (T->getSizeExpr()) {
+        T->getSizeExpr()->printPretty(OS, nullptr, Policy);
+        OS << " * sizeof(";
+        print(T->getElementType(), OS, StringRef());
+        // Multiply by 8 for the number of bits.
+        OS << ") * 8";
+      }
+      break;
     }
     OS << "))) ";
     printBefore(T->getElementType(), OS);
diff --git a/clang/test/AST/ast-dump-riscv-rvv-fixed-length-mask-types.c 
b/clang/test/AST/ast-dump-riscv-rvv-fixed-length-mask-types.c
new file mode 100644
index 0000000000000..c66953974d3e6
--- /dev/null
+++ b/clang/test/AST/ast-dump-riscv-rvv-fixed-length-mask-types.c
@@ -0,0 +1,51 @@
+// Test printing of RVV fixed-length mask types 
(VectorKind::RVVFixedLengthMask*).
+
+// RUN: %clang_cc1 -triple riscv64-none-linux-gnu -target-feature +zve32x \
+// RUN:   -ffreestanding -mvscale-min=1 -mvscale-max=1 -ast-dump %s \
+// RUN:   | FileCheck %s
+
+typedef __rvv_bool64_t vbool64_t;
+typedef __rvv_bool32_t vbool32_t;
+typedef __rvv_bool16_t vbool16_t;
+typedef __rvv_bool8_t  vbool8_t;
+typedef __rvv_bool4_t  vbool4_t;
+typedef __rvv_bool2_t  vbool2_t;
+typedef __rvv_bool1_t  vbool1_t;
+
+// With vscale==1, __riscv_v_fixed_vlen==64.
+
+// RVVFixedLengthMask_1 (1-bit mask, getNumElements()==1)
+typedef vbool64_t fixed_bool64_t __attribute__((riscv_rvv_vector_bits(1)));
+// RVVFixedLengthMask_2 (2-bit mask, getNumElements()==1)
+typedef vbool32_t fixed_bool32_t __attribute__((riscv_rvv_vector_bits(2)));
+// RVVFixedLengthMask_4 (4-bit mask, getNumElements()==1)
+typedef vbool16_t fixed_bool16_t __attribute__((riscv_rvv_vector_bits(4)));
+// RVVFixedLengthMask (8-bit mask, getNumElements()==1)
+typedef vbool8_t fixed_bool8_t __attribute__((riscv_rvv_vector_bits(8)));
+// RVVFixedLengthMask (16-bit mask, getNumElements()==2)
+typedef vbool4_t fixed_bool4_t __attribute__((riscv_rvv_vector_bits(16)));
+// RVVFixedLengthMask (32-bit mask, getNumElements()==4)
+typedef vbool2_t fixed_bool2_t __attribute__((riscv_rvv_vector_bits(32)));
+// RVVFixedLengthMask (64-bit mask, getNumElements()==8)
+typedef vbool1_t fixed_bool1_t __attribute__((riscv_rvv_vector_bits(64)));
+
+fixed_bool64_t b64;
+// CHECK: b64 'fixed_bool64_t':'__attribute__((__riscv_rvv_vector_bits__(1))) 
unsigned char'
+
+fixed_bool32_t b32;
+// CHECK: b32 'fixed_bool32_t':'__attribute__((__riscv_rvv_vector_bits__(2))) 
unsigned char'
+
+fixed_bool16_t b16;
+// CHECK: b16 'fixed_bool16_t':'__attribute__((__riscv_rvv_vector_bits__(4))) 
unsigned char'
+
+fixed_bool8_t b8;
+// CHECK: b8 'fixed_bool8_t':'__attribute__((__riscv_rvv_vector_bits__(1 * 
sizeof(unsigned char) * 8))) unsigned char'
+
+fixed_bool4_t b4;
+// CHECK: b4 'fixed_bool4_t':'__attribute__((__riscv_rvv_vector_bits__(2 * 
sizeof(unsigned char) * 8))) unsigned char'
+
+fixed_bool2_t b2;
+// CHECK: b2 'fixed_bool2_t':'__attribute__((__riscv_rvv_vector_bits__(4 * 
sizeof(unsigned char) * 8))) unsigned char'
+
+fixed_bool1_t b1;
+// CHECK: b1 'fixed_bool1_t':'__attribute__((__riscv_rvv_vector_bits__(8 * 
sizeof(unsigned char) * 8))) unsigned char'

``````````

</details>


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

Reply via email to