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