[PATCH] D145088: [RISCV] Add attribute(riscv_rvv_vector_bits(N)) based on AArch64 arm_sve_vector_bits.
Craig Topper via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Apr 13 19:24:58 PDT 2023
craig.topper added inline comments.
================
Comment at: clang/test/SemaCXX/attr-riscv-rvv-vector-bits.cpp:12
+
+template<typename T> struct S { T var; };
+
----------------
erichkeane wrote:
> craig.topper wrote:
> > aaron.ballman wrote:
> > > craig.topper wrote:
> > > > aaron.ballman wrote:
> > > > > erichkeane wrote:
> > > > > > craig.topper wrote:
> > > > > > > erichkeane wrote:
> > > > > > > > craig.topper wrote:
> > > > > > > > > @erichkeane does this cover the dependent case or were you looking for something else?
> > > > > > > > >
> > > > > > > > > Here are on the only mentions of template I see in SVE tests that use this attribute.
> > > > > > > > >
> > > > > > > > > ```
> > > > > > > > > clang/test$ ack template `ack arm_sve_vector -l`
> > > > > > > > > CodeGenCXX/aarch64-mangle-sve-fixed-vectors.cpp
> > > > > > > > > 37:template <typename T> struct S {};
> > > > > > > > >
> > > > > > > > > SemaCXX/attr-arm-sve-vector-bits.cpp
> > > > > > > > > 16:template<typename T> struct S { T var; };
> > > > > > > > > ```
> > > > > > > > >
> > > > > > > > > Here is the result for this patch
> > > > > > > > >
> > > > > > > > > ```
> > > > > > > > > clang/test$ ack template `ack riscv_rvv_vector -l`
> > > > > > > > > CodeGenCXX/riscv-mangle-rvv-fixed-vectors.cpp
> > > > > > > > > 48:template <typename T> struct S {};
> > > > > > > > >
> > > > > > > > > SemaCXX/attr-riscv-rvv-vector-bits.cpp
> > > > > > > > > 12:template<typename T> struct S { T var; };
> > > > > > > > > ```
> > > > > > > > Thats unfortunate, and I wish I'd thought of it at the time/been more active reviewing the SVE stuff then. Really what I'm looking for is:
> > > > > > > >
> > > > > > > > ```
> > > > > > > > template<int N>
> > > > > > > > struct Whatever {
> > > > > > > > using Something = char __attribute((riscv_rvv_vector_bits(N)));
> > > > > > > > };
> > > > > > > >
> > > > > > > > void Func(Whatever<5>::Something MyVar){}
> > > > > > > >
> > > > > > > > ```
> > > > > > > That does not appear to work.
> > > > > > >
> > > > > > > ```
> > > > > > > $ ./bin/clang test.cpp --target=riscv64 -march=rv64gcv -mrvv-vector-bits=zvl
> > > > > > > test.cpp:3:41: error: 'riscv_rvv_vector_bits' attribute requires an integer constant
> > > > > > > using Something = char __attribute((riscv_rvv_vector_bits(N)));
> > > > > > > ```
> > > > > > >
> > > > > > > It's not very useful as a template parameter. There's only one value that works and that's whatever __RISCV_RVV_VLEN_BITS is set to.
> > > > > > Thats really unfortunate, but it makes me wonder what `DependentVectorType ` is for in this case, or the handling of said things. Because I would expect:
> > > > > >
> > > > > > ```
> > > > > > template<typename T, int Size>
> > > > > > using RiscvVector = T __attribute__((risv_rvv_vector_bits(Size)));
> > > > > >
> > > > > > RiscvVector<char, <TheRightAnswer>> Foo;
> > > > > > ```
> > > > > > to be useful. Even if not, I'd expect:
> > > > > > ```
> > > > > > template<typename T>
> > > > > > using RiscvVector = T __attribute__((risv_rvv_vector_bits(TheRightAnswer)));
> > > > > > RiscvVector<char> Foo;
> > > > > > ```
> > > > > > to both work.
> > > > > >
> > > > > > >>It's not very useful as a template parameter. There's only one value that works and that's whatever __RISCV_RVV_VLEN_BITS is set to.
> > > > > > This makes me wonder why this attribute takes an integer constant anyway, if it is just a 'guess what the right answer is!' sorta thing. Seems to me this never should have taken a parameter.
> > > > > > It's not very useful as a template parameter. There's only one value that works and that's whatever __RISCV_RVV_VLEN_BITS is set to.
> > > > >
> > > > > Can you help me understand why the argument exists then?
> > > > >
> > > > > We're pretty inconsistent about attribute arguments properly handling things like constant expressions vs integer literals, but the trend lately is to accept a constant expression rather than only a literal because of how often users like to give names to literals and how much more constexpr code we're seeing in the wild.
> > > > This is what's in ARM's ACLE documentation:
> > > >
> > > >
> > > >
> > > > > The ACLE only defines the effect of the attribute if all of the following are true:
> > > > > 1. the attribute is attached to a single SVE vector type (such as svint32_t) or to the SVE predicate
> > > > > type svbool_t;
> > > > > 2. the arguments “…” consist of a single nonzero integer constant expression (referred to as N below); and
> > > > > 3. N==__ARM_FEATURE_SVE_BITS.
> > > > > In other cases the implementation must do one of the following:
> > > > > • ignore the attribute; a warning would then be appropriate, but is not required
> > > > > • reject the program with a diagnostic
> > > > > • extend requirement (3) above to support other values of N besides __ARM_FEATURE_SVE_BITS
> > > > > • process the attribute in accordance with a later revision of the ACLE
> > > >
> > > >
> > > >
> > > >
> > > >
> > > > So there's a bullet in there that allows an implementation to support other values, but it is not required.
> > > Thank you, the current design makes more sense to me now. I'm less concerned about whether we support dependent values for this attribute argument. If we start to support values of `N` other than `__ARM_FEATURE_SVE_BITS` then it might make sense to care about it at that point. But I don't think users are going to do stuff like:
> > > ```
> > > template <int N>
> > > using fixed_int8m1_t __attribute__((riscv_rvv_vector_bits(N))) = vint8m1_t;
> > >
> > > fixed_int8m1_t<__ARM_FEATURE_SVE_BITS> foo;
> > > ```
> > > However, it is still important to test that the type attribute works in a situation like:
> > > ```
> > > template <typename Ty>
> > > using Something = Ty __attribute__((riscv_rvv_vector_bits(__ARM_FEATURE_SVE_BITS)));
> > >
> > > // Ensure that Something is correctly attributed, that the underlying type for Ty is valid for the attribute, etc
> > > ```
> > >
> > It looks like it doesn't work for that case.
> THAT is super unfortunate, and really should work in this case. The SVE implementers could probably help out here.
Is that blocking for this patch?
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D145088/new/
https://reviews.llvm.org/D145088
More information about the cfe-commits
mailing list