Public Hi,
Could you please let us know if you have any comments on this patch? Kind regards, Aleksandar Rakic ________________________________________ From: Aleksandar Rakic <aleksandar.ra...@htecgroup.com> Sent: Monday, March 17, 2025 2:18 PM To: gcc-patches@gcc.gnu.org Cc: Djordje Todorovic; c...@mips.com; richard.guent...@gmail.com; ja...@redhat.com; Chao-ying Fu; Aleksandar Rakic Subject: [PATCH v2 18/18] Check anti-dependence between 0 and 3 for loads From: Chao-ying Fu <c...@wavecomp.com> gcc/ * config/mips/mips.md (join2_load_store<JOIN_MODE:mode>): Check operand 0 and 3. Assert other two operands do not overlap after they are reordered. (*join2_loadhi): Same. Cherry-picked 63175687761e51dfe2f75dfab7b4de7f44bb4abe from https://github.com/MIPS/gcc Signed-off-by: Chao-ying Fu <c...@mips.com> Signed-off-by: Aleksandar Rakic <aleksandar.ra...@htecgroup.com> --- gcc/config/mips/mips.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/gcc/config/mips/mips.md b/gcc/config/mips/mips.md index a69a879214e..db61b9d98fe 100644 --- a/gcc/config/mips/mips.md +++ b/gcc/config/mips/mips.md @@ -8060,7 +8060,7 @@ /* Reg-renaming pass reuses base register if it is dead after bonded loads. Hardware does not bond those loads, even when they are consecutive. However, order of the loads need to be checked for correctness. */ - if (!load_p || !reg_overlap_mentioned_p (operands[0], operands[1])) + if (!load_p || !reg_overlap_mentioned_p (operands[0], operands[3])) { output_asm_insn (mips_output_move (insn, operands[0], operands[1]), operands); @@ -8069,6 +8069,8 @@ } else { + /* Check the other two registers. */ + gcc_assert (!reg_overlap_mentioned_p (operands[2], operands[1])); output_asm_insn (mips_output_move (insn, operands[2], operands[3]), &operands[2]); output_asm_insn (mips_output_move (insn, operands[0], operands[1]), @@ -8123,13 +8125,15 @@ /* Reg-renaming pass reuses base register if it is dead after bonded loads. Hardware does not bond those loads, even when they are consecutive. However, order of the loads need to be checked for correctness. */ - if (!reg_overlap_mentioned_p (operands[0], operands[1])) + if (!reg_overlap_mentioned_p (operands[0], operands[3])) { output_asm_insn ("lh<u>\t%0,%1", operands); output_asm_insn ("lh<u>\t%2,%3", operands); } else { + /* Check the other two registers. */ + gcc_assert (!reg_overlap_mentioned_p (operands[2], operands[1])); output_asm_insn ("lh<u>\t%2,%3", operands); output_asm_insn ("lh<u>\t%0,%1", operands); } -- 2.34.1