http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56858
--- Comment #12 from Uros Bizjak <ubizjak at gmail dot com> 2013-04-21 21:15:50 UTC --- Created attachment 29911 --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=29911 Patch that introduces trap_shadows pass after eh_ranges 2013-04-18 Uros Bizjak <ubiz...@gmail.com> PR target/56858 * config/alpha/alpha.c: Include tree-pass.h. (gate_handle_trap_shadows): New static function. (rest_of_handle_trap_shadows): Ditto. (pass_handle_trap_shadows): New rtl_opt_pass structure. (alpha_option_override): Register trap_shadows pass after eh_ranges pass. (alpha_reorg): Do not call alpha_handle_trap_shadows here. Attached patch adds trap_shadows handling pass after eh_ranges pass. The patch was bootstrapped (configured with --host=alpha-linux-gnu --build=alpha-linux-gnu --target=alpha-linux-gnu to make the pass effective). The patch uncovered one issue with g++.dg/torture/stackalign/eh-vararg-1.C: eh_ranges pass iserts a note between the call and its CALL_ARG_LOCATION note: (call_insn:TI 175 238 243 (parallel [ (call (mem:DI (reg:DI 27 $27) [0 S8 A64]) (const_int 0 [0])) (use (reg:DI 29 $29)) (use (symbol_ref:DI ("__cxa_throw") [flags 0x41] <function_decl 0x200068f6300 __cxa_throw>)) (use (const_int 14 [0xe])) (clobber (reg:DI 26 $26)) ]) eh-vararg-1.C:62 211 {*call_osf_2_er_nogp} (expr_list:REG_DEAD (reg:DI 29 $29) (expr_list:REG_DEAD (reg:DI 27 $27) (expr_list:REG_DEAD (reg:DI 18 $18) (expr_list:REG_DEAD (reg:DI 17 $17) (expr_list:REG_DEAD (reg:DI 16 $16) (expr_list:REG_EH_REGION (const_int 1 [0x1]) (expr_list:REG_NORETURN (const_int 0 [0]) (nil)))))))) (expr_list:REG_CC_SETTER (use (reg:DI 18 $18)) (expr_list:REG_CC_SETTER (use (reg:DI 17 $17)) (expr_list:REG_CC_SETTER (use (reg:DI 16 $16)) (nil))))) (note:TI 240 243 222 0 NOTE_INSN_EH_REGION_END) (note 222 240 234 (expr_list:REG_DEP_TRUE (concat:DI (pc) (unspec:DI [ (reg:DI 29 $29) (symbol_ref:DI ("__cxa_throw") [flags 0x41] <function_decl 0x200068f6300 __cxa_throw>) (const_int 14 [0xe]) ] UNSPEC_LITERAL)) (expr_list:REG_DEP_TRUE (concat:DI (reg:DI 18 $18) (const_int 0 [0])) (expr_list:REG_DEP_TRUE (concat:DI (reg:DI 17 $17) (unspec:DI [ (reg:DI 29 $29) (symbol_ref/i:DI ("_ZTI1A") <var_decl 0x200067c1b50 _ZTI1A>) (const_int 0 [0]) ] UNSPEC_LITERAL)) (nil)))) NOTE_INSN_CALL_ARG_LOCATION) (insn 234 222 119 (const_int 2 [0x2]) 294 {unop} (nil)) The new trap_shadows pass inserts (insn:TI 243 175 240 (unspec_volatile [ (const_int 0 [0]) ] UNSPECV_TRAPB) -1 (nil)) just above NOTE_INSN_EH_REGION_END note, and this breaks compilation (-O2 -g) in: /home/uros/gcc-svn/trunk/gcc/testsuite/g++.dg/torture/stackalign/eh-vararg-1.C:65:1: internal compiler error: in dwarf2out_var_location, at dwarf2out.c:20838^M 0x120537c6b dwarf2out_var_location^M ../../gcc-svn/trunk/gcc/dwarf2out.c:20834^M 0x1205dd753 final_scan_insn(rtx_def*, _IO_FILE*, int, int, int*)^M ../../gcc-svn/trunk/gcc/final.c:2276^M 0x1205deb37 final(rtx_def*, _IO_FILE*, int)^M ../../gcc-svn/trunk/gcc/final.c:1957^M 0x1205df0fb rest_of_handle_final^M ../../gcc-svn/trunk/gcc/final.c:4332^M Please submit a full bug report,^M 20829 = ggc_alloc_cleared_call_arg_loc_node (); 20830 rtx prev = prev_real_insn (loc_note), x; 20831 ca_loc->call_arg_loc_note = loc_note; 20832 ca_loc->next = NULL; 20833 ca_loc->label = last_label; 20834 gcc_assert (prev 20835 && (CALL_P (prev) 20836 || (NONJUMP_INSN_P (prev) 20837 && GET_CODE (PATTERN (prev)) == SEQUENCE 20838 && CALL_P (XVECEXP (PATTERN (prev), 0, 0))))); Steven, is it possible to emit NOTE_INSN_EH_REGION_END in such way that it would not split the call and its NOTE_INSN_CALL_ARG_LOCATION? This would solve the above problem in the most elegant way.