The attached patch to gcse.c merely strengthens various things from rtx to rtx_insn *, and thus falls under the pre-approval granted by Jeff here: https://gcc.gnu.org/ml/gcc-patches/2014-08/msg01310.html
Bootstrapped on x86_64-unknown-linux-gnu (Fedora 20), and has been rebuilt as part of a config-list.mk build for all working configurations (albeit with other patches for the latter case). Committed to trunk as r215027
Index: gcc/ChangeLog =================================================================== --- gcc/ChangeLog (revision 215026) +++ gcc/ChangeLog (revision 215027) @@ -1,3 +1,15 @@ +2014-09-08 David Malcolm <dmalc...@redhat.com> + + * gcse.c (modify_mem_list): Strengthen this variable from + vec<rtx> * to vec<rtx_insn *> *. + (vec_rtx_heap): Strengthen this typedef from vec<rtx> to + vec<rtx_insn *>. + (load_killed_in_block_p): Strengthen local "list" from vec<rtx> to + vec<rtx_insn *>, and local "setter" from rtx to rtx_insn *. + (record_last_mem_set_info): Strengthen param "insn" from rtx to + rtx_insn *. + (record_last_set_info): Likewise for local "last_set_insn". + 2014-09-08 DJ Delorie <d...@redhat.com> * doc/invoke.texi (MSP430 Options): Add -minrt. Index: gcc/gcse.c =================================================================== --- gcc/gcse.c (revision 215026) +++ gcc/gcse.c (revision 215027) @@ -395,7 +395,7 @@ /* Array, indexed by basic block number for a list of insns which modify memory within that block. */ -static vec<rtx> *modify_mem_list; +static vec<rtx_insn *> *modify_mem_list; static bitmap modify_mem_list_set; typedef struct modify_pair_s @@ -474,7 +474,7 @@ int, struct hash_table_d *); static unsigned int hash_expr (const_rtx, enum machine_mode, int *, int); static void record_last_reg_set_info (rtx, int); -static void record_last_mem_set_info (rtx); +static void record_last_mem_set_info (rtx_insn *); static void record_last_set_info (rtx, const_rtx, void *); static void compute_hash_table (struct hash_table_d *); static void alloc_hash_table (struct hash_table_d *); @@ -631,7 +631,7 @@ /* Allocate array to keep a list of insns which modify memory in each basic block. The two typedefs are needed to work around the pre-processor limitation with template types in macro arguments. */ - typedef vec<rtx> vec_rtx_heap; + typedef vec<rtx_insn *> vec_rtx_heap; typedef vec<modify_pair> vec_modify_pair_heap; modify_mem_list = GCNEWVEC (vec_rtx_heap, last_basic_block_for_fn (cfun)); canon_modify_mem_list = GCNEWVEC (vec_modify_pair_heap, @@ -1031,8 +1031,8 @@ load_killed_in_block_p (const_basic_block bb, int uid_limit, const_rtx x, int avail_p) { - vec<rtx> list = modify_mem_list[bb->index]; - rtx setter; + vec<rtx_insn *> list = modify_mem_list[bb->index]; + rtx_insn *setter; unsigned ix; /* If this is a readonly then we aren't going to be changing it. */ @@ -1502,7 +1502,7 @@ a CALL_INSN). We merely need to record which insns modify memory. */ static void -record_last_mem_set_info (rtx insn) +record_last_mem_set_info (rtx_insn *insn) { int bb; @@ -1528,7 +1528,7 @@ static void record_last_set_info (rtx dest, const_rtx setter ATTRIBUTE_UNUSED, void *data) { - rtx last_set_insn = (rtx) data; + rtx_insn *last_set_insn = (rtx_insn *) data; if (GET_CODE (dest) == SUBREG) dest = SUBREG_REG (dest);