rjmccall added inline comments.

================
Comment at: clang/include/clang/Basic/TypeNodes.td:73
 def ExtVectorType : TypeNode<VectorType>;
+def MatrixType : TypeNode<Type>;
 def FunctionType : TypeNode<Type, 1>;
----------------
I think some parts of your life might be easier if there were a common base 
class here.  You can either call the abstract superclass something like 
`AbstractMatrixType`, or you can call it `MatrixType` and then make this the 
concrete subclass `ConstantMatrixType`.

This is something we've occasionally regretted with vector types.


================
Comment at: clang/lib/AST/ASTContext.cpp:3840
+                                 RowExpr, ColumnExpr, AttrLoc);
+  } else {
+    QualType CanonicalMatrixElementType = getCanonicalType(MatrixElementType);
----------------
Is this logic copied from the dependent vector code?  It's actually wrong in a 
sense — it'll end up creating a non-canonical matrix type wrapping Canon even 
if all the components are exactly the same.  Probably the only impact is that 
we waste a little memory, although it's also possible that type-printing in 
diagnostics will be a little weird.  It'd be better to recognize that the 
components match Canon exactly and avoid creating a redundant node.

Please cache the result of calling `getCanonicalType(MatrixElementType)` above.


================
Comment at: clang/lib/AST/ASTContext.cpp:3848
+      assert(!CanonCheck && "Dependent-sized matrix canonical type broken");
+      (void)CanonCheck;
+      DependentSizedMatrixTypes.InsertNode(New, InsertPos);
----------------
Please do this in an `#ifndef NDEBUG`.


================
Comment at: clang/lib/AST/ItaniumMangle.cpp:3349
+void CXXNameMangler::mangleType(const MatrixType *T) {
+  Out << "Dm" << T->getNumRows() << "_" << T->getNumColumns() << '_';
+  mangleType(T->getElementType());
----------------
fhahn wrote:
> rjmccall wrote:
> > fhahn wrote:
> > > rjmccall wrote:
> > > > You need to ask the Itanium C++ ABI for this mangling, since it's not 
> > > > using a vendor-extension prefix.  I know that wasn't done for vector 
> > > > types, but we're trying to do the right thing.
> > > That basically means reaching out to 
> > > https://github.com/itanium-cxx-abi/cxx-abi/, right?
> > > 
> > > Do you think it would be feasible to initially go with a 
> > > vendor-extensions mangling (like 
> > > `u<Lenght>Matrix<NumRows>x<NumColumns>x<ElementType>`)? I've updated the 
> > > mangling to this.
> > Yeah, you can open an issue there.
> > 
> > That approach doesn't quite work because mangling the element type can use 
> > or introduce substitutions, but the demangler will naturally skip the whole 
> > thing.  I think there are two possible approaches here: we could either 
> > treat the entire matrix type as a vendor-extended qualifier on the element 
> > type (i.e. `U11matrix_typeILi3ELi4EEi`), or we could extend the 
> > vendor-extended type mangling to allow template-args (i.e. 
> > `u11matrix_typeIiLi3ELi4EE`).  The latter is probably better and should fit 
> > cleanly into the mangling grammar.
> Thanks for those suggestions. For now I went with the vendor-extended 
> qualifier, because IIUC that would fit in the existing mangling scheme 
> without any changes, while the second option would require changes to the 
> grammar, right?
> 
Yes, but it's a very modest change; please raise this with the Itanium 
committee (which is largely just me again, but wearing a different hat).

In the meantime, the qualifier approach is fine as a hack, but it's not 
technically correct unless you do annoying things with the mangling of 
actually-qualified matrix types.  But the proper qualifier approach is to 
provide the arguments as template-arguments, not one big unstructured string.

Also you should do the same thing with DependentSizedMatrixType.


================
Comment at: clang/lib/Sema/SemaTemplateDeduction.cpp:2071
+            MatrixArg->getElementType(), Info, Deduced, TDF);
+      }
+      // Matrix-Matrix deduction.
----------------
This should just fail with `TDK_NonDeducedMismatch`, like a ConstantArrayType 
would if the argument was a DependentSizedArrayType.


================
Comment at: clang/lib/Sema/SemaTemplateDeduction.cpp:2109
+        if (!RowExprTemplateParam || !ColumnExprTemplateParam)
+          return Sema::TDK_Success;
+
----------------
You should just do this right.  If you can find a template parameter in the 
parameter's row/column expression, you have to try to deduce it, and 
short-circuit if that fails.  Deduction is order-agnostic, so don't worry about 
that.

Also, you need to handle DependentSizedMatrixTypes here in order to get 
function template partial ordering right.  Pattern the code on how 
DependentSizedArrayTypes would handle it.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D72281



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to