aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Schwinge <tschwinge@baylibre.com>2024-12-13 15:09:49 +0100
committerThomas Schwinge <tschwinge@baylibre.com>2025-01-08 23:00:47 +0100
commit1823170805a3b36848d096dbdd28b479e16cf443 (patch)
tree6509af32ae2aa7a04c4593d8f58548b086199d5f
parent2116e8d2275f8bfb04263f26eed17b928513fed8 (diff)
downloadgcc-1823170805a3b36848d096dbdd28b479e16cf443.zip
gcc-1823170805a3b36848d096dbdd28b479e16cf443.tar.gz
gcc-1823170805a3b36848d096dbdd28b479e16cf443.tar.bz2
nvptx: Handle '__builtin_stack_save()' in a well-behaved way for PTX "native" stacks [PR65181]
PR target/65181 gcc/ * config/nvptx/nvptx.md [!TARGET_SOFT_STACK] (save_stack_block): 'define_expand'. gcc/testsuite/ * gcc.target/nvptx/__builtin_stack_save___builtin_stack_restore-1.c: Adjust.
-rw-r--r--gcc/config/nvptx/nvptx.md18
-rw-r--r--gcc/testsuite/gcc.target/nvptx/__builtin_stack_save___builtin_stack_restore-1.c17
2 files changed, 23 insertions, 12 deletions
diff --git a/gcc/config/nvptx/nvptx.md b/gcc/config/nvptx/nvptx.md
index f77752a..56cd25e 100644
--- a/gcc/config/nvptx/nvptx.md
+++ b/gcc/config/nvptx/nvptx.md
@@ -1687,12 +1687,28 @@
return nvptx_output_set_softstack (REGNO (operands[0]));
})
+(define_expand "save_stack_block"
+ [(match_operand 0 "register_operand" "")
+ (match_operand 1 "register_operand" "")]
+ "!TARGET_SOFT_STACK"
+{
+ /* The concept of a '%stack' pointer doesn't apply like this for
+ PTX "native" stacks. GCC however occasionally synthesizes
+ '__builtin_stack_save ()', '__builtin_stack_restore ()', and isn't able to
+ optimize them all away. Just submit a dummy -- user code shouldn't be
+ able to observe this. */
+ emit_move_insn (operands[0], GEN_INT (0xdeadbeef));
+ DONE;
+})
+
(define_expand "restore_stack_block"
[(match_operand 0 "register_operand" "")
(match_operand 1 "register_operand" "")]
""
{
- if (TARGET_SOFT_STACK)
+ if (!TARGET_SOFT_STACK)
+ ; /* See 'save_stack_block'. */
+ else
{
emit_move_insn (operands[0], operands[1]);
emit_insn (gen_set_softstack (Pmode, operands[0]));
diff --git a/gcc/testsuite/gcc.target/nvptx/__builtin_stack_save___builtin_stack_restore-1.c b/gcc/testsuite/gcc.target/nvptx/__builtin_stack_save___builtin_stack_restore-1.c
index 294014d..35a879f 100644
--- a/gcc/testsuite/gcc.target/nvptx/__builtin_stack_save___builtin_stack_restore-1.c
+++ b/gcc/testsuite/gcc.target/nvptx/__builtin_stack_save___builtin_stack_restore-1.c
@@ -1,7 +1,6 @@
/* Document what we do for '__builtin_stack_save()', '__builtin_stack_restore()'. */
-/* { dg-do compile }
- TODO We can't 'assemble' this -- it's invalid PTX code. */
+/* { dg-do assemble } */
/* { dg-options {-O3 -mno-soft-stack} } */
/* { dg-additional-options -save-temps } */
/* { dg-final { check-function-bodies {** } {} } } */
@@ -10,8 +9,10 @@ void *p;
void f(void)
{
+ // 0xdeadbeef
p = __builtin_stack_save();
asm volatile ("" : : : "memory");
+ // no-op
__builtin_stack_restore(p);
asm volatile ("" : : : "memory");
}
@@ -19,14 +20,8 @@ void f(void)
** f:
** \.visible \.func f
** {
-** st\.global\.u64 \[p\], %stack;
+** \.reg\.u64 (%r[0-9]+);
+** mov\.u64 \1, 3735928559;
+** st\.global\.u64 \[p\], \1;
** ret;
*/
-
-/* The concept of a '%stack' pointer doesn't apply like this for
- '-mno-soft-stack': PTX "native" stacks (TODO).
-
- { dg-final { scan-assembler-not {%stack} { xfail *-*-* } } } */
-
-/* As these are an internal-use built-in function, we don't bother with
- emitting proper error diagnostics. */