From 5cc1d832092439d14f6eaf72d6409e979acb28fc Mon Sep 17 00:00:00 2001 From: Takayuki 'January June' Suwa Date: Fri, 20 Feb 2026 21:17:15 +0900 Subject: [PATCH] xtensa: constantsynth: Exclude the stack pointer When updating the value of the stack pointer through a sequence of instruc- tions, only the last instruction in the sequence must modify the stack pointer, because the stack pointer may be referenced by an interrupt or other event during the sequence: /* example */ register void *stack_ptr asm ("a1"); void test(void) { stack_ptr = (void *)0x04000000; } ;; before (-O -mabi=call0) test: movi.n sp, 1 ;; An interrupt may occur slli sp, sp, 26 ;; between these instructions ret.n This patch avoids this problem by excluding constant value assignments to the stack pointer from 'constantsynth'. ;; after (-O -mabi=call0) .literal_position .literal .LC0, 67108864 test: l32r sp, .LC0 ret.n gcc/ChangeLog: * config/xtensa/xtensa.cc (constantsynth_pass1): Add the case where the assignment destination is a stack pointer to the exclusion criteria for processing. --- gcc/config/xtensa/xtensa.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gcc/config/xtensa/xtensa.cc b/gcc/config/xtensa/xtensa.cc index ff3801194fde..c2a6a1610662 100644 --- a/gcc/config/xtensa/xtensa.cc +++ b/gcc/config/xtensa/xtensa.cc @@ -6028,7 +6028,7 @@ constantsynth_pass1 (rtx_insn *insn, constantsynth_info &info) constant. */ if (GET_CODE (pat = PATTERN (insn)) != SET || ! REG_P (dest = SET_DEST (pat)) || ! GP_REG_P (REGNO (dest)) - || GET_MODE (dest) != SImode + || GET_MODE (dest) != SImode || rtx_equal_p (dest, stack_pointer_rtx) || ! CONST_INT_P (src = avoid_constant_pool_reference (SET_SRC (pat)))) return false;