2018-12-18 Bernd Edlinger * cfgexpand.c (asm_clobber_reg_is_valid): Emit only a warning together with an information message when the stack pointer is clobbered. testsuite: 2018-12-18 Bernd Edlinger * gcc.target/i386/pr52813.c: Adjust test. Index: gcc/cfgexpand.c =================================================================== --- gcc/cfgexpand.c (revision 267164) +++ gcc/cfgexpand.c (working copy) @@ -2854,6 +2854,7 @@ tree_conflicts_with_clobbers_p (tree t, HARD_REG_S asm clobber operand. Some HW registers cannot be saved/restored, hence they should not be clobbered by asm statements. */ + static bool asm_clobber_reg_is_valid (int regno, int nregs, const char *regname) { @@ -2872,11 +2873,23 @@ asm_clobber_reg_is_valid (int regno, int nregs, co error ("PIC register clobbered by %qs in %", regname); is_valid = false; } - /* Clobbering the STACK POINTER register is an error. */ + /* Clobbering the STACK POINTER register is likely an error. + However it is useful to force the use of frame pointer and prevent + the use of red zone. Thus without this clobber, pushing temporary + values onto the stack might clobber the red zone or make stack based + memory references invalid. */ if (overlaps_hard_reg_set_p (regset, Pmode, STACK_POINTER_REGNUM)) { - error ("Stack Pointer register clobbered by %qs in %", regname); - is_valid = false; + if (warning (0, "Stack Pointer register clobbered by %qs in %", + regname)) + { + inform (input_location, + "This does likely not do what you would expect." + " The Stack Pointer register still needs to be restored to" + " the previous value, however it is safe to push values onto" + " the stack, when they are popped again from the stack" + " before the asm statement terminates"); + } } return is_valid; Index: gcc/testsuite/gcc.target/i386/pr52813.c =================================================================== --- gcc/testsuite/gcc.target/i386/pr52813.c (revision 267164) +++ gcc/testsuite/gcc.target/i386/pr52813.c (working copy) @@ -1,9 +1,10 @@ /* Ensure that stack pointer cannot be an asm clobber. */ /* { dg-do compile { target { ! ia32 } } } */ -/* { dg-options "-O2" } */ +/* { dg-options "-O3 -fomit-frame-pointer" } */ void test1 (void) { - asm volatile ("" : : : "%esp"); /* { dg-error "Stack Pointer register clobbered" } */ + asm volatile ("" : : : "%rsp"); /* { dg-warning "Stack Pointer register clobbered" } */ } +/* { dg-final { scan-assembler "(?n)pushq.*%rbp" } } */