GIMPLE_FOLD: Fix gimple fold for LEN_{MASK}_{LOAD,STORE}
Hi, previous I made a mistake on GIMPLE_FOLD of LEN_MASK_{LOAD,STORE}. We should fold LEN_MASK_{LOAD,STORE} (bias+len) == vf (nunits instead of bytesize) && mask = all trues mask into: MEM_REF [...]. This patch added testcase to test gimple fold of LEN_MASK_{LOAD,STORE}. Also, I fix LEN_LOAD/LEN_STORE, to make them have the same behavior. Ok for trunk ? gcc/ChangeLog: * gimple-fold.cc (gimple_fold_partial_load_store_mem_ref): Fix gimple fold of LOAD/STORE with length. gcc/testsuite/ChangeLog: * gcc.target/riscv/rvv/autovec/partial/gimple_fold-1.c: New test.
This commit is contained in:
parent
4dfeb1cd8d
commit
f0deeefebb
2 changed files with 47 additions and 2 deletions
|
@ -5397,8 +5397,10 @@ gimple_fold_partial_load_store_mem_ref (gcall *call, tree vectype, bool mask_p)
|
|||
unsigned int nargs = gimple_call_num_args (call);
|
||||
tree bias = gimple_call_arg (call, nargs - 1);
|
||||
gcc_assert (TREE_CODE (bias) == INTEGER_CST);
|
||||
if (maybe_ne (wi::to_poly_widest (basic_len) - wi::to_widest (bias),
|
||||
GET_MODE_SIZE (TYPE_MODE (vectype))))
|
||||
/* For LEN_LOAD/LEN_STORE/LEN_MASK_LOAD/LEN_MASK_STORE,
|
||||
we don't fold when (bias + len) != VF. */
|
||||
if (maybe_ne (wi::to_poly_widest (basic_len) + wi::to_widest (bias),
|
||||
GET_MODE_NUNITS (TYPE_MODE (vectype))))
|
||||
return NULL_TREE;
|
||||
|
||||
/* For LEN_MASK_{LOAD,STORE}, we should also check whether
|
||||
|
|
|
@ -0,0 +1,43 @@
|
|||
/* { dg-do compile } */
|
||||
/* { dg-options "-march=rv32gcv -mabi=ilp32d --param riscv-autovec-preference=fixed-vlmax --param riscv-autovec-lmul=m8 -O3 -fdump-tree-optimized-details" } */
|
||||
|
||||
#include <stdint-gcc.h>
|
||||
|
||||
#define SZ 255
|
||||
|
||||
#define DEF(TYPE) void fn_##TYPE (TYPE *__restrict a);
|
||||
|
||||
#define RUN(TYPE) \
|
||||
TYPE a##TYPE[SZ]; \
|
||||
for (int i = 0; i < SZ; i++) \
|
||||
{ \
|
||||
a##TYPE[i] = 127; \
|
||||
} \
|
||||
fn_##TYPE (a##TYPE);
|
||||
|
||||
#define RUN_ALL() \
|
||||
RUN (int8_t) \
|
||||
RUN (int16_t) \
|
||||
RUN (int32_t) \
|
||||
RUN (int64_t) \
|
||||
RUN (uint8_t) \
|
||||
RUN (uint16_t) \
|
||||
RUN (uint32_t) \
|
||||
RUN (uint64_t)
|
||||
|
||||
DEF (int8_t)
|
||||
DEF (int16_t)
|
||||
DEF (int32_t)
|
||||
DEF (int64_t)
|
||||
DEF (uint8_t)
|
||||
DEF (uint16_t)
|
||||
DEF (uint32_t)
|
||||
DEF (uint64_t)
|
||||
|
||||
int
|
||||
main ()
|
||||
{
|
||||
RUN_ALL ()
|
||||
}
|
||||
|
||||
/* { dg-final { scan-tree-dump-times "\.LEN_MASK_STORE" 6 "optimized" } } */
|
Loading…
Add table
Reference in a new issue