This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: c/6875: IA64 compiler crash when -O3


Synopsis: IA64 compiler crash when -O3

State-Changed-From-To: open->analyzed
State-Changed-By: vmakarov
State-Changed-When: Thu May 30 16:10:13 2002
State-Changed-Why:
    The problem occurs because tree inliner creates a label in
    
    expand_call_inline (tp, walk_subtrees, data)
    {
      ...
      /* Return statements in the function body will be replaced by jumps
         to the RET_LABEL.  */
      id->ret_label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE);
      ...
    }
    
    The label is expanded twice in expand_call for normal call and sibling
    call.  The corresponding RTL CODE_LABEL is generated only once for sibling call
    because of the standard code:
    
    rtx
    label_rtx (label)
         tree label;
    {
      if (TREE_CODE (label) != LABEL_DECL)
        abort ();
    
      if (!DECL_RTL_SET_P (label))
        SET_DECL_RTL (label, gen_label_rtx ());
    
      return DECL_RTL (label);
    }
    
    So we have usage of the RTL label in two code sequences and the
    CODE_LABEL (29) only definitio in sibling call.  Here the code for
    sibling code:
    
    (note 11 0 13 0x20000000006e6c80 NOTE_INSN_BLOCK_BEG)
    
    (insn 13 11 14 (set (reg:SI 343)
            (const_int 1 [0x1])) -1 (nil)
        (expr_list:REG_EQUAL (const_int 1 [0x1])
            (nil)))
    
    (insn 14 13 15 (set (mem/f:SI (addressof:DI (reg/v:SI 342) 341 0x20000000006edfb0) [2 x+0 S4 A32])
            (reg:SI 343)) -1 (nil)
        (nil))
    
    (note 15 14 16 NOTE_INSN_DELETED)
    
    (note 16 15 18 NOTE_INSN_DELETED)
    
    (insn 18 16 20 (set (reg:DI 120 out0)
            (addressof:DI (reg/v:SI 342) 341 0x20000000006edfb0)) -1 (nil)
        (nil))
    
    (insn 20 18 21 (set (reg:DI 345)
            (reg:DI 1 r1)) -1 (nil)
        (nil))
    
    (call_insn 21 20 23 (parallel[ 
                (set (reg:SI 8 r8)
                    (call (mem:DI (symbol_ref/v:DI ("nothing")) [0 S8 A64])
                        (const_int 1 [0x1])))
                (use (unspec[ 
                            (reg:DI 1 r1)
                        ]  9))
                (clobber (reg:DI 320 b0))
            ] ) -1 (nil)
        (nil)
        (expr_list (use (reg:DI 120 out0))
            (nil)))
    
    (insn 23 21 24 (set (reg:DI 1 r1)
            (reg:DI 345)) -1 (nil)
        (nil))
    
    (insn 24 23 25 (set (reg:DI 346)
            (plus:DI (reg:DI 1 r1)
                (symbol_ref/v:DI ("fi")))) -1 (nil)
        (nil))
    
    (insn 25 24 26 (set (reg/v/f:DI 344)
            (mem/u:DI (reg:DI 346) [0 S8 A64])) -1 (nil)
        (nil))
    
    (jump_insn 26 25 27 (set (pc)
            (label_ref 29)) -1 (nil)
        (nil))
    
    (barrier 27 26 28)
    
    (note 28 27 29 0x20000000006e6c80 NOTE_INSN_BLOCK_END)
    
    (code_label 29 28 31 2 "" "" [0 uses])
    
    ^^^^^^^^^^^^^^^^^^^
    
    (insn 31 29 33 (set (reg:SI 120 out0)
            (const_int 2 [0x2])) -1 (nil)
        (nil))
    
    (insn 33 31 35 (set (reg:DI 345)
            (reg:DI 1 r1)) -1 (nil)
        (nil))
    
    (insn 35 33 37 (set (reg:DI 347)
            (mem:DI (reg/v/f:DI 344) [0 S8 A64])) -1 (nil)
        (nil))
    
    (insn 37 35 38 (set (reg:DI 348)
            (reg/v/f:DI 344)) -1 (nil)
        (nil))
    
    (insn 38 37 40 (set (reg/f:DI 349)
            (plus:DI (reg/v/f:DI 344)
                (const_int 8 [0x8]))) -1 (nil)
        (nil))
    
    (insn 40 38 41 (set (reg:DI 1 r1)
            (mem:DI (reg/f:DI 349) [0 S8 A64])) -1 (nil)
        (nil))
    
    (call_insn 41 40 43 (parallel[ 
                (set (reg:SI 8 r8)
                    (call (mem:DI (reg:DI 347) [0 S8 A64])
                        (const_int 1 [0x1])))
                (use (unspec[ 
                            (reg:DI 1 r1)
                        ]  9))
                (clobber (reg:DI 320 b0))
            ] ) -1 (nil)
        (nil)
        (expr_list (use (reg:SI 120 out0))
            (nil)))
    
    (insn 43 41 45 (set (reg:DI 1 r1)
            (reg:DI 345)) -1 (nil)
        (nil))
    
    (insn 45 43 0 (set (reg:SI 350)
            (reg:SI 8 r8)) -1 (nil)
        (nil))
    
      Here the code for normal call is:
    
    
    (note 50 0 52 0x20000000006e6c80 NOTE_INSN_BLOCK_BEG)
    
    (insn 52 50 53 (set (reg:SI 351)
            (const_int 1 [0x1])) -1 (nil)
        (expr_list:REG_EQUAL (const_int 1 [0x1])
            (nil)))
    
    (insn 53 52 54 (set (mem/f:SI (addressof:DI (reg/v:SI 342) 341 0x20000000006edfb0) [2 x+0 S4 A32])
            (reg:SI 351)) -1 (nil)
        (nil))
    
    (note 54 53 55 NOTE_INSN_DELETED)
    
    (note 55 54 57 NOTE_INSN_DELETED)
    
    (insn 57 55 59 (set (reg:DI 120 out0)
            (addressof:DI (reg/v:SI 342) 341 0x20000000006edfb0)) -1 (nil)
        (nil))
    
    (insn 59 57 60 (set (reg:DI 345)
            (reg:DI 1 r1)) -1 (nil)
        (nil))
    
    (call_insn 60 59 62 (parallel[ 
                (set (reg:SI 8 r8)
                    (call (mem:DI (symbol_ref/v:DI ("nothing")) [0 S8 A64])
                        (const_int 1 [0x1])))
                (use (unspec[ 
                            (reg:DI 1 r1)
                        ]  9))
                (clobber (reg:DI 320 b0))
            ] ) -1 (nil)
        (nil)
        (expr_list (use (reg:DI 120 out0))
            (nil)))
    
    (insn 62 60 63 (set (reg:DI 1 r1)
            (reg:DI 345)) -1 (nil)
        (nil))
    
    (insn 63 62 64 (set (reg:DI 352)
            (plus:DI (reg:DI 1 r1)
                (symbol_ref/v:DI ("fi")))) -1 (nil)
        (nil))
    
    (insn 64 63 65 (set (reg/v/f:DI 344)
            (mem/u:DI (reg:DI 352) [0 S8 A64])) -1 (nil)
        (nil))
    
    (jump_insn 65 64 66 (set (pc)
            (label_ref 29)) -1 (nil)
        (nil))
    
    ^^^^^^^^^^^^^^^^^^^^  There is no corresponding label_code.
    
    (barrier 66 65 67)
    
    (note 67 66 69 0x20000000006e6c80 NOTE_INSN_BLOCK_END)
    
    (insn 69 67 71 (set (reg:SI 120 out0)
            (const_int 2 [0x2])) -1 (nil)
        (nil))
    
    (insn 71 69 73 (set (reg:DI 345)
            (reg:DI 1 r1)) -1 (nil)
        (nil))
    
    (insn 73 71 75 (set (reg:DI 353)
            (mem:DI (reg/v/f:DI 344) [0 S8 A64])) -1 (nil)
        (nil))
    
    (insn 75 73 76 (set (reg:DI 354)
            (reg/v/f:DI 344)) -1 (nil)
        (nil))
    
    (insn 76 75 78 (set (reg/f:DI 355)
            (plus:DI (reg/v/f:DI 344)
                (const_int 8 [0x8]))) -1 (nil)
        (nil))
    
    (insn 78 76 79 (set (reg:DI 1 r1)
            (mem:DI (reg/f:DI 355) [0 S8 A64])) -1 (nil)
        (nil))
    
    (call_insn 79 78 81 (parallel[ 
                (set (reg:SI 8 r8)
                    (call (mem:DI (reg:DI 353) [0 S8 A64])
                        (const_int 1 [0x1])))
                (use (unspec[ 
                            (reg:DI 1 r1)
                        ]  9))
                (clobber (reg:DI 320 b0))
            ] ) -1 (nil)
        (nil)
        (expr_list (use (reg:SI 120 out0))
            (nil)))
    
    (insn 81 79 83 (set (reg:DI 1 r1)
            (reg:DI 345)) -1 (nil)
        (nil))
    
    (insn 83 81 0 (set (reg:SI 356)
            (reg:SI 8 r8)) -1 (nil)
        (nil))
    
    
      After that the normal call code is choosen in sibling optimization
    and the compiler crashes in cfg.c
    
    Program received signal SIGSEGV, Segmentation fault.
    cached_make_edge (edge_cache=0x0, src=0x600000000010a670, dst=0x0, flags=0)
        at /home/vmakarov/build/gcc-31-branch/gcc/gcc/cfg.c:307
    

http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=6875


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]