On Fri, May 30, 2014 at 3:05 PM, H.J. Lu <hjl.to...@gmail.com> wrote: > On Fri, May 30, 2014 at 9:51 AM, Kai Tietz <kti...@redhat.com> wrote: >> ----- Original Message ----- >>> On 05/30/2014 01:08 AM, Kai Tietz wrote: >>> > (define_predicate "sibcall_memory_operand" >>> > (match_operand 0 "memory_operand") >>> > { >>> > return CONSTANT_P (op); >>> > }) >>> >>> Surely that always returns false? Surely XEXP (op, 0) so that you look at >>> the >>> address, not the memory. >>> >>> >>> r~ >>> >> >> Doh ... of course >> >> >> (define_predicate "sibcall_memory_operand" >> (match_operand 0 "memory_operand") >> { >> return CONSTANT_P (XEXP (op, 0)); >> }) >> >> >> Actually I tested the proper version :} >> > > Have you tested bootstrap on i686? I think it may have broken bootstrap > on i686: > > https://gcc.gnu.org/ml/gcc-regression/2014-05/msg00408.html >
The function is 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)) { ... if (postorder_func != NULL) (*postorder_func) (loop_node); } postorder_func is passed on stack for i686 and we generate jmp *0x28(%esp) sibcall invalidates the original arguments on stack and puts the new argument on stack. There is no place on stack to be used for indirect sibcall via memory. In this case, sibcall_memory_operand should return false. -- H.J.