Patchwork [RFA,alpha] : Fix PR 57379, segfault in invalidate_any_buried_refs

login
register
mail settings
Submitter Uros Bizjak
Date May 23, 2013, 7:38 a.m.
Message ID <CAFULd4YdRHDOT4oo=rFOufDt+GmNTFmF-EQKOAbx4nZBv-zHAA@mail.gmail.com>
Download mbox | patch
Permalink /patch/245832/
State New
Headers show

Comments

Uros Bizjak - May 23, 2013, 7:38 a.m.
Hello!

As explained in the PR [1], alpha constructs a strange REG_EQUAL note
for the TFmode xfloating compare call. A recent mainline change that
tries to invalidate any buried refs trips on this note and segfaults
on null expr_list terminator:

(gdb) p debug_rtx (insn)
(insn 65 64 66 2 (set (reg:DI 148)
        (reg:DI 0 $0)) ../../../gcc-svn/trunk/libgcc/libgcc2.c:1882 226 {*movdi}
     (expr_list:REG_DEAD (reg:DI 0 $0)
        (expr_list:REG_EQUAL (expr_list:REG_DEP_TRUE (symbol_ref:DI
("_OtsEqlX") [flags 0x41])
                (expr_list:REG_DEP_TRUE (reg/v:TF 70 [ x ])
                    (expr_list:REG_DEP_TRUE (reg/v:TF 70 [ x ])
                        (nil))))
            (nil))))

Proposed patch replaces expr_list sequence inside REG_EQUAL RTX with
an unspec RTX.

2013-05-23  Uros Bizjak  <ubizjak@gmail.com>

    * config/alpha/alpha.md (unspec): Add UNSPEC_XFLT_COMPARE.
    * config/alpha/alpha.c (alpha_emit_xfloating_compare): Construct
    REG_EQUAL note as UNSPEC_XFLT_COMPARE unspec.

Patch was bootstrapped and regression tested on alphaev68-linux-gnu.

OK for mainline and release branches?

[1] http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57379

Uros.
Richard Henderson - May 23, 2013, 5:20 p.m.
On 05/23/2013 12:38 AM, Uros Bizjak wrote:
> 2013-05-23  Uros Bizjak  <ubizjak@gmail.com>
> 
>     * config/alpha/alpha.md (unspec): Add UNSPEC_XFLT_COMPARE.
>     * config/alpha/alpha.c (alpha_emit_xfloating_compare): Construct
>     REG_EQUAL note as UNSPEC_XFLT_COMPARE unspec.
> 
> Patch was bootstrapped and regression tested on alphaev68-linux-gnu.
> 
> OK for mainline and release branches?
> 
> [1] http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57379

Ok.


r~

Patch

Index: config/alpha/alpha.md
===================================================================
--- config/alpha/alpha.md	(revision 199131)
+++ config/alpha/alpha.md	(working copy)
@@ -23,6 +23,7 @@ 
 ;; Uses of UNSPEC in this file:
 
 (define_c_enum "unspec" [
+  UNSPEC_XFLT_COMPARE
   UNSPEC_ARG_HOME
   UNSPEC_LDGP1
   UNSPEC_INSXH
Index: config/alpha/alpha.c
===================================================================
--- config/alpha/alpha.c	(revision 199131)
+++ config/alpha/alpha.c	(working copy)
@@ -3067,12 +3067,8 @@  alpha_emit_xfloating_compare (enum rtx_code *pcode
   operands[1] = op1;
   out = gen_reg_rtx (DImode);
 
-  /* What's actually returned is -1,0,1, not a proper boolean value,
-     so use an EXPR_LIST as with a generic libcall instead of a 
-     comparison type expression.  */
-  note = gen_rtx_EXPR_LIST (VOIDmode, op1, NULL_RTX);
-  note = gen_rtx_EXPR_LIST (VOIDmode, op0, note);
-  note = gen_rtx_EXPR_LIST (VOIDmode, func, note);
+  /* What's actually returned is -1,0,1, not a proper boolean value.  */
+  note = gen_rtx_UNSPEC (DImode, gen_rtvec (2, op0, op1), UNSPEC_XFLT_COMPARE);
   alpha_emit_xfloating_libcall (func, out, operands, 2, note);
 
   return out;