That patch won't help here.  My tests showing here a different
problem.  For -O2 or above this issue happens.

For -O2 the following code will be generated.
        movl    28(%esp), %eax
        testl   %eax, %eax
        je      L16
        movl    %ebp, 64(%esp)
        addl    $44, %esp
        popl    %ebx
        popl    %esi
        popl    %edi
        popl    %ebp
        jmp     *28(%esp)
Question here is why it tries to use memory-address here instead of
simply using eax-register, which is already loaded.

A small testcase for that is:

typedef void *ira_loop_tree_node_t;
#define NULL 0

extern int end (int);
extern int doo (int);

void
ira_traverse_loop_tree (bool bb_p, ira_loop_tree_node_t loop_node,
                        void (*preorder_func) (ira_loop_tree_node_t),
                        void (*postorder_func) (ira_loop_tree_node_t))
{
  int l, r = 0x1, h = 0, j = 0;

  if (preorder_func != NULL)
    (*preorder_func) (loop_node);

  if (bb_p)
    {
      for (l = 0; l < end (l); l++)
        {
          r += doo (l);
          h += (l + 1) * 3;
          h %= (l + 1);
          r -= doo (h);
          j += (l + 1) * 7;
          j %= (l + 1);
          r += doo (j);
        }
    }

  if (postorder_func != NULL)
    (*postorder_func) (loop_node);
}

Reply via email to