Mercurial > hg > CbC > CbC_gcc
annotate gcc/init-regs.c @ 131:84e7813d76e9
gcc-8.2
author | mir3636 |
---|---|
date | Thu, 25 Oct 2018 07:37:49 +0900 |
parents | 04ced10e8804 |
children | 1830386684a0 |
rev | line source |
---|---|
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1 /* Initialization of uninitialized regs. |
131 | 2 Copyright (C) 2007-2018 Free Software Foundation, Inc. |
0 | 3 |
4 This file is part of GCC. | |
5 | |
6 GCC is free software; you can redistribute it and/or modify it under | |
7 the terms of the GNU General Public License as published by the Free | |
8 Software Foundation; either version 3, or (at your option) any later | |
9 version. | |
10 | |
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY | |
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
14 for more details. | |
15 | |
16 You should have received a copy of the GNU General Public License | |
17 along with GCC; see the file COPYING3. If not see | |
18 <http://www.gnu.org/licenses/>. */ | |
19 | |
20 #include "config.h" | |
21 #include "system.h" | |
22 #include "coretypes.h" | |
111 | 23 #include "backend.h" |
24 #include "rtl.h" | |
0 | 25 #include "tree.h" |
111 | 26 #include "df.h" |
27 #include "memmodel.h" | |
28 #include "emit-rtl.h" | |
0 | 29 #include "expr.h" |
30 #include "tree-pass.h" | |
31 | |
32 /* Check all of the uses of pseudo variables. If any use that is MUST | |
33 uninitialized, add a store of 0 immediately before it. For | |
34 subregs, this makes combine happy. For full word regs, this makes | |
35 other optimizations, like the register allocator and the reg-stack | |
36 happy as well as papers over some problems on the arm and other | |
37 processors where certain isa constraints cannot be handled by gcc. | |
38 These are of the form where two operands to an insn my not be the | |
39 same. The ra will only make them the same if they do not | |
40 interfere, and this can only happen if one is not initialized. | |
41 | |
42 There is also the unfortunate consequence that this may mask some | |
43 buggy programs where people forget to initialize stack variable. | |
44 Any programmer with half a brain would look at the uninitialized | |
45 variable warnings. */ | |
46 | |
47 static void | |
48 initialize_uninitialized_regs (void) | |
49 { | |
50 basic_block bb; | |
111 | 51 auto_bitmap already_genned; |
0 | 52 |
53 if (optimize == 1) | |
54 { | |
55 df_live_add_problem (); | |
56 df_live_set_all_dirty (); | |
57 } | |
58 | |
59 df_analyze (); | |
60 | |
111 | 61 FOR_EACH_BB_FN (bb, cfun) |
0 | 62 { |
111 | 63 rtx_insn *insn; |
0 | 64 bitmap lr = DF_LR_IN (bb); |
65 bitmap ur = DF_LIVE_IN (bb); | |
66 bitmap_clear (already_genned); | |
67 | |
68 FOR_BB_INSNS (bb, insn) | |
69 { | |
111 | 70 df_ref use; |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
71 if (!NONDEBUG_INSN_P (insn)) |
0 | 72 continue; |
73 | |
111 | 74 FOR_EACH_INSN_USE (use, insn) |
0 | 75 { |
76 unsigned int regno = DF_REF_REGNO (use); | |
77 | |
78 /* Only do this for the pseudos. */ | |
79 if (regno < FIRST_PSEUDO_REGISTER) | |
80 continue; | |
81 | |
111 | 82 /* Ignore pseudo PIC register. */ |
83 if (pic_offset_table_rtx | |
84 && regno == REGNO (pic_offset_table_rtx)) | |
85 continue; | |
86 | |
0 | 87 /* Do not generate multiple moves for the same regno. |
88 This is common for sequences of subreg operations. | |
89 They would be deleted during combine but there is no | |
90 reason to churn the system. */ | |
91 if (bitmap_bit_p (already_genned, regno)) | |
92 continue; | |
93 | |
94 /* A use is MUST uninitialized if it reaches the top of | |
95 the block from the inside of the block (the lr test) | |
96 and no def for it reaches the top of the block from | |
97 outside of the block (the ur test). */ | |
98 if (bitmap_bit_p (lr, regno) | |
99 && (!bitmap_bit_p (ur, regno))) | |
100 { | |
111 | 101 rtx_insn *move_insn; |
0 | 102 rtx reg = DF_REF_REAL_REG (use); |
103 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
104 bitmap_set_bit (already_genned, regno); |
0 | 105 |
106 start_sequence (); | |
111 | 107 emit_clobber (reg); |
0 | 108 emit_move_insn (reg, CONST0_RTX (GET_MODE (reg))); |
109 move_insn = get_insns (); | |
110 end_sequence (); | |
111 emit_insn_before (move_insn, insn); | |
112 if (dump_file) | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
113 fprintf (dump_file, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
114 "adding initialization in %s of reg %d at in block %d for insn %d.\n", |
111 | 115 current_function_name (), regno, bb->index, |
116 INSN_UID (insn)); | |
0 | 117 } |
118 } | |
119 } | |
120 } | |
121 | |
122 if (optimize == 1) | |
123 { | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
124 if (dump_file) |
0 | 125 df_dump (dump_file); |
126 df_remove_problem (df_live); | |
127 } | |
128 } | |
129 | |
111 | 130 namespace { |
131 | |
132 const pass_data pass_data_initialize_regs = | |
133 { | |
134 RTL_PASS, /* type */ | |
135 "init-regs", /* name */ | |
136 OPTGROUP_NONE, /* optinfo_flags */ | |
137 TV_NONE, /* tv_id */ | |
138 0, /* properties_required */ | |
139 0, /* properties_provided */ | |
140 0, /* properties_destroyed */ | |
141 0, /* todo_flags_start */ | |
142 TODO_df_finish, /* todo_flags_finish */ | |
143 }; | |
144 | |
145 class pass_initialize_regs : public rtl_opt_pass | |
0 | 146 { |
111 | 147 public: |
148 pass_initialize_regs (gcc::context *ctxt) | |
149 : rtl_opt_pass (pass_data_initialize_regs, ctxt) | |
150 {} | |
151 | |
152 /* opt_pass methods: */ | |
153 virtual bool gate (function *) { return optimize > 0; } | |
154 virtual unsigned int execute (function *) | |
155 { | |
156 initialize_uninitialized_regs (); | |
157 return 0; | |
158 } | |
159 | |
160 }; // class pass_initialize_regs | |
161 | |
162 } // anon namespace | |
163 | |
164 rtl_opt_pass * | |
165 make_pass_initialize_regs (gcc::context *ctxt) | |
166 { | |
167 return new pass_initialize_regs (ctxt); | |
168 } |