Hello! > this is a regression present for x86-64 on mainline and 4.6 branch with the > options -Os -mpreferred-stack-boundary=5 -fstack-check > -fno-omit-frame-pointer. > This improbable combination of options is necessary because you need to have > stack checking + stack realignment + !ACCUMULATE_OUTGOING_ARGS. In this case, > the DW_CFA_GNU_args_size CFIs must be correct in spite of the frame pointer. > > Tested on {i586,x86_64}-suse-linux, OK for mainline and 4.6 branch? > > > 2011-03-30 Eric Botcazou <ebotca...@adacore.com> > > PR target/48142 > * config/i386/i386.c (ix86_adjust_stack_and_probe): Differentiate > frame-related from frame-unrelated adjustments to the stack pointer.
- cfun->machine->fs.sp_offset += size; + + /* Even if the stack pointer isn't the CFA register, we need to correctly + describe the adjustments made to it, in particular differentiate the + frame-related ones from the frame-unrelated ones. */ + if (size > 0) + { + rtx expr = gen_rtx_SEQUENCE (VOIDmode, rtvec_alloc (2)); + XVECEXP (expr, 0, 0) + = gen_rtx_SET (VOIDmode, stack_pointer_rtx, + plus_constant (stack_pointer_rtx, -size)); + XVECEXP (expr, 0, 1) + = gen_rtx_SET (VOIDmode, stack_pointer_rtx, + plus_constant (stack_pointer_rtx, + PROBE_INTERVAL + dope + size)); + add_reg_note (last, REG_FRAME_RELATED_EXPR, expr); + RTX_FRAME_RELATED_P (last) = 1; + + cfun->machine->fs.sp_offset += size; + } Is there a reason why we can't just cancel (+ size and -size) in these two expressions to: XVECEXP (expr, 0, 0) = gen_rtx_SET (VOIDmode, stack_pointer_rtx, plus_constant (stack_pointer_rtx, PROBE_INTERVAL + dope)); Uros.