Hi Jeff: Oop, patch in attachment, and I hit this bug in gcc.dg/torture/vshuf-v2di.c with our nds32 internal branch.
Hi Richard: I think we really need reg dead note for some optimization, and btw, here is our split pattern: (define_split [(set (match_operand:DI 0 "nds32_general_register_operand" "") (match_operand:DI 1 "nds32_general_register_operand" ""))] "find_regno_note (insn, REG_UNUSED, REGNO (operands[0])) != NULL || find_regno_note (insn, REG_UNUSED, REGNO (operands[0]) + 1) != NULL" [(set (match_dup 0) (match_dup 1))] { rtx dead_note = find_regno_note (curr_insn, REG_UNUSED, REGNO (operands[0])); HOST_WIDE_INT offset; if (dead_note == NULL_RTX) offset = 0; else offset = 4; operands[0] = simplify_gen_subreg ( SImode, operands[0], DImode, offset); operands[1] = simplify_gen_subreg ( SImode, operands[1], DImode, offset); }) On Tue, Jul 26, 2016 at 3:48 AM, Jeff Law <l...@redhat.com> wrote: > On 07/25/2016 12:35 PM, Richard Biener wrote: >> >> On July 25, 2016 5:56:29 PM GMT+02:00, Jeff Law <l...@redhat.com> wrote: >>> >>> On 07/25/2016 12:36 AM, Kito Cheng wrote: >>>> >>>> Hi all: >>>> >>>> Some target(for example i386, sh and h8300) use find_regno_note in >>>> split pattern but df infrastructure seem not initialize at split >>> >>> pass, >>>> >>>> so it may got wrong note since it's out-of-date. >>>> >>>> ChangeLog >>>> 2016-07-25 Kito Cheng <kito.ch...@gmail.com> >>>> >>>> * gcc/recog.c (split_all_insns): Initialize df for split >>> >>> pass. >>>> >>>> (split_all_insns_noflow): Likewise. >>>> >>> Patch was not included/attached to your message. Please resend with >>> the >>> patch and hopefully a testcase which exhibits the problem. >> >> >> And maybe back ends shouldn't look at notes in their splitters? > > It's certainly not ideal. But I'm not sure what alternatives we have and > it's bee supported for a very long time. > > For example on the H8, there is no shift-by-a-variable-amount. Instead you > have to emit it as a loop. However, we don't expose the loop until late in > the RTL pipeline (via a splitter). When we split a variable shift into a > loop, one of the things we want to know is whether or not the register > holding the shift count dies or not. If it does not die, we'll just use it > rather than copying it elsewhere. > > Similarly we can generate a more efficient split for something like (ior > (ashift (X) (const_int)) for certain integers when we know the input dies. > Or for some (add (mult)) expressions. > > Jeff > >
From c70bf21e152f24aa21592275626840569bbcdd08 Mon Sep 17 00:00:00 2001 From: Kito Cheng <k...@andestech.com> Date: Mon, 25 Jul 2016 14:05:57 +0800 Subject: [PATCH] Initialize df for split pass since some target use REG_NOTE in split pattern --- gcc/recog.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/gcc/recog.c b/gcc/recog.c index 80d1779..991fbc1 100644 --- a/gcc/recog.c +++ b/gcc/recog.c @@ -2939,6 +2939,12 @@ split_all_insns (void) bool changed; basic_block bb; + if (optimize > 0) + { + df_note_add_problem (); + df_analyze (); + } + blocks = sbitmap_alloc (last_basic_block_for_fn (cfun)); bitmap_clear (blocks); changed = false; @@ -3000,6 +3006,8 @@ unsigned int split_all_insns_noflow (void) { rtx_insn *next, *insn; + df_note_add_problem (); + df_analyze (); for (insn = get_insns (); insn; insn = next) { @@ -3873,7 +3881,7 @@ const pass_data pass_data_split_all_insns = 0, /* properties_provided */ 0, /* properties_destroyed */ 0, /* todo_flags_start */ - 0, /* todo_flags_finish */ + TODO_df_finish, /* todo_flags_finish */ }; class pass_split_all_insns : public rtl_opt_pass @@ -3926,7 +3934,7 @@ const pass_data pass_data_split_after_reload = 0, /* properties_provided */ 0, /* properties_destroyed */ 0, /* todo_flags_start */ - 0, /* todo_flags_finish */ + TODO_df_finish, /* todo_flags_finish */ }; class pass_split_after_reload : public rtl_opt_pass @@ -3964,7 +3972,7 @@ const pass_data pass_data_split_before_regstack = 0, /* properties_provided */ 0, /* properties_destroyed */ 0, /* todo_flags_start */ - 0, /* todo_flags_finish */ + TODO_df_finish, /* todo_flags_finish */ }; class pass_split_before_regstack : public rtl_opt_pass @@ -4031,7 +4039,7 @@ const pass_data pass_data_split_before_sched2 = 0, /* properties_provided */ 0, /* properties_destroyed */ 0, /* todo_flags_start */ - 0, /* todo_flags_finish */ + TODO_df_finish, /* todo_flags_finish */ }; class pass_split_before_sched2 : public rtl_opt_pass @@ -4078,7 +4086,7 @@ const pass_data pass_data_split_for_shorten_branches = 0, /* properties_provided */ 0, /* properties_destroyed */ 0, /* todo_flags_start */ - 0, /* todo_flags_finish */ + TODO_df_finish, /* todo_flags_finish */ }; class pass_split_for_shorten_branches : public rtl_opt_pass -- 1.9.1