Hi,
The error is rectified. The bug is in the function that calls fuse_loops().
Now I am trying to transfer all the statements, using code -

/* The following function fuses two loops.  */

void
fuse_loops (struct loop *loop_a, struct loop *loop_b)
{
  debug_loop (loop_a, 10);
  debug_loop (loop_b, 10);
  block_stmt_iterator bsi_a = bsi_start (loop_a->header);
  block_stmt_iterator bsi_a_last = bsi_last (loop_a->header);
  block_stmt_iterator bsi_b = bsi_last (loop_b->header);
  while (&bsi_a != &bsi_a_last)
    {
      bsi_move_before (&bsi_a, &bsi_b);
      fprintf (stderr, " transferred one statement from loop %d to
loop %d ", loop_a->num, loop_b->num);
      bsi_next (&bsi_a);
    }
  debug_loop (loop_a, 10);
  debug_loop (loop_b, 10);
  cancel_loop_tree (loop_a);
}

After doing this I get a segmentation fault , after 3 statements of
loop_a are transferred to loop_b.

Program received signal SIGSEGV, Segmentation fault.
0x08436245 in tsi_next (i=0xbffff5b0) at ../../trunk/gcc/tree-iterator.h:74
74        i->ptr = i->ptr->next;

Thanks,
Sandeep.

On Thu, Apr 10, 2008 at 5:57 PM, Zdenek Dvorak <[EMAIL PROTECTED]> wrote:
> Hi,
>
>
>  > I have written this function
>  >
>  > /* The following function fuses two loops.  */
>  >
>  > void
>  > fuse_loops (struct loop *loop_a, struct loop *loop_b)
>  > {
>  >  debug_loop (loop_a, 10);
>  >  debug_loop (loop_b, 10);
>  >  block_stmt_iterator bsi_a = bsi_start (loop_a->header);
>  >  block_stmt_iterator bsi_b = bsi_last (loop_b->header);
>  >  bsi_move_before (&bsi_a, &bsi_b);
>  >  fprintf (stderr, " transferred one statement from loop %d to loop %d
>  > ", loop_a->num, loop_b->num);
>  >  debug_loop (loop_a, 10);
>  >  debug_loop (loop_b, 10);
>  >  cancel_loop_tree (loop_a);
>  > }
>  >
>  > It moved one statement from loop_a to loop_b. In the same way I must
>  > tranfer all other statements too. I get a internal compiler error at "
>  > cancel_loop_tree(loop_a); "
>
>  where exactly (can you send me a backtrace)?  It does not seem possible
>  for cancel_loop_tree to ICE, if fuse_loops is the only function that you
>  call.
>
>  Zdenek
>

Reply via email to