2017-07-25 Uros Bizjak <ubiz...@gmail.com> * config/i386/i386.c (ix86_decompose_address): Do not check for register RTX when looking at index_reg or base_reg. * config/i386/i386.h (INCOMING_RETURN_ADDR_RTX): Use stack_pointer_rtx.
Bootstrapped and regression tested on x86_64-linux-gnu {,-m32}. Committed to mainline. Uros.
Index: config/i386/i386.c =================================================================== --- config/i386/i386.c (revision 250499) +++ config/i386/i386.c (working copy) @@ -16187,9 +16187,9 @@ ix86_decompose_address (rtx addr, struct ix86_addr /* Allow arg pointer and stack pointer as index if there is not scaling. */ if (base_reg && index_reg && scale == 1 - && (index_reg == arg_pointer_rtx - || index_reg == frame_pointer_rtx - || (REG_P (index_reg) && REGNO (index_reg) == STACK_POINTER_REGNUM))) + && (REGNO (index_reg) == ARG_POINTER_REGNUM + || REGNO (index_reg) == FRAME_POINTER_REGNUM + || REGNO (index_reg) == SP_REG)) { std::swap (base, index); std::swap (base_reg, index_reg); @@ -16197,14 +16197,11 @@ ix86_decompose_address (rtx addr, struct ix86_addr /* Special case: %ebp cannot be encoded as a base without a displacement. Similarly %r13. */ - if (!disp - && base_reg - && (base_reg == hard_frame_pointer_rtx - || base_reg == frame_pointer_rtx - || base_reg == arg_pointer_rtx - || (REG_P (base_reg) - && (REGNO (base_reg) == HARD_FRAME_POINTER_REGNUM - || REGNO (base_reg) == R13_REG)))) + if (!disp && base_reg + && (REGNO (base_reg) == ARG_POINTER_REGNUM + || REGNO (base_reg) == FRAME_POINTER_REGNUM + || REGNO (base_reg) == BP_REG + || REGNO (base_reg) == R13_REG)) disp = const0_rtx; /* Special case: on K6, [%esi] makes the instruction vector decoded. @@ -16213,7 +16210,7 @@ ix86_decompose_address (rtx addr, struct ix86_addr to test cfun for being non-NULL. */ if (TARGET_K6 && cfun && optimize_function_for_speed_p (cfun) && base_reg && !index_reg && !disp - && REG_P (base_reg) && REGNO (base_reg) == SI_REG) + && REGNO (base_reg) == SI_REG) disp = const0_rtx; /* Special case: encode reg+reg instead of reg*2. */ Index: config/i386/i386.h =================================================================== --- config/i386/i386.h (revision 250499) +++ config/i386/i386.h (working copy) @@ -2165,7 +2165,7 @@ extern int const svr4_dbx_register_map[FIRST_PSEUD /* Before the prologue, RA is at 0(%esp). */ #define INCOMING_RETURN_ADDR_RTX \ - gen_rtx_MEM (Pmode, gen_rtx_REG (Pmode, STACK_POINTER_REGNUM)) + gen_rtx_MEM (Pmode, stack_pointer_rtx) /* After the prologue, RA is at -4(AP) in the current frame. */ #define RETURN_ADDR_RTX(COUNT, FRAME) \