On Thu, 4 Jan 2024 14:39:23 -0700, Jeff Law wrote:
> On 1/4/24 02:23, Mikael Pettersson wrote:
> > emit_library_call_value_1 calls emit_push_insn with NULL_TREE
> > for TYPE. Sometimes emit_push_insn needs to assign a temp with
> > that TYPE, which causes a segfault.
> >
> > Fixed by computing the TYPE from MODE when needed.
> >
> > Original patch by Thorsten Otto.
> >
> > gcc/
> >
> > 2024-01-03 Thorsten Otto <[email protected]>
> > Mikael Pettersson <[email protected]>
> >
> > PR target/82420
> > PR target/111279
> > * expr.cc (emit_push_insn): If TYPE is NULL compute it
> > from MODE before calling assign_temp.
> >
> > gcc/teststuite/
> >
> > 2024-01-03 Mikael Pettersson <[email protected]>
> >
> > PR target/82420
> > * gcc.target/m68k/pr82420.c: New test.
> This really needs to happen in the two call paths which pass in
> NULL_TREE for the type. Note how the type is used to determine padding
> earlier in emit_push_insn. That would also make the code more
> consistent with the comment before emit_push_insn which implies that
> both MODE and TYPE are valid.
>
>
> Additionally you should bootstrap and regression test this patch on at
> least one target.
Updated as requested, and bootstrapped and tested on
{x86_64,aarch64,m68k}-linux-gnu without regressions.
gcc/
2024-01-16 Thorsten Otto <[email protected]>
Mikael Pettersson <[email protected]>
PR target/82420
PR target/111279
* calls.cc (emit_library_call_value_1): Pass valid TYPE
to emit_push_insn.
* expr.cc (emit_push_insn): Likewise.
gcc/teststuite/
2024-01-16 Mikael Pettersson <[email protected]>
PR target/82420
* gcc.target/m68k/pr82420.c: New test.
---
gcc/calls.cc | 4 ++--
gcc/expr.cc | 5 +++--
gcc/testsuite/gcc.target/m68k/pr82420.c | 9 +++++++++
3 files changed, 14 insertions(+), 4 deletions(-)
create mode 100644 gcc/testsuite/gcc.target/m68k/pr82420.c
diff --git a/gcc/calls.cc b/gcc/calls.cc
index 7c35b1ad204..01f44734743 100644
--- a/gcc/calls.cc
+++ b/gcc/calls.cc
@@ -4580,8 +4580,8 @@ emit_library_call_value_1 (int retval, rtx orgfun, rtx
value,
}
}
- emit_push_insn (val, mode, NULL_TREE, NULL_RTX, parm_align,
- partial, reg, 0, argblock,
+ emit_push_insn (val, mode, lang_hooks.types.type_for_mode (mode, 0),
+ NULL_RTX, parm_align, partial, reg, 0, argblock,
(gen_int_mode
(argvec[argnum].locate.offset.constant, Pmode)),
reg_parm_stack_space,
diff --git a/gcc/expr.cc b/gcc/expr.cc
index 34f5ff90a9f..3015f9e51d8 100644
--- a/gcc/expr.cc
+++ b/gcc/expr.cc
@@ -5532,11 +5532,12 @@ emit_push_insn (rtx x, machine_mode mode, tree type,
rtx size,
/* Loop over all the words allocated on the stack for this arg. */
/* We can do it by words, because any scalar bigger than a word
has a size a multiple of a word. */
+ tree word_mode_type = lang_hooks.types.type_for_mode (word_mode, 1);
for (i = num_words - 1; i >= not_stack; i--)
if (i >= not_stack + offset)
if (!emit_push_insn (operand_subword_force (x, i, mode),
- word_mode, NULL_TREE, NULL_RTX, align, 0, NULL_RTX,
- 0, args_addr,
+ word_mode, word_mode_type, NULL_RTX, align, 0,
+ NULL_RTX, 0, args_addr,
GEN_INT (args_offset + ((i - not_stack + skip)
* UNITS_PER_WORD)),
reg_parm_stack_space, alignment_pad, sibcall_p))
diff --git a/gcc/testsuite/gcc.target/m68k/pr82420.c
b/gcc/testsuite/gcc.target/m68k/pr82420.c
new file mode 100644
index 00000000000..5c84f292103
--- /dev/null
+++ b/gcc/testsuite/gcc.target/m68k/pr82420.c
@@ -0,0 +1,9 @@
+/* { do-do compile } */
+/* { dg-options "-march=68000 -malign-int" } */
+
+int a;
+
+void f(void)
+{
+ a /= 3;
+}
--
2.43.0