On Wed, Jun 4, 2025 at 7:28 AM H.J. Lu <hjl.to...@gmail.com> wrote:
>
> On s390x, for input:
>
> (call_insn/u 7 6 11 2 (parallel [
>             (set (reg:SI 2 %r2)
>                 (call (subreg:QI (symbol_ref:SI ("__tls_get_offset")
> [flags 0x1]) 3)
>                     (const_int 0 [0])))
>             (clobber (reg:SI 14 %r14))
>             (use (unspec:SI [
>                         (const_int 0 [0])
>                     ] UNSPEC_TLSLDM))
>         ]) "/tmp/foo.c":12:26 2602 {*brasl_tls}
>      (expr_list:REG_EH_REGION (const_int -2147483648 [0xffffffff80000000])
>         (nil))
>     (expr_list (use (reg:SI 2 %r2))
>         (expr_list (use (reg:SI 12 %r12))
>             (nil))))
>
> after r16-1041-g2da641d0170090, get_call_rtx_from returns:
>
> (call (subreg:QI (symbol_ref:SI ("__tls_get_offset") [flags 0x1]) 3)
>     (const_int 0 [0]))

That's a strange call!

> and we got
>
> Program received signal SIGSEGV, Segmentation fault.
> 0x000000000131174f in prepare_call_arguments (
>     bb=<basic_block 0x7fffe99dfba0 (2)>, insn=0x7fffe980cc60)
>     at /export/gnu/import/git/sources/gcc/gcc/var-tracking.cc:6277
> 6277 fndecl = MEM_EXPR (XEXP (call, 0));
> (gdb) bt
>     bb=<basic_block 0x7fffe99dfba0 (2)>, insn=0x7fffe980cc60)
>     at /export/gnu/import/git/sources/gcc/gcc/var-tracking.cc:6277
>     at /export/gnu/import/git/sources/gcc/gcc/var-tracking.cc:10297
>     at /export/gnu/import/git/sources/gcc/gcc/var-tracking.cc:10526
>     at /export/gnu/import/git/sources/gcc/gcc/var-tracking.cc:10579
>     at /export/gnu/import/git/sources/gcc/gcc/var-tracking.cc:10616
>
> Update prepare_call_arguments to check MEM_P before using MEM_EXPR.

OK.

Richard.

> gcc/
>
> PR debug/120525
> * var-tracking.cc (prepare_call_arguments): Use MEM_EXPR only
> if MEM_P is true.
>
> gcc/testsuite/
>
> PR debug/120525
> * gcc.dg/pr120525.c: New test.
>
>
> --
> H.J.

Reply via email to