aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPatrick O'Neill <patrick@rivosinc.com>2024-08-19 12:19:33 -0700
committerPatrick O'Neill <patrick@rivosinc.com>2024-08-23 11:28:01 -0700
commit5dce17e17469161f413e1a5b723dca0e94be3fb6 (patch)
treec94952a4cfb8e656f79a12a1197b4deab68d501a /gcc
parenta9f5e23aba1a6f4ec32f1147b340a8145d827da9 (diff)
downloadgcc-5dce17e17469161f413e1a5b723dca0e94be3fb6.zip
gcc-5dce17e17469161f413e1a5b723dca0e94be3fb6.tar.gz
gcc-5dce17e17469161f413e1a5b723dca0e94be3fb6.tar.bz2
RISC-V: Use encoded nelts when calling repeating_sequence_p
repeating_sequence_p operates directly on the encoded pattern and does not derive elements using the .elt() accessor. Passing in the length of the unencoded vector can cause an out-of-bounds read of the encoded pattern. gcc/ChangeLog: * config/riscv/riscv-v.cc (rvv_builder::can_duplicate_repeating_sequence_p): Use encoded_nelts when calling repeating_sequence_p. (rvv_builder::is_repeating_sequence): Ditto. (rvv_builder::repeating_sequence_use_merge_profitable_p): Ditto. Signed-off-by: Patrick O'Neill <patrick@rivosinc.com>
Diffstat (limited to 'gcc')
-rw-r--r--gcc/config/riscv/riscv-v.cc10
1 files changed, 3 insertions, 7 deletions
diff --git a/gcc/config/riscv/riscv-v.cc b/gcc/config/riscv/riscv-v.cc
index 0db5c75..c896036 100644
--- a/gcc/config/riscv/riscv-v.cc
+++ b/gcc/config/riscv/riscv-v.cc
@@ -502,9 +502,7 @@ rvv_builder::can_duplicate_repeating_sequence_p ()
|| GET_MODE_SIZE (m_new_inner_mode) > UNITS_PER_WORD
|| !get_vector_mode (m_new_inner_mode, new_size).exists (&m_new_mode))
return false;
- if (full_nelts ().is_constant ())
- return repeating_sequence_p (0, full_nelts ().to_constant (), npatterns ());
- return nelts_per_pattern () == 1;
+ return repeating_sequence_p (0, encoded_nelts (), npatterns ());
}
/* Return true if the vector is a simple sequence with one pattern and all
@@ -514,9 +512,7 @@ rvv_builder::is_repeating_sequence ()
{
if (npatterns () > 1)
return false;
- if (full_nelts ().is_constant ())
- return repeating_sequence_p (0, full_nelts ().to_constant (), 1);
- return nelts_per_pattern () == 1;
+ return repeating_sequence_p (0, encoded_nelts (), 1);
}
/* Return true if it is a repeating sequence that using
@@ -564,7 +560,7 @@ rvv_builder::repeating_sequence_use_merge_profitable_p ()
unsigned int nelts = full_nelts ().to_constant ();
- if (!repeating_sequence_p (0, nelts, npatterns ()))
+ if (!repeating_sequence_p (0, encoded_nelts (), npatterns ()))
return false;
unsigned int merge_cost = 1;