https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99314
Bug ID: 99314
Summary: [Patch] [RISC-V] g++.dg/opt/memcpy1.C
Product: gcc
Version: unknown
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
Assignee: unassigned at gcc dot gnu.org
Reporter: sinan.lin at aalto dot fi
Target Milestone: ---
Created attachment 50272
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=50272=edit
Patch for fixing negative length problem in riscv_expand_block_move
The problem was that the argument 'length' in function
'riscv_expand_block_move' can be a negative value, and this leads to a crash.
original code in riscv.c:
bool
riscv_expand_block_move (rtx dest, rtx src, rtx length)
{
if (CONST_INT_P (length))
{
HOST_WIDE_INT factor, align;
align = MIN (MIN (MEM_ALIGN (src), MEM_ALIGN (dest)), BITS_PER_WORD);
factor = BITS_PER_WORD / align;
... ...
Bug shooting step in gdb for g++.dg/opt/memcpy1.C:
gdb$ break riscv_expand_block_move
gdb$ r
gdb$ print length->u.hwint[0] # INTVAL(length)
gdb$ $1 = -4
My patch for this testcase:
diff --git a/gcc/config/riscv/riscv.c b/gcc/config/riscv/riscv.c
index d489717b2a5..737902faea8 100644
--- a/gcc/config/riscv/riscv.c
+++ b/gcc/config/riscv/riscv.c
@@ -3234,7 +3234,7 @@ riscv_block_move_loop (rtx dest, rtx src, HOST_WIDE_INT
length,
bool
riscv_expand_block_move (rtx dest, rtx src, rtx length)
{
- if (CONST_INT_P (length))
+ if (CONST_INT_P (length) && INTVAL (length) >= 0)
{
HOST_WIDE_INT factor, align;
Result of regression test before my patch on riscv-gcc-10.2.0:
/home/open/riscv-gnu-toolchain/scripts/testsuite-filter gcc newlib
/home/open/riscv-gnu-toolchain/test/allowlist `find
build-gcc-newlib-stage2/gcc/testsuite/ -name *.sum |paste -sd "," -`
=== g++: Unexpected fails for rv32imac ilp32 medlow ===
FAIL: g++.dg/opt/memcpy1.C -std=gnu++14 (internal compiler error)
FAIL: g++.dg/opt/memcpy1.C -std=gnu++14 (test for excess errors)
FAIL: g++.dg/opt/memcpy1.C -std=gnu++17 (internal compiler error)
FAIL: g++.dg/opt/memcpy1.C -std=gnu++17 (test for excess errors)
FAIL: g++.dg/opt/memcpy1.C -std=gnu++2a (internal compiler error)
FAIL: g++.dg/opt/memcpy1.C -std=gnu++2a (test for excess errors)
FAIL: g++.dg/opt/memcpy1.C -std=gnu++98 (internal compiler error)
FAIL: g++.dg/opt/memcpy1.C -std=gnu++98 (test for excess errors)
=== g++: Unexpected fails for rv32im ilp32 medlow ===
FAIL: g++.dg/opt/memcpy1.C -std=gnu++14 (internal compiler error)
FAIL: g++.dg/opt/memcpy1.C -std=gnu++14 (test for excess errors)
FAIL: g++.dg/opt/memcpy1.C -std=gnu++17 (internal compiler error)
FAIL: g++.dg/opt/memcpy1.C -std=gnu++17 (test for excess errors)
FAIL: g++.dg/opt/memcpy1.C -std=gnu++2a (internal compiler error)
FAIL: g++.dg/opt/memcpy1.C -std=gnu++2a (test for excess errors)
FAIL: g++.dg/opt/memcpy1.C -std=gnu++98 (internal compiler error)
FAIL: g++.dg/opt/memcpy1.C -std=gnu++98 (test for excess errors)
=== g++: Unexpected fails for rv32imafc ilp32f medlow ===
FAIL: g++.dg/opt/memcpy1.C -std=gnu++14 (internal compiler error)
FAIL: g++.dg/opt/memcpy1.C -std=gnu++14 (test for excess errors)
FAIL: g++.dg/opt/memcpy1.C -std=gnu++17 (internal compiler error)
FAIL: g++.dg/opt/memcpy1.C -std=gnu++17 (test for excess errors)
FAIL: g++.dg/opt/memcpy1.C -std=gnu++2a (internal compiler error)
FAIL: g++.dg/opt/memcpy1.C -std=gnu++2a (test for excess errors)
FAIL: g++.dg/opt/memcpy1.C -std=gnu++98 (internal compiler error)
FAIL: g++.dg/opt/memcpy1.C -std=gnu++98 (test for excess errors)
=== g++: Unexpected fails for rv32iac ilp32 medlow ===
FAIL: g++.dg/opt/memcpy1.C -std=gnu++14 (internal compiler error)
FAIL: g++.dg/opt/memcpy1.C -std=gnu++14 (test for excess errors)
FAIL: g++.dg/opt/memcpy1.C -std=gnu++17 (internal compiler error)
FAIL: g++.dg/opt/memcpy1.C -std=gnu++17 (test for excess errors)
FAIL: g++.dg/opt/memcpy1.C -std=gnu++2a (internal compiler error)
FAIL: g++.dg/opt/memcpy1.C -std=gnu++2a (test for excess errors)
FAIL: g++.dg/opt/memcpy1.C -std=gnu++98 (internal compiler error)
FAIL: g++.dg/opt/memcpy1.C -std=gnu++98 (test for excess errors)
=== g++: Unexpected fails for rv32i ilp32 medlow ===
FAIL: g++.dg/opt/memcpy1.C -std=gnu++14 (internal compiler error)
FAIL: g++.dg/opt/memcpy1.C -std=gnu++14 (test for excess errors)
FAIL: g++.dg/opt/memcpy1.C -std=gnu++17 (internal compiler error)
FAIL: g++.dg/opt/memcpy1.C -std=gnu++17 (test for excess errors)
FAIL: g++.dg/opt/memcpy1.C -std=gnu++2a (internal compiler error)
FAIL: g++.dg/opt/memcpy1.C -std=gnu++2a (test for excess errors)
FAIL: g++.dg/opt/memcpy1.C -std=gnu++98 (internal compiler error)
FAIL: g++.dg/opt/memcpy1.C -std=gnu++98 (test for excess errors)
= Summary of gcc testsuite =
| # of