* [PATCH v2, rtl]: Teach _.barriers and _.eh_range passes to not split a call and its corresponding CALL_ARG_LOCATION note.
@ 2014-06-29 19:51 Uros Bizjak
2014-06-30 15:48 ` Richard Henderson
0 siblings, 1 reply; 2+ messages in thread
From: Uros Bizjak @ 2014-06-29 19:51 UTC (permalink / raw)
To: Richard Henderson; +Cc: gcc-patches
[-- Attachment #1: Type: text/plain, Size: 1396 bytes --]
On Fri, Jun 27, 2014 at 9:11 PM, Richard Henderson <rth@redhat.com> wrote:
> On 06/26/2014 02:15 PM, Uros Bizjak wrote:
>> * except.c (emit_note_eh_region_end): New helper function.
>> (convert_to_eh_region_ranges): Use emit_note_eh_region_end to
>> emit EH_REGION_END note.
>
> This bit looks good.
>
>
>> rtx insn, next, prev;
>> - for (insn = get_insns (); insn; insn = next)
>> + for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
>> {
>> - next = NEXT_INSN (insn);
>> if (BARRIER_P (insn))
>> {
>> prev = prev_nonnote_insn (insn);
>> if (!prev)
>> continue;
>> +
>> + /* Make sure we do not split a call and its corresponding
>> + CALL_ARG_LOCATION note. */
>> + next = NEXT_INSN (prev);
>> + if (next == NULL)
>> + continue;
>> + if (NOTE_P (next)
>> + && NOTE_KIND (next) == NOTE_INSN_CALL_ARG_LOCATION)
>> + prev = next;
>> +
>
> This bit looks more complicated than it needs to be.
> It would also be helpful for legibility to move the
> declarations from the top to the first uses.
>
> The next == NULL test can never be true, since we've
> already searched backward from insn.
Thanks for the review!
I believe that attached v2 patch addresses all your review comments.
Patch was bootstrapped and regression tested on x86_64-linux-gnu {,-m32}.
Uros.
[-- Attachment #2: p.diff.txt --]
[-- Type: text/plain, Size: 2819 bytes --]
Index: except.c
===================================================================
--- except.c (revision 212063)
+++ except.c (working copy)
@@ -2466,6 +2466,20 @@ add_call_site (rtx landing_pad, int action, int se
return call_site_base + crtl->eh.call_site_record_v[section]->length () - 1;
}
+static rtx
+emit_note_eh_region_end (rtx insn)
+{
+ rtx next = NEXT_INSN (insn);
+
+ /* Make sure we do not split a call and its corresponding
+ CALL_ARG_LOCATION note. */
+ if (next && NOTE_P (next)
+ && NOTE_KIND (next) == NOTE_INSN_CALL_ARG_LOCATION)
+ insn = next;
+
+ return emit_note_after (NOTE_INSN_EH_REGION_END, insn);
+}
+
/* Turn REG_EH_REGION notes back into NOTE_INSN_EH_REGION notes.
The new note numbers will not refer to region numbers, but
instead to call site entries. */
@@ -2544,8 +2558,8 @@ convert_to_eh_region_ranges (void)
note = emit_note_before (NOTE_INSN_EH_REGION_BEG,
first_no_action_insn_before_switch);
NOTE_EH_HANDLER (note) = call_site;
- note = emit_note_after (NOTE_INSN_EH_REGION_END,
- last_no_action_insn_before_switch);
+ note
+ = emit_note_eh_region_end (last_no_action_insn_before_switch);
NOTE_EH_HANDLER (note) = call_site;
gcc_assert (last_action != -3
|| (last_action_insn
@@ -2569,8 +2583,7 @@ convert_to_eh_region_ranges (void)
first_no_action_insn = NULL_RTX;
}
- note = emit_note_after (NOTE_INSN_EH_REGION_END,
- last_action_insn);
+ note = emit_note_eh_region_end (last_action_insn);
NOTE_EH_HANDLER (note) = call_site;
}
@@ -2617,7 +2630,7 @@ convert_to_eh_region_ranges (void)
if (last_action >= -1 && ! first_no_action_insn)
{
- note = emit_note_after (NOTE_INSN_EH_REGION_END, last_action_insn);
+ note = emit_note_eh_region_end (last_action_insn);
NOTE_EH_HANDLER (note) = call_site;
}
Index: jump.c
===================================================================
--- jump.c (revision 212063)
+++ jump.c (working copy)
@@ -121,15 +121,26 @@ rebuild_jump_labels_chain (rtx chain)
static unsigned int
cleanup_barriers (void)
{
- rtx insn, next, prev;
- for (insn = get_insns (); insn; insn = next)
+ rtx insn;
+ for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
{
- next = NEXT_INSN (insn);
if (BARRIER_P (insn))
{
- prev = prev_nonnote_insn (insn);
+ rtx prev = prev_nonnote_insn (insn);
if (!prev)
continue;
+
+ if (CALL_P (prev))
+ {
+ /* Make sure we do not split a call and its corresponding
+ CALL_ARG_LOCATION note. */
+ rtx next = NEXT_INSN (prev);
+
+ if (NOTE_P (next)
+ && NOTE_KIND (next) == NOTE_INSN_CALL_ARG_LOCATION)
+ prev = next;
+ }
+
if (BARRIER_P (prev))
delete_insn (insn);
else if (prev != PREV_INSN (insn))
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH v2, rtl]: Teach _.barriers and _.eh_range passes to not split a call and its corresponding CALL_ARG_LOCATION note.
2014-06-29 19:51 [PATCH v2, rtl]: Teach _.barriers and _.eh_range passes to not split a call and its corresponding CALL_ARG_LOCATION note Uros Bizjak
@ 2014-06-30 15:48 ` Richard Henderson
0 siblings, 0 replies; 2+ messages in thread
From: Richard Henderson @ 2014-06-30 15:48 UTC (permalink / raw)
To: Uros Bizjak; +Cc: gcc-patches
On 06/29/2014 12:51 PM, Uros Bizjak wrote:
> I believe that attached v2 patch addresses all your review comments.
>
> Patch was bootstrapped and regression tested on x86_64-linux-gnu {,-m32}.
Looks good, thanks.
r~
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2014-06-30 15:48 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-06-29 19:51 [PATCH v2, rtl]: Teach _.barriers and _.eh_range passes to not split a call and its corresponding CALL_ARG_LOCATION note Uros Bizjak
2014-06-30 15:48 ` Richard Henderson
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).