[PATCH] D72281: [Matrix] Add matrix type to Clang.

John McCall via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed May 6 13:00:42 PDT 2020


rjmccall added a comment.

In D72281#2023111 <https://reviews.llvm.org/D72281#2023111>, @fhahn wrote:

> Ah right, thanks for clarifying. I think I managed to fix the remaining problems. Previously the patch did not handle DependentSizedMatrixTypes with non-dependent constant dimensions properly (e.g. a DependentSizedMatrixType could have one dependent and one non-dependent dimension). That's a difference to DependentSizedArrayType. Now the example works as expected (I've etxended it a bit). Cases like the one below are rejected
>
>   template <class T, unsigned long R, unsigned long C>
>   using matrix = T __attribute__((matrix_type(R, C)));
>   
>   template <class T, unsigned long R>
>   void use_matrix(matrix<T, R, 10> &m) {}
>   // expected-note at -1 {{candidate function [with T = float, R = 10]}}
>   
>   template <class T, unsigned long C>
>   void use_matrix(matrix<T, 10, C> &m) {}
>   // expected-note at -1 {{candidate function [with T = float, C = 10]}}
>   
>   void test_ambigous_deduction1() {
>     matrix<float, 10, 10> m;
>     use_matrix(m);
>     // expected-error at -1 {{call to 'use_matrix' is ambiguous}}
>   }


Yeah, that looks right to reject.



================
Comment at: clang/lib/Sema/SemaTemplateDeduction.cpp:2109
+        if (!RowExprTemplateParam || !ColumnExprTemplateParam)
+          return Sema::TDK_Success;
+
----------------
fhahn wrote:
> rjmccall wrote:
> > fhahn wrote:
> > > rjmccall wrote:
> > > > 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.
> > > Thanks, I've re-structured the code along the lines of the code for DependentSizedArrayType
> > Could you extract a lambda helper function that does the common logic for the rows/columns values?  It's probably cleanest to pass in a rows/cols flag instead of trying to abstract more than that.
> > 
> > If you do that, you'll also fix the bug where you're using ColumnNTTP in the rows case. :)
> I wanted to make sure that's the right direction before opening too much time on refactoring :) The fact that we have to use different accessors makes things a bit tricky I think, but I've added a lambda (which takes the accessors as lambdas as well.
> 
Please use `llvm::function_ref` here.  Or you could even use a member function pointer, up to you.


================
Comment at: clang/lib/Sema/SemaTemplateDeduction.cpp:2085
+
+      unsigned SubTDF = TDF & TDF_IgnoreQualifiers;
+
----------------
Is this ignore-qualifiers thing copied from arrays?  If so, it's probably array-specific; qualified array types are a bit odd in the language.


================
Comment at: clang/lib/Sema/SemaTemplateDeduction.cpp:2122
+                  return Sema::TDK_NonDeducedMismatch;
+              }
+
----------------
I think I see what you're trying to do here, but you're missing a check.  When the parameter expression is instantiation-dependent but not directly a parameter reference (in the standard: "[a] non-type template argument or an array bound in which a subexpression references a template parameter"), this is a non-deduced context and shouldn't lead to deduction failure.  You should move the `getDeducedParameterFromExpr` call into this helper and then do the logic like this:

- If the parameter expression is not instantiation-dependent, then return success if the argument expression is non-dependent and evaluates to the same constant, otherwise return a mismatch.
- If the parameter expression is not a deducible parameter, then return success because this is a non-deduced context.
- Otherwise do the rest of the logic below.

Test case for this is something like `N + 1` as a row/column bound.  You can't deduce from that, but you can potentially deduce from other places in the type.


================
Comment at: clang/lib/Sema/SemaTemplateDeduction.cpp:2143
+                return DeduceNonTypeTemplateArgument(S, TemplateParams, NTTP,
+                                                     DimExpr, Info, Deduced);
+            } else if (const ConstantMatrixType *ConstantMatrixArg =
----------------
I'm curious why this extra check is necessary vs. just calling `DeduceNonTypeTemplateArgument` with `DimExpr` unconditionally.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D72281





More information about the cfe-commits mailing list