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:
Ju-Zhe Zhong 2023-06-26 16:11:55 +08:00 committed by Pan Li
parent 4dfeb1cd8d
commit f0deeefebb
2 changed files with 47 additions and 2 deletions

View file

@ -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

View file

@ -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" } } */