Patchwork ifcvt/crossjump patch: Fix PR 42496, 21803

login
register
mail settings
Submitter H.J. Lu
Date Oct. 6, 2010, 2:46 a.m.
Message ID <AANLkTinoZ4mTyaB373Ay9CagVcf4VHiJRgbenYFSe+m9@mail.gmail.com>
Download mbox | patch
Permalink /patch/66889/
State New
Headers show

Comments

H.J. Lu - Oct. 6, 2010, 2:46 a.m.
On Tue, Oct 5, 2010 at 6:12 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
> On Sun, Oct 3, 2010 at 4:34 AM, Bernd Schmidt <bernds@codesourcery.com> wrote:
>> On 10/02/2010 03:07 PM, H.J. Lu wrote:
>>> On Wed, Aug 4, 2010 at 6:35 AM, Bernd Schmidt <bernds@codesourcery.com> wrote:
>>>> On 08/03/2010 07:12 PM, Jeff Law wrote:
>>>>> OK.  WRT the comment, we might want to just say that BB_MODIFIED is set
>>>>> at the same time as a block is marked dirty, but is not cleared during a
>>>>> df_analyze allowing a pass to update the DF information and still know
>>>>> what blocks were modified.
>>>>
>>>> New patch below.
>>>>
>>>
>>> This caused:
>>>
>>> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45865
>>
>> This should fix it, refusing to move NOTE_EPILOGUE_BEGIN and anything
>> beyond it.
>>
>> Bootstrapped and tested on i686-linux, ok?
>>
>
> It still failed this testcase.
>
> --
> H.J.
> ---
> [hjl@gnu-32 rrs]$ cat pr45865.c
> typedef struct rtx_def *rtx;
> enum machine_mode {
>  VOIDmode,
>  CCFPmode,
>  CCFPUmode,
>  MAX_MACHINE_MODE
> };
> enum mode_class {
>  MODE_CC,
>  MODE_FLOAT,
>  MODE_COMPLEX_FLOAT,
>  MODE_VECTOR_FLOAT
> };
> extern const enum mode_class mode_class[(int) MAX_MACHINE_MODE];
> enum rtx_code {
>  UNKNOWN,
>  GEU,
>  ORDERED,
>  CONST_INT
> };
> struct rtx_def {
>  unsigned int code: 16;
>  unsigned int mode : 8;
> };
> extern enum rtx_code reverse_condition (enum rtx_code);
> enum rtx_code
> reversed_comparison_code_parts (enum rtx_code code, rtx insn, rtx arg0,
>                                rtx arg1)
> {
>  enum machine_mode mode;
>  mode = (enum machine_mode) (arg0)->mode;
>  if (mode == VOIDmode)
>    mode = (enum machine_mode) (arg1)->mode;
>  if ((mode_class[(int) (mode)]) == MODE_CC)
>    return (mode != CCFPmode && mode != CCFPUmode
>            ? reverse_condition (code)
>            : reverse_condition_maybe_unordered (code));
>  switch (code)
>    {
>    case GEU:
>      return reverse_condition (code);
>    case ORDERED:
>      return UNKNOWN;
>    }
>  if (((enum rtx_code) (arg0)->code) == CONST_INT
>      || (((enum machine_mode) (arg0)->mode) != VOIDmode
>          && ! ((mode_class[(int) (mode)]) == MODE_FLOAT
>                || (mode_class[(int) (mode)]) == MODE_COMPLEX_FLOAT
>                || (mode_class[(int) (mode)]) == MODE_VECTOR_FLOAT)))
>    return reverse_condition (code);
>  return UNKNOWN;
> }
> [hjl@gnu-32 rrs]$ /export/gnu/import/rrs/164914/usr/bin/gcc -O2 -S
> -m32 pr45865.c
> pr45865.c: In function \u2018reversed_comparison_code_parts\u2019:
> pr45865.c:52:1: internal compiler error: in
> dwarf2out_cfi_begin_epilogue, at dwarf2out.c:2930
> Please submit a full bug report,
> with preprocessed source if appropriate.
> See <http://gcc.gnu.org/bugs.html> for instructions.
> [hjl@gnu-32 rrs]$
>

