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);
}