On Thu, Dec 17, 2015 at 2:00 PM, H.J. Lu <hjl.to...@gmail.com> wrote: > On Thu, Dec 17, 2015 at 2:04 AM, Uros Bizjak <ubiz...@gmail.com> wrote: >> On Thu, Dec 17, 2015 at 12:29 AM, H.J. Lu <hongjiu...@intel.com> wrote: >>> Since sibcall never returns, we can only use call-clobbered register >>> as GOT base. Otherwise, callee-saved register used as GOT base won't >>> be properly restored. >>> >>> Tested on x86-64 with -m32. OK for trunk? >> >> You don't have to add explicit clobber for members of "CLOBBERED_REGS" >> class, and register_no_elim_operand predicate should be used with "U" >> constraint. Also, please introduce new predicate, similar to how >> GOT_memory_operand is defined and handled. >> > > Here is the updated patch. There is a predicate already, > sibcall_memory_operand. It allows any registers to > be as GOT base, which is the root of our problem. > This patch removes GOT slot from it and handles > sibcall over GOT slot with *sibcall_GOT_32 and > *sibcall_value_GOT_32 patterns. Since I need to > expose constraints on GOT base register to RA, > I have to use 2 operands, GOT base and function > symbol, to describe sibcall over 32-bit GOT slot.
Please use (mem:SI (plus:SI (match_operand:SI 0 "register_no_elim_operand" "U") (match_operand:SI 1 "GOT32_symbol_operand"))) ... to avoid manual rebuild of the operand. Uros.