One problem is:

if (max_to == NULL_RTX || (fail && pmove_upto == NULL))

When pmove_upto isn't NULL,*pmove_upto is initialized to NULL
This patch works for me.  OK for trunk?

Thanks.

Patch

diff --git a/gcc/df-problems.c b/gcc/df-problems.c
index 82a0d0b..932fa5f 100644
--- a/gcc/df-problems.c
+++ b/gcc/df-problems.c
@@ -3915,6 +3915,8 @@  can_move_insns_across (rtx from, rtx to, rtx across_from, rtx across_to,
     {
       if (CALL_P (insn))
 	break;
+      if (NOTE_P (insn) && NOTE_KIND (insn) == NOTE_INSN_EPILOGUE_BEG)
+	break;
       if (NONDEBUG_INSN_P (insn))
 	{
 	  if (may_trap_p (PATTERN (insn))
@@ -3970,7 +3972,8 @@  can_move_insns_across (rtx from, rtx to, rtx across_from, rtx across_to,
   if (max_to != to)
     fail = 1;
 
-  if (max_to == NULL_RTX || (fail && pmove_upto == NULL))
+  if (max_to == NULL_RTX
+      || (fail && (pmove_upto == NULL || *pmove_upto == NULL)))
     goto out;
 
   /* Now, lower this upper bound by also taking into account that
--- /dev/null	2010-09-09 09:16:30.485584932 -0700
+++ gcc/gcc/testsuite/gcc.dg/torture/pr45865.c	2010-10-05 19:36:04.918278945 -0700
@@ -0,0 +1,54 @@ 
+/* { dg-do compile } */
+
+typedef struct rtx_def *rtx;
+enum machine_mode {
+  VOIDmode,
+  CCFPmode,
+  CCFPUmode,
+  MAX_MACHINE_MODE
+};
+enum mode_class {
+  MODE_CC,
+  MODE_FLOAT,
+  MODE_COMPLEX_FLOAT,
+  MODE_VECTOR_FLOAT
+};
+extern const enum mode_class mode_class[(int) MAX_MACHINE_MODE];
+enum rtx_code {
+  UNKNOWN,
+  GEU,
+  ORDERED,
+  CONST_INT
+};
+struct rtx_def {
+  unsigned int code: 16;
+  unsigned int mode : 8;
+};
+extern enum rtx_code reverse_condition (enum rtx_code);
+enum rtx_code
+reversed_comparison_code_parts (enum rtx_code code, rtx insn, rtx arg0,
+				rtx arg1)
+{
+  enum machine_mode mode;
+  mode = (enum machine_mode) (arg0)->mode;
+  if (mode == VOIDmode)
+    mode = (enum machine_mode) (arg1)->mode;
+  if ((mode_class[(int) (mode)]) == MODE_CC)
+    return (mode != CCFPmode && mode != CCFPUmode
+	    ? reverse_condition (code)
+	    : reverse_condition_maybe_unordered (code));
+  switch (code) 
+    {
+    case GEU:
+      return reverse_condition (code);
+    case ORDERED:
+      return UNKNOWN;
+    }
+  if (((enum rtx_code) (arg0)->code) == CONST_INT
+      || (((enum machine_mode) (arg0)->mode) != VOIDmode
+	  && ! ((mode_class[(int) (mode)]) == MODE_FLOAT
+		|| (mode_class[(int) (mode)]) == MODE_COMPLEX_FLOAT
+		|| (mode_class[(int) (mode)]) == MODE_VECTOR_FLOAT)))
+    return reverse_condition (code);
+  return UNKNOWN;
+}