rs6000: replace '(const_int 0)' to 'unspec:BLK [(const_int 0)]' for stack_tie
Checks
Commit Message
Hi,
For stack_tie, currently below insn is generated:
(insn 15 14 16 3 (parallel [
(set (mem/c:BLK (reg/f:DI 1 1) [1 A8])
(const_int 0 [0]))
]) "/home/guojiufu/temp/gdb.c":13:3 922 {stack_tie}
(nil))
It is "set (mem/c:BLK (reg/f:DI 1 1) (const_int 0 [0])". This maybe
looks like "a memory block is zerored", while actually stack_tie
may be more like a placeholder, and does not generate any thing.
To avoid potential misunderstand, "UNPSEC:BLK [(const_int 0)].." could
be used here like other ports.
This patch does this. Bootstrap®test pass on ppc64{,le}.
Is this ok for trunk?
BR,
Jeff (Jiufu Guo)
---
gcc/config/rs6000/predicates.md | 11 +++++++----
gcc/config/rs6000/rs6000-logue.cc | 4 +++-
gcc/config/rs6000/rs6000.cc | 4 ++++
gcc/config/rs6000/rs6000.md | 14 ++++++++++----
4 files changed, 24 insertions(+), 9 deletions(-)
Comments
Hi, Jiufu
This definitely seems to be a better solution.
The TARGET_CONST_ANCHOR change should not be part of this patch. Also
there is no ChangeLog for the patch.
This generally looks correct and consistent with other ports. I want
to give Segher a chance to double check it, if he wishes.
Thanks David
On Mon, Jun 12, 2023 at 9:19 AM Jiufu Guo <guojiufu@linux.ibm.com> wrote:
>
> Hi,
>
> For stack_tie, currently below insn is generated:
> (insn 15 14 16 3 (parallel [
> (set (mem/c:BLK (reg/f:DI 1 1) [1 A8])
> (const_int 0 [0]))
> ]) "/home/guojiufu/temp/gdb.c":13:3 922 {stack_tie}
> (nil))
>
> It is "set (mem/c:BLK (reg/f:DI 1 1) (const_int 0 [0])". This maybe
> looks like "a memory block is zerored", while actually stack_tie
> may be more like a placeholder, and does not generate any thing.
>
> To avoid potential misunderstand, "UNPSEC:BLK [(const_int 0)].." could
> be used here like other ports.
>
> This patch does this. Bootstrap®test pass on ppc64{,le}.
> Is this ok for trunk?
>
> BR,
> Jeff (Jiufu Guo)
>
> ---
> gcc/config/rs6000/predicates.md | 11 +++++++----
> gcc/config/rs6000/rs6000-logue.cc | 4 +++-
> gcc/config/rs6000/rs6000.cc | 4 ++++
> gcc/config/rs6000/rs6000.md | 14 ++++++++++----
> 4 files changed, 24 insertions(+), 9 deletions(-)
>
> diff --git a/gcc/config/rs6000/predicates.md b/gcc/config/rs6000/predicates.md
> index a16ee30f0c0..4748cb37ce8 100644
> --- a/gcc/config/rs6000/predicates.md
> +++ b/gcc/config/rs6000/predicates.md
> @@ -1854,10 +1854,13 @@ (define_predicate "stmw_operation"
> (define_predicate "tie_operand"
> (match_code "parallel")
> {
> - return (GET_CODE (XVECEXP (op, 0, 0)) == SET
> - && MEM_P (XEXP (XVECEXP (op, 0, 0), 0))
> - && GET_MODE (XEXP (XVECEXP (op, 0, 0), 0)) == BLKmode
> - && XEXP (XVECEXP (op, 0, 0), 1) == const0_rtx);
> + rtx set = XVECEXP (op, 0, 0);
> + return (GET_CODE (set) == SET
> + && MEM_P (SET_DEST (set))
> + && GET_MODE (SET_DEST (set)) == BLKmode
> + && GET_CODE (SET_SRC (set)) == UNSPEC
> + && XINT (SET_SRC (set), 1) == UNSPEC_TIE
> + && XVECEXP (SET_SRC (set), 0, 0) == const0_rtx);
> })
>
> ;; Match a small code model toc reference (or medium and large
> diff --git a/gcc/config/rs6000/rs6000-logue.cc b/gcc/config/rs6000/rs6000-logue.cc
> index bc6b153b59f..b99f43a8282 100644
> --- a/gcc/config/rs6000/rs6000-logue.cc
> +++ b/gcc/config/rs6000/rs6000-logue.cc
> @@ -1463,7 +1463,9 @@ rs6000_emit_stack_tie (rtx fp, bool hard_frame_needed)
> while (--i >= 0)
> {
> rtx mem = gen_frame_mem (BLKmode, regs[i]);
> - RTVEC_ELT (p, i) = gen_rtx_SET (mem, const0_rtx);
> + RTVEC_ELT (p, i)
> + = gen_rtx_SET (mem, gen_rtx_UNSPEC (BLKmode, gen_rtvec (1, const0_rtx),
> + UNSPEC_TIE));
> }
>
> emit_insn (gen_stack_tie (gen_rtx_PARALLEL (VOIDmode, p)));
> diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc
> index d197c3f3289..0c81ebea711 100644
> --- a/gcc/config/rs6000/rs6000.cc
> +++ b/gcc/config/rs6000/rs6000.cc
> @@ -1760,6 +1760,10 @@ static const struct attribute_spec rs6000_attribute_table[] =
>
> #undef TARGET_UPDATE_IPA_FN_TARGET_INFO
> #define TARGET_UPDATE_IPA_FN_TARGET_INFO rs6000_update_ipa_fn_target_info
> +
> +#undef TARGET_CONST_ANCHOR
> +#define TARGET_CONST_ANCHOR 0x8000
> +
>
>
> /* Processor table. */
> diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md
> index b0db8ae508d..fdcf8347812 100644
> --- a/gcc/config/rs6000/rs6000.md
> +++ b/gcc/config/rs6000/rs6000.md
> @@ -158,6 +158,7 @@ (define_c_enum "unspec"
> UNSPEC_HASHCHK
> UNSPEC_XXSPLTIDP_CONST
> UNSPEC_XXSPLTIW_CONST
> + UNSPEC_TIE
> ])
>
> ;;
> @@ -10828,7 +10829,9 @@ (define_expand "restore_stack_block"
> operands[4] = gen_frame_mem (Pmode, operands[1]);
> p = rtvec_alloc (1);
> RTVEC_ELT (p, 0) = gen_rtx_SET (gen_frame_mem (BLKmode, operands[0]),
> - const0_rtx);
> + gen_rtx_UNSPEC (BLKmode,
> + gen_rtvec (1, const0_rtx),
> + UNSPEC_TIE));
> operands[5] = gen_rtx_PARALLEL (VOIDmode, p);
> })
>
> @@ -10866,7 +10869,9 @@ (define_expand "restore_stack_nonlocal"
> operands[5] = gen_frame_mem (Pmode, operands[3]);
> p = rtvec_alloc (1);
> RTVEC_ELT (p, 0) = gen_rtx_SET (gen_frame_mem (BLKmode, operands[0]),
> - const0_rtx);
> + gen_rtx_UNSPEC (BLKmode,
> + gen_rtvec (1, const0_rtx),
> + UNSPEC_TIE));
> operands[6] = gen_rtx_PARALLEL (VOIDmode, p);
> })
>
> @@ -13898,7 +13903,8 @@ (define_insn "*save_fpregs_<mode>_r1"
> ; not be moved over loads from or stores to stack memory.
> (define_insn "stack_tie"
> [(match_parallel 0 "tie_operand"
> - [(set (mem:BLK (reg 1)) (const_int 0))])]
> + [(set (mem:BLK (reg 1))
> + (unspec:BLK [(const_int 0)] UNSPEC_TIE))])]
> ""
> ""
> [(set_attr "length" "0")])
> @@ -13910,7 +13916,7 @@ (define_insn "stack_restore_tie"
> [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
> (plus:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
> (match_operand:SI 2 "reg_or_cint_operand" "O,rI")))
> - (set (mem:BLK (scratch)) (const_int 0))]
> + (set (mem:BLK (scratch)) (unspec:BLK [(const_int 0)] UNSPEC_TIE))]
> "TARGET_32BIT"
> "@
> mr %0,%1
> --
> 2.39.3
>
Hi David,
David Edelsohn <dje.gcc@gmail.com> writes:
> Hi, Jiufu
>
> This definitely seems to be a better solution.
>
> The TARGET_CONST_ANCHOR change should not be part of this patch. Also
> there is no ChangeLog for the patch.
Thanks a lot for your quick review!! And sorry for the sending this patch
in a hurry. I would update the patch accordingly.
BR,
Jeff (Jiufu Guo)
>
> This generally looks correct and consistent with other ports. I want
> to give Segher a chance to double check it, if he wishes.
>
> Thanks David
>
> On Mon, Jun 12, 2023 at 9:19 AM Jiufu Guo <guojiufu@linux.ibm.com> wrote:
>>
>> Hi,
>>
>> For stack_tie, currently below insn is generated:
>> (insn 15 14 16 3 (parallel [
>> (set (mem/c:BLK (reg/f:DI 1 1) [1 A8])
>> (const_int 0 [0]))
>> ]) "/home/guojiufu/temp/gdb.c":13:3 922 {stack_tie}
>> (nil))
>>
>> It is "set (mem/c:BLK (reg/f:DI 1 1) (const_int 0 [0])". This maybe
>> looks like "a memory block is zerored", while actually stack_tie
>> may be more like a placeholder, and does not generate any thing.
>>
>> To avoid potential misunderstand, "UNPSEC:BLK [(const_int 0)].." could
>> be used here like other ports.
>>
>> This patch does this. Bootstrap®test pass on ppc64{,le}.
>> Is this ok for trunk?
>>
>> BR,
>> Jeff (Jiufu Guo)
>>
>> ---
>> gcc/config/rs6000/predicates.md | 11 +++++++----
>> gcc/config/rs6000/rs6000-logue.cc | 4 +++-
>> gcc/config/rs6000/rs6000.cc | 4 ++++
>> gcc/config/rs6000/rs6000.md | 14 ++++++++++----
>> 4 files changed, 24 insertions(+), 9 deletions(-)
>>
>> diff --git a/gcc/config/rs6000/predicates.md b/gcc/config/rs6000/predicates.md
>> index a16ee30f0c0..4748cb37ce8 100644
>> --- a/gcc/config/rs6000/predicates.md
>> +++ b/gcc/config/rs6000/predicates.md
>> @@ -1854,10 +1854,13 @@ (define_predicate "stmw_operation"
>> (define_predicate "tie_operand"
>> (match_code "parallel")
>> {
>> - return (GET_CODE (XVECEXP (op, 0, 0)) == SET
>> - && MEM_P (XEXP (XVECEXP (op, 0, 0), 0))
>> - && GET_MODE (XEXP (XVECEXP (op, 0, 0), 0)) == BLKmode
>> - && XEXP (XVECEXP (op, 0, 0), 1) == const0_rtx);
>> + rtx set = XVECEXP (op, 0, 0);
>> + return (GET_CODE (set) == SET
>> + && MEM_P (SET_DEST (set))
>> + && GET_MODE (SET_DEST (set)) == BLKmode
>> + && GET_CODE (SET_SRC (set)) == UNSPEC
>> + && XINT (SET_SRC (set), 1) == UNSPEC_TIE
>> + && XVECEXP (SET_SRC (set), 0, 0) == const0_rtx);
>> })
>>
>> ;; Match a small code model toc reference (or medium and large
>> diff --git a/gcc/config/rs6000/rs6000-logue.cc b/gcc/config/rs6000/rs6000-logue.cc
>> index bc6b153b59f..b99f43a8282 100644
>> --- a/gcc/config/rs6000/rs6000-logue.cc
>> +++ b/gcc/config/rs6000/rs6000-logue.cc
>> @@ -1463,7 +1463,9 @@ rs6000_emit_stack_tie (rtx fp, bool hard_frame_needed)
>> while (--i >= 0)
>> {
>> rtx mem = gen_frame_mem (BLKmode, regs[i]);
>> - RTVEC_ELT (p, i) = gen_rtx_SET (mem, const0_rtx);
>> + RTVEC_ELT (p, i)
>> + = gen_rtx_SET (mem, gen_rtx_UNSPEC (BLKmode, gen_rtvec (1, const0_rtx),
>> + UNSPEC_TIE));
>> }
>>
>> emit_insn (gen_stack_tie (gen_rtx_PARALLEL (VOIDmode, p)));
>> diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc
>> index d197c3f3289..0c81ebea711 100644
>> --- a/gcc/config/rs6000/rs6000.cc
>> +++ b/gcc/config/rs6000/rs6000.cc
>> @@ -1760,6 +1760,10 @@ static const struct attribute_spec rs6000_attribute_table[] =
>>
>> #undef TARGET_UPDATE_IPA_FN_TARGET_INFO
>> #define TARGET_UPDATE_IPA_FN_TARGET_INFO rs6000_update_ipa_fn_target_info
>> +
>> +#undef TARGET_CONST_ANCHOR
>> +#define TARGET_CONST_ANCHOR 0x8000
>> +
>>
>>
>> /* Processor table. */
>> diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md
>> index b0db8ae508d..fdcf8347812 100644
>> --- a/gcc/config/rs6000/rs6000.md
>> +++ b/gcc/config/rs6000/rs6000.md
>> @@ -158,6 +158,7 @@ (define_c_enum "unspec"
>> UNSPEC_HASHCHK
>> UNSPEC_XXSPLTIDP_CONST
>> UNSPEC_XXSPLTIW_CONST
>> + UNSPEC_TIE
>> ])
>>
>> ;;
>> @@ -10828,7 +10829,9 @@ (define_expand "restore_stack_block"
>> operands[4] = gen_frame_mem (Pmode, operands[1]);
>> p = rtvec_alloc (1);
>> RTVEC_ELT (p, 0) = gen_rtx_SET (gen_frame_mem (BLKmode, operands[0]),
>> - const0_rtx);
>> + gen_rtx_UNSPEC (BLKmode,
>> + gen_rtvec (1, const0_rtx),
>> + UNSPEC_TIE));
>> operands[5] = gen_rtx_PARALLEL (VOIDmode, p);
>> })
>>
>> @@ -10866,7 +10869,9 @@ (define_expand "restore_stack_nonlocal"
>> operands[5] = gen_frame_mem (Pmode, operands[3]);
>> p = rtvec_alloc (1);
>> RTVEC_ELT (p, 0) = gen_rtx_SET (gen_frame_mem (BLKmode, operands[0]),
>> - const0_rtx);
>> + gen_rtx_UNSPEC (BLKmode,
>> + gen_rtvec (1, const0_rtx),
>> + UNSPEC_TIE));
>> operands[6] = gen_rtx_PARALLEL (VOIDmode, p);
>> })
>>
>> @@ -13898,7 +13903,8 @@ (define_insn "*save_fpregs_<mode>_r1"
>> ; not be moved over loads from or stores to stack memory.
>> (define_insn "stack_tie"
>> [(match_parallel 0 "tie_operand"
>> - [(set (mem:BLK (reg 1)) (const_int 0))])]
>> + [(set (mem:BLK (reg 1))
>> + (unspec:BLK [(const_int 0)] UNSPEC_TIE))])]
>> ""
>> ""
>> [(set_attr "length" "0")])
>> @@ -13910,7 +13916,7 @@ (define_insn "stack_restore_tie"
>> [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
>> (plus:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
>> (match_operand:SI 2 "reg_or_cint_operand" "O,rI")))
>> - (set (mem:BLK (scratch)) (const_int 0))]
>> + (set (mem:BLK (scratch)) (unspec:BLK [(const_int 0)] UNSPEC_TIE))]
>> "TARGET_32BIT"
>> "@
>> mr %0,%1
>> --
>> 2.39.3
>>
Hi!
On Tue, Jun 13, 2023 at 10:15:49AM +0800, Jiufu Guo wrote:
> David Edelsohn <dje.gcc@gmail.com> writes:
> >
> > This definitely seems to be a better solution.
> >
> > The TARGET_CONST_ANCHOR change should not be part of this patch. Also
> > there is no ChangeLog for the patch.
>
> Thanks a lot for your quick review!! And sorry for the sending this patch
> in a hurry. I would update the patch accordingly.
> > This generally looks correct and consistent with other ports. I want
> > to give Segher a chance to double check it, if he wishes.
The documentation is very clear that the only thing for which you can
have BLKmode is "mem". Not unspec, only "mem".
Let's not do this. The existing code has clear and obvious semantics,
which is documented as well -- there is no reason to make it worse in
every respect!
Segher
On Tue, Jun 13, 2023 at 2:16 PM Segher Boessenkool
<segher@kernel.crashing.org> wrote:
>
> Hi!
>
> On Tue, Jun 13, 2023 at 10:15:49AM +0800, Jiufu Guo wrote:
> > David Edelsohn <dje.gcc@gmail.com> writes:
> > >
> > > This definitely seems to be a better solution.
> > >
> > > The TARGET_CONST_ANCHOR change should not be part of this patch. Also
> > > there is no ChangeLog for the patch.
> >
> > Thanks a lot for your quick review!! And sorry for the sending this patch
> > in a hurry. I would update the patch accordingly.
>
> > > This generally looks correct and consistent with other ports. I want
> > > to give Segher a chance to double check it, if he wishes.
>
> The documentation is very clear that the only thing for which you can
> have BLKmode is "mem". Not unspec, only "mem".
>
> Let's not do this. The existing code has clear and obvious semantics,
> which is documented as well -- there is no reason to make it worse in
> every respect.
Segher,
Unfortunately, GCC now is inconsistent and this response is incorrect.
The documentation is out of date or was ignored and the "facts on the
ground" contradict your review.
Yes, (const_int 0) is supposed to be a general no-op and BLKmode only
is supposed to be used for MEM, but other major targets (arm, aarch64,
riscv, s390) all use unspec:BLK and specifically UNSPEC_TIE. rs6000
is the only port that does not follow this convention. The middle-end
has adapted to the behavior of all of the other targets, whether that
conformed to the documentation or not. The rs6000 port needs to be
fixed and Jiufu's approach is the correct one, consistent with all
other targets for stack tie. If the documentation differs, the
documentation needs to be updated, not a different approach for the
rs6000 port. Jiufu's patch is correct.
Thanks, David
Hi Segher, David,
David Edelsohn <dje.gcc@gmail.com> writes:
> On Tue, Jun 13, 2023 at 2:16 PM Segher Boessenkool
> <segher@kernel.crashing.org> wrote:
>>
>> Hi!
>>
>> On Tue, Jun 13, 2023 at 10:15:49AM +0800, Jiufu Guo wrote:
>> > David Edelsohn <dje.gcc@gmail.com> writes:
>> > >
>> > > This definitely seems to be a better solution.
>> > >
>> > > The TARGET_CONST_ANCHOR change should not be part of this patch. Also
>> > > there is no ChangeLog for the patch.
>> >
>> > Thanks a lot for your quick review!! And sorry for the sending this patch
>> > in a hurry. I would update the patch accordingly.
>>
>> > > This generally looks correct and consistent with other ports. I want
>> > > to give Segher a chance to double check it, if he wishes.
>>
>> The documentation is very clear that the only thing for which you can
>> have BLKmode is "mem". Not unspec, only "mem".
>>
>> Let's not do this. The existing code has clear and obvious semantics,
>> which is documented as well -- there is no reason to make it worse in
>> every respect.
Thanks for all your insight comments!
Yeap, while "unspec:BLK" is very widely used already on various ports.
And it seems a few place is using BLKmode without strictly align with
the document :( It would not be very good thing, but maybe no better
solutions.
For existing code "set (mem/c:BLK (reg/f:DI 1 1) (const_int 0 [0])"
Since it is a set, the operand set_src should be valid for
the mode of the set_dest. While set_src is 'const_int 0'.
And this 'set' may be mis-readed as 'a memory is zeroed' or
'no-op to a mem'. Using unspec here would just say this is an special
operation instead a normal 'const_int 0'.
BR,
Jeff (Jiufu Guo)
>
> Segher,
>
> Unfortunately, GCC now is inconsistent and this response is incorrect.
> The documentation is out of date or was ignored and the "facts on the
> ground" contradict your review.
>
> Yes, (const_int 0) is supposed to be a general no-op and BLKmode only
> is supposed to be used for MEM, but other major targets (arm, aarch64,
> riscv, s390) all use unspec:BLK and specifically UNSPEC_TIE. rs6000
> is the only port that does not follow this convention. The middle-end
> has adapted to the behavior of all of the other targets, whether that
> conformed to the documentation or not. The rs6000 port needs to be
> fixed and Jiufu's approach is the correct one, consistent with all
> other targets for stack tie. If the documentation differs, the
> documentation needs to be updated, not a different approach for the
> rs6000 port. Jiufu's patch is correct.
>
> Thanks, David
@@ -1854,10 +1854,13 @@ (define_predicate "stmw_operation"
(define_predicate "tie_operand"
(match_code "parallel")
{
- return (GET_CODE (XVECEXP (op, 0, 0)) == SET
- && MEM_P (XEXP (XVECEXP (op, 0, 0), 0))
- && GET_MODE (XEXP (XVECEXP (op, 0, 0), 0)) == BLKmode
- && XEXP (XVECEXP (op, 0, 0), 1) == const0_rtx);
+ rtx set = XVECEXP (op, 0, 0);
+ return (GET_CODE (set) == SET
+ && MEM_P (SET_DEST (set))
+ && GET_MODE (SET_DEST (set)) == BLKmode
+ && GET_CODE (SET_SRC (set)) == UNSPEC
+ && XINT (SET_SRC (set), 1) == UNSPEC_TIE
+ && XVECEXP (SET_SRC (set), 0, 0) == const0_rtx);
})
;; Match a small code model toc reference (or medium and large
@@ -1463,7 +1463,9 @@ rs6000_emit_stack_tie (rtx fp, bool hard_frame_needed)
while (--i >= 0)
{
rtx mem = gen_frame_mem (BLKmode, regs[i]);
- RTVEC_ELT (p, i) = gen_rtx_SET (mem, const0_rtx);
+ RTVEC_ELT (p, i)
+ = gen_rtx_SET (mem, gen_rtx_UNSPEC (BLKmode, gen_rtvec (1, const0_rtx),
+ UNSPEC_TIE));
}
emit_insn (gen_stack_tie (gen_rtx_PARALLEL (VOIDmode, p)));
@@ -1760,6 +1760,10 @@ static const struct attribute_spec rs6000_attribute_table[] =
#undef TARGET_UPDATE_IPA_FN_TARGET_INFO
#define TARGET_UPDATE_IPA_FN_TARGET_INFO rs6000_update_ipa_fn_target_info
+
+#undef TARGET_CONST_ANCHOR
+#define TARGET_CONST_ANCHOR 0x8000
+
/* Processor table. */
@@ -158,6 +158,7 @@ (define_c_enum "unspec"
UNSPEC_HASHCHK
UNSPEC_XXSPLTIDP_CONST
UNSPEC_XXSPLTIW_CONST
+ UNSPEC_TIE
])
;;
@@ -10828,7 +10829,9 @@ (define_expand "restore_stack_block"
operands[4] = gen_frame_mem (Pmode, operands[1]);
p = rtvec_alloc (1);
RTVEC_ELT (p, 0) = gen_rtx_SET (gen_frame_mem (BLKmode, operands[0]),
- const0_rtx);
+ gen_rtx_UNSPEC (BLKmode,
+ gen_rtvec (1, const0_rtx),
+ UNSPEC_TIE));
operands[5] = gen_rtx_PARALLEL (VOIDmode, p);
})
@@ -10866,7 +10869,9 @@ (define_expand "restore_stack_nonlocal"
operands[5] = gen_frame_mem (Pmode, operands[3]);
p = rtvec_alloc (1);
RTVEC_ELT (p, 0) = gen_rtx_SET (gen_frame_mem (BLKmode, operands[0]),
- const0_rtx);
+ gen_rtx_UNSPEC (BLKmode,
+ gen_rtvec (1, const0_rtx),
+ UNSPEC_TIE));
operands[6] = gen_rtx_PARALLEL (VOIDmode, p);
})
@@ -13898,7 +13903,8 @@ (define_insn "*save_fpregs_<mode>_r1"
; not be moved over loads from or stores to stack memory.
(define_insn "stack_tie"
[(match_parallel 0 "tie_operand"
- [(set (mem:BLK (reg 1)) (const_int 0))])]
+ [(set (mem:BLK (reg 1))
+ (unspec:BLK [(const_int 0)] UNSPEC_TIE))])]
""
""
[(set_attr "length" "0")])
@@ -13910,7 +13916,7 @@ (define_insn "stack_restore_tie"
[(set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
(plus:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
(match_operand:SI 2 "reg_or_cint_operand" "O,rI")))
- (set (mem:BLK (scratch)) (const_int 0))]
+ (set (mem:BLK (scratch)) (unspec:BLK [(const_int 0)] UNSPEC_TIE))]
"TARGET_32BIT"
"@
mr %0,%1