rjmccall added a comment.

In D76791#2064434 <https://reviews.llvm.org/D76791#2064434>, @fhahn wrote:

> In D76791#2063926 <https://reviews.llvm.org/D76791#2063926>, @rjmccall wrote:
>
> > > Yes at the moment I think we want to limit element wise 
> > > accesses/modifications to go through the access operator only, to 
> > > guarantee we can rely on the vector forms in codegen.
> > > 
> > > Additionally I think at least initially we want to avoid handing out 
> > > pointers to elements, as it may be tempting to use for pointer-based 
> > > accesses to subsequent elements. I am a bit worried that allowing that 
> > > would muddy the waters a bit and may lead to interpreting matrix types as 
> > > similar to arrays, instead of single value types with restricted element 
> > > access. Does that make sense?
> >
> > It does make sense, although it does make it very important that code 
> > generation narrows the relevant particular load/extractvalue and 
> > load/insertvalue/store sequences, or else performance and code size will be 
> > completely unacceptable for large matrices.
>
>
> Yes, dealing with large vectors is currently a weakness of LLVM 
> unfortunately.  But breaking up operations on large vectors in general is 
> something we are planning on implementing as part of the matrix lowering. And 
> I think even if we do not allow taking addresses, we could still just 
> load/store a single element with the index operator, if required (maybe also 
> based on the actual size of the matrix). And if we discover that taking 
> addresses is really beneficial to users, it should be relatively straight 
> forward to allow it in a backwards-compatible way I think/


Yeah, if you ever decide you want that IR pattern, it should be painless to 
make IRGen emit it.  You might even consider doing it at -O0 if the backend 
wouldn't otherwise be narrowing then.  (That doesn't need to be in this patch, 
of course.)



================
Comment at: clang/lib/CodeGen/CGExpr.cpp:3787
+                               ColIdx->getType()->getScalarSizeInBits());
+  llvm::Type *IntTy = llvm::IntegerType::get(getLLVMContext(), MaxWidth);
+  RowIdx = Builder.CreateZExt(RowIdx, IntTy);
----------------
fhahn wrote:
> rjmccall wrote:
> > You should be able to assert that these have been coerced to the right type 
> > by Sema (probably size_t or ptrdiff_t or something).
> Hm I don't think that's currently happening. Is that required? It seems a bit 
> unfortunate if we would have to force to wider bit-widths than necessary for 
> the given index expressions.
Can you explain what cost you're worried about?  I don't understand what the 
benefit of using a smaller IR type for the indexes is, and usually it's better 
to have stronger invariants coming out of Sema.


================
Comment at: clang/lib/Sema/SemaExpr.cpp:4655
+  // type, in which case the overload resolution for the operator overload
+  // should get the first crack at the overload.
+
----------------
fhahn wrote:
> rjmccall wrote:
> > fhahn wrote:
> > > rjmccall wrote:
> > > > Overload placeholder types are used for things like `&foo` where `foo` 
> > > > is the name of an overloaded function.  The places that resolve only 
> > > > non-overload placeholder types are doing so in order to leave room for 
> > > > overload resolution to resolve the overload later, e.g. as part of 
> > > > non-builtin operator handling.  `operator[]` is like `operator()`: 
> > > > non-builtin operators are only considered when the base has class type. 
> > > >  Since you already know that the base type is a matrix type, you know 
> > > > that you're using your standard rules, and your standard rules have no 
> > > > way to resolve overloads in the index types — correctly, since indexes 
> > > > can't be functions or member pointers.
> > > > 
> > > > tl;dr: You can (and should) resolve all placeholders here, not just 
> > > > non-overload placeholders.
> > > Thanks for the clarification. I moved the code to deal with placeholders 
> > > to CreateBuiltinMatrixSubscriptExpr and removed the non-overload 
> > > restriction there.
> > > 
> > > I think we still need to keep dealing with placeholders in `Base` below, 
> > > to ensure we do not miss that the base is actually a matrix type, e.g. to 
> > > support. It seems it is enough to skip` isMSPropertySubscriptExpr` there 
> > > (without that restriction, some non-matrix-type codegen tests start to 
> > > fail. Does that make sense?
> > > 
> > > ```
> > > __attribute__((objc_root_class))
> > > @interface MatrixValue
> > > @property double4x4 value;
> > > @end
> > > ```
> > Yeah, you have to resolve some placeholders before you can check whether 
> > the base is a matrix type, and you can't resolve MS properties because the 
> > property access actually merges with the subscript in some cases.
> > 
> > I think you may need to resolve placeholders in base even in 
> > CreateBuiltinMatrixSubscriptExpr to handle template instantiation right.  
> > The test case would be something where the matrix expression is 
> > non-dependently-typed but loaded from an ObjC property — we might need to 
> > redundantly resolve placeholders when rebuilding expressions in the 
> > instantiation.
> > Yeah, you have to resolve some placeholders before you can check whether 
> > the base is a matrix type, and you can't resolve MS properties because the 
> > property access actually merges with the subscript in some cases.
> 
> 
> 
> I think that should be happening in the latest version, CheckPlaceholderExpr 
> is used on Base, RowIdx and ColumnIdx.
Yes, you're right.


================
Comment at: clang/lib/Sema/SemaExpr.cpp:4707
+      return false;
+    }
+
----------------
Somewhere in here would be where you'd do the index type conversion, FWIW.

I don't know if you want to allow a class with a conversion operator to an 
integer type, but that function you added for +/- should do it.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D76791



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

Reply via email to