Patchwork Fix -fcompare-debug failure in fwprop (PR rtl-optimization/54294)

login
register
mail settings
Submitter Jakub Jelinek
Date Aug. 17, 2012, 8 p.m.
Message ID <20120817200001.GA1999@tucnak.redhat.com>
Download mbox | patch
Permalink /patch/178346/
State New
Headers show

Comments

Jakub Jelinek - Aug. 17, 2012, 8 p.m.
Hi!

As discussed in the PR, this patch, originally posted for PR42728,
makes sure the shortcut in all_uses_available_at is used on the same insns
in between -g and -g0, it is the second time a -fcompare-debug failure
resulted from NEXT_INSN being something different with -g, so IMHO it is
desirable to commit this.

Bootstrapped/regtested on x86_64-linux and i686-linux, and in the PR
Uros wrote he bootstrapped/regtested it on alphaev8-linux.  Ok for trunk?

Then the PR discussed what to do with the remaining issues, any feedback on
that would be appreciated.

2012-08-17  Jakub Jelinek  <jakub@redhat.com>

	PR rtl-optimization/54294
	* fwprop.c (all_uses_available_at): Ignore debug insns in between
	def_insn and target_insn when checking whether the shortcut is
	possible.


	Jakub
Paolo Bonzini - Aug. 18, 2012, 6:31 p.m.
Il 17/08/2012 22:00, Jakub Jelinek ha scritto:
> Hi!
> 
> As discussed in the PR, this patch, originally posted for PR42728,
> makes sure the shortcut in all_uses_available_at is used on the same insns
> in between -g and -g0, it is the second time a -fcompare-debug failure
> resulted from NEXT_INSN being something different with -g, so IMHO it is
> desirable to commit this.
> 
> Bootstrapped/regtested on x86_64-linux and i686-linux, and in the PR
> Uros wrote he bootstrapped/regtested it on alphaev8-linux.  Ok for trunk?

Can't approve, but it looks like the right approach since debug insns
aren't "real" defs.

Paolo

> Then the PR discussed what to do with the remaining issues, any feedback on
> that would be appreciated.
> 
> 2012-08-17  Jakub Jelinek  <jakub@redhat.com>
> 
> 	PR rtl-optimization/54294
> 	* fwprop.c (all_uses_available_at): Ignore debug insns in between
> 	def_insn and target_insn when checking whether the shortcut is
> 	possible.
> 
> --- gcc/fwprop.c.jj	2012-08-15 10:55:21.000000000 +0200
> +++ gcc/fwprop.c	2012-08-17 11:15:55.624101951 +0200
> @@ -799,13 +799,17 @@ all_uses_available_at (rtx def_insn, rtx
>    df_ref *use_rec;
>    struct df_insn_info *insn_info = DF_INSN_INFO_GET (def_insn);
>    rtx def_set = single_set (def_insn);
> +  rtx next;
>  
>    gcc_assert (def_set);
>  
>    /* If target_insn comes right after def_insn, which is very common
> -     for addresses, we can use a quicker test.  */
> -  if (NEXT_INSN (def_insn) == target_insn
> -      && REG_P (SET_DEST (def_set)))
> +     for addresses, we can use a quicker test.  Ignore debug insns
> +     other than target insns for this.  */
> +  next = NEXT_INSN (def_insn);
> +  while (next && next != target_insn && DEBUG_INSN_P (next))
> +    next = NEXT_INSN (next);
> +  if (next == target_insn && REG_P (SET_DEST (def_set)))
>      {
>        rtx def_reg = SET_DEST (def_set);
>  
> 
> 	Jakub
>
Richard Sandiford - Aug. 20, 2012, 6:46 p.m.
Jakub Jelinek <jakub@redhat.com> writes:
> 2012-08-17  Jakub Jelinek  <jakub@redhat.com>
>
> 	PR rtl-optimization/54294
> 	* fwprop.c (all_uses_available_at): Ignore debug insns in between
> 	def_insn and target_insn when checking whether the shortcut is
> 	possible.

OK, thanks.

Richard

Patch

--- gcc/fwprop.c.jj	2012-08-15 10:55:21.000000000 +0200
+++ gcc/fwprop.c	2012-08-17 11:15:55.624101951 +0200
@@ -799,13 +799,17 @@  all_uses_available_at (rtx def_insn, rtx
   df_ref *use_rec;
   struct df_insn_info *insn_info = DF_INSN_INFO_GET (def_insn);
   rtx def_set = single_set (def_insn);
+  rtx next;
 
   gcc_assert (def_set);
 
   /* If target_insn comes right after def_insn, which is very common
-     for addresses, we can use a quicker test.  */
-  if (NEXT_INSN (def_insn) == target_insn
-      && REG_P (SET_DEST (def_set)))
+     for addresses, we can use a quicker test.  Ignore debug insns
+     other than target insns for this.  */
+  next = NEXT_INSN (def_insn);
+  while (next && next != target_insn && DEBUG_INSN_P (next))
+    next = NEXT_INSN (next);
+  if (next == target_insn && REG_P (SET_DEST (def_set)))
     {
       rtx def_reg = SET_DEST (def_set);