nvptx: Delay 'sorry, unimplemented: dynamic stack allocation not supported' from expansion time to code generation

This gives the back end a chance to clean out a few more unnecessary instances
of dynamic stack allocation.  This progresses:

    PASS: gcc.dg/pr78902.c  (test for warnings, line 7)
    PASS: gcc.dg/pr78902.c  (test for warnings, line 8)
    PASS: gcc.dg/pr78902.c  (test for warnings, line 9)
    PASS: gcc.dg/pr78902.c  (test for warnings, line 10)
    PASS: gcc.dg/pr78902.c  (test for warnings, line 11)
    PASS: gcc.dg/pr78902.c  (test for warnings, line 12)
    PASS: gcc.dg/pr78902.c  (test for warnings, line 13)
    PASS: gcc.dg/pr78902.c strndup excessive bound at line 14 (test for warnings, line 13)
    [-UNSUPPORTED: gcc.dg/pr78902.c: dynamic stack allocation not supported-]
    {+PASS: gcc.dg/pr78902.c (test for excess errors)+}

    UNSUPPORTED: gcc.dg/torture/pr71901.c   -O0 : dynamic stack allocation not supported
    [-UNSUPPORTED:-]{+PASS:+} gcc.dg/torture/pr71901.c   -O1  [-: dynamic stack allocation not supported-]{+(test for excess errors)+}
    UNSUPPORTED: gcc.dg/torture/pr71901.c   -O2 : dynamic stack allocation not supported
    UNSUPPORTED: gcc.dg/torture/pr71901.c   -O3 -fomit-frame-pointer -funroll-loops -fpeel-loops -ftracer -finline-functions : dynamic stack allocation not supported
    UNSUPPORTED: gcc.dg/torture/pr71901.c   -O3 -g : dynamic stack allocation not supported
    [-UNSUPPORTED:-]{+PASS:+} gcc.dg/torture/pr71901.c   -Os  [-: dynamic stack allocation not supported-]{+(test for excess errors)+}

    UNSUPPORTED: gcc.dg/torture/pr78742.c   -O0 : dynamic stack allocation not supported
    [-UNSUPPORTED:-]{+PASS:+} gcc.dg/torture/pr78742.c   -O1  [-: dynamic stack allocation not supported-]{+(test for excess errors)+}
    [-UNSUPPORTED:-]{+PASS:+} gcc.dg/torture/pr78742.c   -O2  [-: dynamic stack allocation not supported-]{+(test for excess errors)+}
    [-UNSUPPORTED:-]{+PASS:+} gcc.dg/torture/pr78742.c   -O3 -fomit-frame-pointer -funroll-loops -fpeel-loops -ftracer -finline-functions  [-: dynamic stack allocation not supported-]{+(test for excess errors)+}
    [-UNSUPPORTED:-]{+PASS:+} gcc.dg/torture/pr78742.c   -O3 -g  [-: dynamic stack allocation not supported-]{+(test for excess errors)+}
    UNSUPPORTED: gcc.dg/torture/pr78742.c   -Os : dynamic stack allocation not supported

    [-UNSUPPORTED:-]{+PASS:+} gfortran.dg/pr101267.f90   -O  [-: dynamic stack allocation not supported-]{+(test for excess errors)+}

    [-UNSUPPORTED:-]{+PASS:+} gfortran.dg/pr112404.f90   -O  [-: dynamic stack allocation not supported-]{+(test for excess errors)+}

	gcc/
	* config/nvptx/nvptx.md (define_expand "allocate_stack")
	[!TARGET_SOFT_STACK]: Move
	'sorry ("dynamic stack allocation not supported");'...
	(define_insn "@nvptx_alloca_<mode>"): ... here.
	gcc/testsuite/
	* gcc.target/nvptx/alloca-1-unused-O0-sm_30.c: Adjust.
This commit is contained in:
Thomas Schwinge 2025-02-24 10:09:11 +01:00
parent 5c9ef3bdab
commit 22e76700ae
2 changed files with 32 additions and 22 deletions

View file

@ -1671,15 +1671,8 @@
(match_operand 1 "nvptx_register_operand")]
""
{
if (!TARGET_SOFT_STACK
&& TARGET_PTX_7_3
&& TARGET_SM52)
if (!TARGET_SOFT_STACK)
emit_insn (gen_nvptx_alloca (Pmode, operands[0], operands[1]));
else if (!TARGET_SOFT_STACK)
{
sorry ("dynamic stack allocation not supported");
emit_insn (gen_nop ());
}
else if (TARGET_SOFT_STACK)
{
emit_move_insn (stack_pointer_rtx,
@ -1696,19 +1689,28 @@
[(set (match_operand:P 0 "nvptx_register_operand" "=R")
(unspec:P [(match_operand:P 1 "nvptx_nonmemory_operand" "Ri")]
UNSPEC_ALLOCA))]
"TARGET_PTX_7_3
&& TARGET_SM52"
""
{
/* Convert the address from '.local' state space to generic. That way,
we don't have to use 'st.local', 'ld.local', and can easily pass the
address to other "generic functions".
TODO 'gcc.target/nvptx/alloca-5.c' */
output_asm_insn ("{", NULL);
output_asm_insn ("\\t.reg%t0\\t%0_local;", operands);
output_asm_insn ("\\talloca%u0\\t%0_local, %1;", operands);
output_asm_insn ("\\tcvta.local%u0\\t%0, %0_local;", operands);
output_asm_insn ("}", NULL);
return "";
if (TARGET_PTX_7_3
&& TARGET_SM52)
{
/* Convert the address from '.local' state space to generic. That way,
we don't have to use 'st.local', 'ld.local', and can easily pass the
address to other "generic functions".
TODO 'gcc.target/nvptx/alloca-5.c' */
output_asm_insn ("{", NULL);
output_asm_insn ("\\t.reg%t0\\t%0_local;", operands);
output_asm_insn ("\\talloca%u0\\t%0_local, %1;", operands);
output_asm_insn ("\\tcvta.local%u0\\t%0, %0_local;", operands);
output_asm_insn ("}", NULL);
return "";
}
else
{
sorry_at (INSN_LOCATION (insn),
"dynamic stack allocation not supported");
return "";
}
}
[(set_attr "predicable" "no")])

View file

@ -1,9 +1,17 @@
/* { dg-do compile } */
/* { dg-do assemble } */
/* { dg-options {-O0 -mno-soft-stack} } */
/* { dg-additional-options -march=sm_30 } */
/* { dg-additional-options -save-temps } */
/* { dg-final { check-function-bodies {** } {} } } */
void f(void)
{
__builtin_alloca(123); /* { dg-warning "ignoring return value of '__builtin_alloca' declared with attribute 'warn_unused_result'" } */
/* { dg-message {sorry, unimplemented: dynamic stack allocation not supported} {} { target *-*-* } .-1 } */
/* { dg-bogus {sorry, unimplemented: dynamic stack allocation not supported} {} { target *-*-* } .-1 } */
}
/*
** f:
** \.visible \.func f
** {
** ret;
*/