https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111720
--- Comment #17 from JuzheZhong <juzhe.zhong at rivai dot ai> ---
(In reply to Richard Biener from comment #16)
> The issue is that we cannot CSE a VLA typed "load" (whatever that is) to a
> constnant.
>
> char arr[] = {1, 2, 7, 1, 3, 4, 5, 3, 1
> , 0, 1, 2, 4, 4, 9, 9, 1, 2, 7, 1, 3, 4, 5, 3,
> 1, 0, 1, 2, 4, 4, 9, 9};
> char m = 1;
>
> svint8_t varr = *(svint8_t*)arr;
>
> we don't know what portion of 'arr' this accesses. The relevant bit in
> vn_reference_lookup_3 would be
>
> /* 3) Assignment from a constant. We can use folds native encode/interpret
> routines to extract the assigned bits. */
> else if (known_eq (ref->size, maxsize)
> && is_gimple_reg_type (vr->type)
> && !reverse_storage_order_for_component_p (vr->operands)
> && !contains_storage_order_barrier_p (vr->operands)
> && gimple_assign_single_p (def_stmt)
> && CHAR_BIT == 8
> && BITS_PER_UNIT == 8
> && BYTES_BIG_ENDIAN == WORDS_BIG_ENDIAN
> /* native_encode and native_decode operate on arrays of bytes
> and so fundamentally need a compile-time size and offset. */
> && maxsize.is_constant (&maxsizei)
> && offset.is_constant (&offseti)
> && (is_gimple_min_invariant (gimple_assign_rhs1 (def_stmt))
> || (TREE_CODE (gimple_assign_rhs1 (def_stmt)) == SSA_NAME
> && is_gimple_min_invariant (SSA_VAL (gimple_assign_rhs1
> (def_
>
> and we fail at maxsize.is_constant (&maxsizei), that's the actual size of
> the load. Maybe there's constraints that are target specific and not
> encoded in poly-int that could be used here, but I don't really know.
>
> So yes, pieces of the compiler are defensive about VLA accesses and
> they probably have to be.
>
> In particular this part of VN doesn't try to use undefinedness (the access
> exceeds the size of 'arr') to limit things - but in the end we'd still
> need to construct a VLA typed constant and I have no idea how to do that.
>
> Maybe Richard has an idea.
>
> Note this has nothing to do about whether we have a CLOBBER or not. You
> can "disable" those with -fstack-reuse=none and that doesn't make a
> difference.
Thanks Richi.
But how about this case in RVV:
https://godbolt.org/z/sMYor3arP
Use --param=riscv-autovec-preference=fixed-vlmax will set the mode as a known
size. This code still have redundant stack transferring load/store.