Merge lp:~eres/gcc-linaro/sms_doloop_for_ARM_new_version-4_6 into lp:gcc-linaro/4.6
- sms_doloop_for_ARM_new_version-4_6
- Merge into 4.6
Status: | Merged |
---|---|
Approved by: | Richard Sandiford |
Approved revision: | no longer in the source branch. |
Merged at revision: | 106747 |
Proposed branch: | lp:~eres/gcc-linaro/sms_doloop_for_ARM_new_version-4_6 |
Merge into: | lp:gcc-linaro/4.6 |
Diff against target: |
647 lines (+303/-75) 8 files modified
ChangeLog.linaro (+30/-0) gcc/config/arm/arm.md (+1/-1) gcc/config/arm/thumb2.md (+52/-1) gcc/ddg.c (+5/-0) gcc/doc/invoke.texi (+4/-0) gcc/loop-doloop.c (+67/-7) gcc/modulo-sched.c (+139/-66) gcc/params.def (+5/-0) |
To merge this branch: | bzr merge lp:~eres/gcc-linaro/sms_doloop_for_ARM_new_version-4_6 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Linaro Toolchain Developers | Pending | ||
Review via email:
|
This proposal supersedes a proposal from 2011-05-11.
Commit message
Description of the change
Implement doloop pattern for ARM and support it in SMS.
The change consists of these patches that sent upstream:
1) Doloop pattern for ARM:
http://
2) Support closing_
http://
3) New flag to apply SMS when SC equals 1
http://

Linaro Toolchain Builder (cbuild) wrote : | # |

Linaro Toolchain Builder (cbuild) wrote : | # |
cbuild successfully built this on armv7l-
The build results are available at:
http://
The test suite results changed compared to the branch point lp:gcc-linaro/4.6+bzr106744:
+PASS: gcc.c-torture/
+PASS: gcc.c-torture/
+PASS: gcc.c-torture/
+PASS: gcc.c-torture/
+PASS: gcc.c-torture/
+PASS: gcc.c-torture/
+PASS: gcc.c-torture/
+PASS: gcc.c-torture/
+PASS: gcc.c-torture/
The full testsuite results are at:
http://
cbuild-checked: armv7l-

Linaro Toolchain Builder (cbuild) wrote : | # |
cbuild successfully built this on i686-lucid-
The build results are available at:
http://
The test suite results were unchanged compared to the branch point lp:gcc-linaro/4.6+bzr106744.
The full testsuite results are at:
http://
cbuild-checked: i686-lucid-

Richard Sandiford (rsandifo) wrote : | # |
OK.
Preview Diff
1 | === modified file 'ChangeLog.linaro' | |||
2 | --- ChangeLog.linaro 2011-05-06 11:33:02 +0000 | |||
3 | +++ ChangeLog.linaro 2011-05-11 10:02:07 +0000 | |||
4 | @@ -1,3 +1,33 @@ | |||
5 | 1 | 2011-05-11 Revital Eres <revital.eres@linaro.org> | ||
6 | 2 | |||
7 | 3 | gcc/ | ||
8 | 4 | * loop-doloop.c (doloop_condition_get): Support new form of | ||
9 | 5 | doloop pattern and use prev_nondebug_insn instead of PREV_INSN. | ||
10 | 6 | * config/arm/thumb2.md (*thumb2_addsi3_compare0): Remove "*". | ||
11 | 7 | (doloop_end): New. | ||
12 | 8 | * config/arm/arm.md (*addsi3_compare0): Remove "*". | ||
13 | 9 | * params.def (sms-min-sc): New param flag. | ||
14 | 10 | * doc/invoke.texi (sms-min-sc): Document it. | ||
15 | 11 | * ddg.c (create_ddg_dep_from_intra_loop_link): If a true dep edge | ||
16 | 12 | enters the branch create an anti edge in the opposite direction | ||
17 | 13 | to prevent the creation of reg-moves. | ||
18 | 14 | * modulo-sched.c: Adjust comment to reflect the fact we are | ||
19 | 15 | scheduling closing branch. | ||
20 | 16 | (PS_STAGE_COUNT): Rename to CALC_STAGE_COUNT and redefine. | ||
21 | 17 | (stage_count): New field in struct partial_schedule. | ||
22 | 18 | (calculate_stage_count): New function. | ||
23 | 19 | (normalize_sched_times): Rename to reset_sched_times and handle | ||
24 | 20 | incrementing the sched time of the nodes by a constant value | ||
25 | 21 | passed as parameter. | ||
26 | 22 | (duplicate_insns_of_cycles): Skip closing branch. | ||
27 | 23 | (sms_schedule_by_order): Schedule closing branch. | ||
28 | 24 | (ps_insn_find_column): Handle closing branch. | ||
29 | 25 | (sms_schedule): Call reset_sched_times and adjust the code to | ||
30 | 26 | support scheduling of the closing branch. Use sms-min-sc. | ||
31 | 27 | Support new form of doloop pattern. | ||
32 | 28 | (ps_insert_empty_row): Update calls to normalize_sched_times | ||
33 | 29 | and rotate_partial_schedule functions. | ||
34 | 30 | |||
35 | 1 | 2011-05-06 Richard Sandiford <richard.sandiford@linaro.org> | 31 | 2011-05-06 Richard Sandiford <richard.sandiford@linaro.org> |
36 | 2 | 32 | ||
37 | 3 | gcc/ | 33 | gcc/ |
38 | 4 | 34 | ||
39 | === modified file 'gcc/config/arm/arm.md' | |||
40 | --- gcc/config/arm/arm.md 2011-04-13 14:06:16 +0000 | |||
41 | +++ gcc/config/arm/arm.md 2011-05-11 10:02:07 +0000 | |||
42 | @@ -791,7 +791,7 @@ | |||
43 | 791 | "" | 791 | "" |
44 | 792 | ) | 792 | ) |
45 | 793 | 793 | ||
47 | 794 | (define_insn "*addsi3_compare0" | 794 | (define_insn "addsi3_compare0" |
48 | 795 | [(set (reg:CC_NOOV CC_REGNUM) | 795 | [(set (reg:CC_NOOV CC_REGNUM) |
49 | 796 | (compare:CC_NOOV | 796 | (compare:CC_NOOV |
50 | 797 | (plus:SI (match_operand:SI 1 "s_register_operand" "r, r") | 797 | (plus:SI (match_operand:SI 1 "s_register_operand" "r, r") |
51 | 798 | 798 | ||
52 | === modified file 'gcc/config/arm/thumb2.md' | |||
53 | --- gcc/config/arm/thumb2.md 2011-01-03 20:52:22 +0000 | |||
54 | +++ gcc/config/arm/thumb2.md 2011-05-11 10:02:07 +0000 | |||
55 | @@ -836,7 +836,7 @@ | |||
56 | 836 | "operands[4] = GEN_INT (- INTVAL (operands[2]));" | 836 | "operands[4] = GEN_INT (- INTVAL (operands[2]));" |
57 | 837 | ) | 837 | ) |
58 | 838 | 838 | ||
60 | 839 | (define_insn "*thumb2_addsi3_compare0" | 839 | (define_insn "thumb2_addsi3_compare0" |
61 | 840 | [(set (reg:CC_NOOV CC_REGNUM) | 840 | [(set (reg:CC_NOOV CC_REGNUM) |
62 | 841 | (compare:CC_NOOV | 841 | (compare:CC_NOOV |
63 | 842 | (plus:SI (match_operand:SI 1 "s_register_operand" "l, 0, r") | 842 | (plus:SI (match_operand:SI 1 "s_register_operand" "l, 0, r") |
64 | @@ -1118,3 +1118,54 @@ | |||
65 | 1118 | " | 1118 | " |
66 | 1119 | operands[2] = GEN_INT (32 - INTVAL (operands[2])); | 1119 | operands[2] = GEN_INT (32 - INTVAL (operands[2])); |
67 | 1120 | ") | 1120 | ") |
68 | 1121 | |||
69 | 1122 | ;; Define the subtract-one-and-jump insns so loop.c | ||
70 | 1123 | ;; knows what to generate. | ||
71 | 1124 | (define_expand "doloop_end" | ||
72 | 1125 | [(use (match_operand 0 "" "")) ; loop pseudo | ||
73 | 1126 | (use (match_operand 1 "" "")) ; iterations; zero if unknown | ||
74 | 1127 | (use (match_operand 2 "" "")) ; max iterations | ||
75 | 1128 | (use (match_operand 3 "" "")) ; loop level | ||
76 | 1129 | (use (match_operand 4 "" ""))] ; label | ||
77 | 1130 | "TARGET_32BIT" | ||
78 | 1131 | " | ||
79 | 1132 | { | ||
80 | 1133 | /* Currently SMS relies on the do-loop pattern to recognize loops | ||
81 | 1134 | where (1) the control part consists of all insns defining and/or | ||
82 | 1135 | using a certain 'count' register and (2) the loop count can be | ||
83 | 1136 | adjusted by modifying this register prior to the loop. | ||
84 | 1137 | ??? The possible introduction of a new block to initialize the | ||
85 | 1138 | new IV can potentially affect branch optimizations. */ | ||
86 | 1139 | if (optimize > 0 && flag_modulo_sched) | ||
87 | 1140 | { | ||
88 | 1141 | rtx s0; | ||
89 | 1142 | rtx bcomp; | ||
90 | 1143 | rtx loc_ref; | ||
91 | 1144 | rtx cc_reg; | ||
92 | 1145 | rtx insn; | ||
93 | 1146 | rtx cmp; | ||
94 | 1147 | |||
95 | 1148 | /* Only use this on innermost loops. */ | ||
96 | 1149 | if (INTVAL (operands[3]) > 1) | ||
97 | 1150 | FAIL; | ||
98 | 1151 | if (GET_MODE (operands[0]) != SImode) | ||
99 | 1152 | FAIL; | ||
100 | 1153 | |||
101 | 1154 | s0 = operands [0]; | ||
102 | 1155 | if (TARGET_THUMB2) | ||
103 | 1156 | insn = emit_insn (gen_thumb2_addsi3_compare0 (s0, s0, GEN_INT (-1))); | ||
104 | 1157 | else | ||
105 | 1158 | insn = emit_insn (gen_addsi3_compare0 (s0, s0, GEN_INT (-1))); | ||
106 | 1159 | |||
107 | 1160 | cmp = XVECEXP (PATTERN (insn), 0, 0); | ||
108 | 1161 | cc_reg = SET_DEST (cmp); | ||
109 | 1162 | bcomp = gen_rtx_NE (VOIDmode, cc_reg, const0_rtx); | ||
110 | 1163 | loc_ref = gen_rtx_LABEL_REF (VOIDmode, operands [4]); | ||
111 | 1164 | emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, | ||
112 | 1165 | gen_rtx_IF_THEN_ELSE (VOIDmode, bcomp, | ||
113 | 1166 | loc_ref, pc_rtx))); | ||
114 | 1167 | DONE; | ||
115 | 1168 | }else | ||
116 | 1169 | FAIL; | ||
117 | 1170 | }") | ||
118 | 1171 | |||
119 | 1121 | 1172 | ||
120 | === modified file 'gcc/ddg.c' | |||
121 | --- gcc/ddg.c 2010-11-30 11:41:24 +0000 | |||
122 | +++ gcc/ddg.c 2011-05-11 10:02:07 +0000 | |||
123 | @@ -197,6 +197,11 @@ | |||
124 | 197 | } | 197 | } |
125 | 198 | } | 198 | } |
126 | 199 | 199 | ||
127 | 200 | /* If a true dep edge enters the branch create an anti edge in the | ||
128 | 201 | opposite direction to prevent the creation of reg-moves. */ | ||
129 | 202 | if ((DEP_TYPE (link) == REG_DEP_TRUE) && JUMP_P (dest_node->insn)) | ||
130 | 203 | create_ddg_dep_no_link (g, dest_node, src_node, ANTI_DEP, REG_DEP, 1); | ||
131 | 204 | |||
132 | 200 | latency = dep_cost (link); | 205 | latency = dep_cost (link); |
133 | 201 | e = create_ddg_edge (src_node, dest_node, t, dt, latency, distance); | 206 | e = create_ddg_edge (src_node, dest_node, t, dt, latency, distance); |
134 | 202 | add_edge_to_ddg (g, e); | 207 | add_edge_to_ddg (g, e); |
135 | 203 | 208 | ||
136 | === modified file 'gcc/doc/invoke.texi' | |||
137 | --- gcc/doc/invoke.texi 2011-04-18 11:31:29 +0000 | |||
138 | +++ gcc/doc/invoke.texi 2011-05-11 10:02:07 +0000 | |||
139 | @@ -8730,6 +8730,10 @@ | |||
140 | 8730 | The maximum number of best instructions in the ready list that are considered | 8730 | The maximum number of best instructions in the ready list that are considered |
141 | 8731 | for renaming in the selective scheduler. The default value is 2. | 8731 | for renaming in the selective scheduler. The default value is 2. |
142 | 8732 | 8732 | ||
143 | 8733 | @item sms-min-sc | ||
144 | 8734 | The minimum value of stage count that swing modulo scheduler will | ||
145 | 8735 | generate. The default value is 2. | ||
146 | 8736 | |||
147 | 8733 | @item max-last-value-rtl | 8737 | @item max-last-value-rtl |
148 | 8734 | The maximum size measured as number of RTLs that can be recorded in an expression | 8738 | The maximum size measured as number of RTLs that can be recorded in an expression |
149 | 8735 | in combiner for a pseudo register as last known value of that register. The default | 8739 | in combiner for a pseudo register as last known value of that register. The default |
150 | 8736 | 8740 | ||
151 | === modified file 'gcc/loop-doloop.c' | |||
152 | --- gcc/loop-doloop.c 2010-11-30 11:41:24 +0000 | |||
153 | +++ gcc/loop-doloop.c 2011-05-11 10:02:07 +0000 | |||
154 | @@ -78,6 +78,8 @@ | |||
155 | 78 | rtx inc_src; | 78 | rtx inc_src; |
156 | 79 | rtx condition; | 79 | rtx condition; |
157 | 80 | rtx pattern; | 80 | rtx pattern; |
158 | 81 | rtx cc_reg = NULL_RTX; | ||
159 | 82 | rtx reg_orig = NULL_RTX; | ||
160 | 81 | 83 | ||
161 | 82 | /* The canonical doloop pattern we expect has one of the following | 84 | /* The canonical doloop pattern we expect has one of the following |
162 | 83 | forms: | 85 | forms: |
163 | @@ -96,7 +98,16 @@ | |||
164 | 96 | 2) (set (reg) (plus (reg) (const_int -1)) | 98 | 2) (set (reg) (plus (reg) (const_int -1)) |
165 | 97 | (set (pc) (if_then_else (reg != 0) | 99 | (set (pc) (if_then_else (reg != 0) |
166 | 98 | (label_ref (label)) | 100 | (label_ref (label)) |
168 | 99 | (pc))). */ | 101 | (pc))). |
169 | 102 | |||
170 | 103 | Some targets (ARM) do the comparison before the branch, as in the | ||
171 | 104 | following form: | ||
172 | 105 | |||
173 | 106 | 3) (parallel [(set (cc) (compare ((plus (reg) (const_int -1), 0))) | ||
174 | 107 | (set (reg) (plus (reg) (const_int -1)))]) | ||
175 | 108 | (set (pc) (if_then_else (cc == NE) | ||
176 | 109 | (label_ref (label)) | ||
177 | 110 | (pc))) */ | ||
178 | 100 | 111 | ||
179 | 101 | pattern = PATTERN (doloop_pat); | 112 | pattern = PATTERN (doloop_pat); |
180 | 102 | 113 | ||
181 | @@ -104,19 +115,47 @@ | |||
182 | 104 | { | 115 | { |
183 | 105 | rtx cond; | 116 | rtx cond; |
184 | 106 | rtx prev_insn = prev_nondebug_insn (doloop_pat); | 117 | rtx prev_insn = prev_nondebug_insn (doloop_pat); |
185 | 118 | rtx cmp_arg1, cmp_arg2; | ||
186 | 119 | rtx cmp_orig; | ||
187 | 107 | 120 | ||
189 | 108 | /* We expect the decrement to immediately precede the branch. */ | 121 | /* In case the pattern is not PARALLEL we expect two forms |
190 | 122 | of doloop which are cases 2) and 3) above: in case 2) the | ||
191 | 123 | decrement immediately precedes the branch, while in case 3) | ||
192 | 124 | the compare and decrement instructions immediately precede | ||
193 | 125 | the branch. */ | ||
194 | 109 | 126 | ||
195 | 110 | if (prev_insn == NULL_RTX || !INSN_P (prev_insn)) | 127 | if (prev_insn == NULL_RTX || !INSN_P (prev_insn)) |
196 | 111 | return 0; | 128 | return 0; |
197 | 112 | 129 | ||
198 | 113 | cmp = pattern; | 130 | cmp = pattern; |
200 | 114 | inc = PATTERN (PREV_INSN (doloop_pat)); | 131 | if (GET_CODE (PATTERN (prev_insn)) == PARALLEL) |
201 | 132 | { | ||
202 | 133 | /* The third case: the compare and decrement instructions | ||
203 | 134 | immediately precede the branch. */ | ||
204 | 135 | cmp_orig = XVECEXP (PATTERN (prev_insn), 0, 0); | ||
205 | 136 | if (GET_CODE (cmp_orig) != SET) | ||
206 | 137 | return 0; | ||
207 | 138 | if (GET_CODE (SET_SRC (cmp_orig)) != COMPARE) | ||
208 | 139 | return 0; | ||
209 | 140 | cmp_arg1 = XEXP (SET_SRC (cmp_orig), 0); | ||
210 | 141 | cmp_arg2 = XEXP (SET_SRC (cmp_orig), 1); | ||
211 | 142 | if (cmp_arg2 != const0_rtx | ||
212 | 143 | || GET_CODE (cmp_arg1) != PLUS) | ||
213 | 144 | return 0; | ||
214 | 145 | reg_orig = XEXP (cmp_arg1, 0); | ||
215 | 146 | if (XEXP (cmp_arg1, 1) != GEN_INT (-1) | ||
216 | 147 | || !REG_P (reg_orig)) | ||
217 | 148 | return 0; | ||
218 | 149 | cc_reg = SET_DEST (cmp_orig); | ||
219 | 150 | |||
220 | 151 | inc = XVECEXP (PATTERN (prev_insn), 0, 1); | ||
221 | 152 | } | ||
222 | 153 | else | ||
223 | 154 | inc = PATTERN (prev_insn); | ||
224 | 115 | /* We expect the condition to be of the form (reg != 0) */ | 155 | /* We expect the condition to be of the form (reg != 0) */ |
225 | 116 | cond = XEXP (SET_SRC (cmp), 0); | 156 | cond = XEXP (SET_SRC (cmp), 0); |
226 | 117 | if (GET_CODE (cond) != NE || XEXP (cond, 1) != const0_rtx) | 157 | if (GET_CODE (cond) != NE || XEXP (cond, 1) != const0_rtx) |
227 | 118 | return 0; | 158 | return 0; |
228 | 119 | |||
229 | 120 | } | 159 | } |
230 | 121 | else | 160 | else |
231 | 122 | { | 161 | { |
232 | @@ -162,11 +201,15 @@ | |||
233 | 162 | return 0; | 201 | return 0; |
234 | 163 | 202 | ||
235 | 164 | if ((XEXP (condition, 0) == reg) | 203 | if ((XEXP (condition, 0) == reg) |
236 | 204 | /* For the third case: */ | ||
237 | 205 | || ((cc_reg != NULL_RTX) | ||
238 | 206 | && (XEXP (condition, 0) == cc_reg) | ||
239 | 207 | && (reg_orig == reg)) | ||
240 | 165 | || (GET_CODE (XEXP (condition, 0)) == PLUS | 208 | || (GET_CODE (XEXP (condition, 0)) == PLUS |
242 | 166 | && XEXP (XEXP (condition, 0), 0) == reg)) | 209 | && XEXP (XEXP (condition, 0), 0) == reg)) |
243 | 167 | { | 210 | { |
244 | 168 | if (GET_CODE (pattern) != PARALLEL) | 211 | if (GET_CODE (pattern) != PARALLEL) |
246 | 169 | /* The second form we expect: | 212 | /* For the second form we expect: |
247 | 170 | 213 | ||
248 | 171 | (set (reg) (plus (reg) (const_int -1)) | 214 | (set (reg) (plus (reg) (const_int -1)) |
249 | 172 | (set (pc) (if_then_else (reg != 0) | 215 | (set (pc) (if_then_else (reg != 0) |
250 | @@ -181,7 +224,24 @@ | |||
251 | 181 | (set (reg) (plus (reg) (const_int -1))) | 224 | (set (reg) (plus (reg) (const_int -1))) |
252 | 182 | (additional clobbers and uses)]) | 225 | (additional clobbers and uses)]) |
253 | 183 | 226 | ||
255 | 184 | So we return that form instead. | 227 | For the third form we expect: |
256 | 228 | |||
257 | 229 | (parallel [(set (cc) (compare ((plus (reg) (const_int -1)), 0)) | ||
258 | 230 | (set (reg) (plus (reg) (const_int -1)))]) | ||
259 | 231 | (set (pc) (if_then_else (cc == NE) | ||
260 | 232 | (label_ref (label)) | ||
261 | 233 | (pc))) | ||
262 | 234 | |||
263 | 235 | which is equivalent to the following: | ||
264 | 236 | |||
265 | 237 | (parallel [(set (cc) (compare (reg, 1)) | ||
266 | 238 | (set (reg) (plus (reg) (const_int -1))) | ||
267 | 239 | (set (pc) (if_then_else (NE == cc) | ||
268 | 240 | (label_ref (label)) | ||
269 | 241 | (pc))))]) | ||
270 | 242 | |||
271 | 243 | So we return the second form instead for the two cases. | ||
272 | 244 | |||
273 | 185 | */ | 245 | */ |
274 | 186 | condition = gen_rtx_fmt_ee (NE, VOIDmode, inc_src, const1_rtx); | 246 | condition = gen_rtx_fmt_ee (NE, VOIDmode, inc_src, const1_rtx); |
275 | 187 | 247 | ||
276 | 188 | 248 | ||
277 | === modified file 'gcc/modulo-sched.c' | |||
278 | --- gcc/modulo-sched.c 2011-02-14 17:59:10 +0000 | |||
279 | +++ gcc/modulo-sched.c 2011-05-11 10:02:07 +0000 | |||
280 | @@ -84,14 +84,13 @@ | |||
281 | 84 | II cycles (i.e. use register copies to prevent a def from overwriting | 84 | II cycles (i.e. use register copies to prevent a def from overwriting |
282 | 85 | itself before reaching the use). | 85 | itself before reaching the use). |
283 | 86 | 86 | ||
292 | 87 | SMS works with countable loops (1) whose control part can be easily | 87 | SMS works with countable loops whose loop count can be easily |
293 | 88 | decoupled from the rest of the loop and (2) whose loop count can | 88 | adjusted. This is because we peel a constant number of iterations |
294 | 89 | be easily adjusted. This is because we peel a constant number of | 89 | into a prologue and epilogue for which we want to avoid emitting |
295 | 90 | iterations into a prologue and epilogue for which we want to avoid | 90 | the control part, and a kernel which is to iterate that constant |
296 | 91 | emitting the control part, and a kernel which is to iterate that | 91 | number of iterations less than the original loop. So the control |
297 | 92 | constant number of iterations less than the original loop. So the | 92 | part should be a set of insns clearly identified and having its |
298 | 93 | control part should be a set of insns clearly identified and having | 93 | own iv, not otherwise used in the loop (at-least for now), which |
291 | 94 | its own iv, not otherwise used in the loop (at-least for now), which | ||
299 | 95 | initializes a register before the loop to the number of iterations. | 94 | initializes a register before the loop to the number of iterations. |
300 | 96 | Currently SMS relies on the do-loop pattern to recognize such loops, | 95 | Currently SMS relies on the do-loop pattern to recognize such loops, |
301 | 97 | where (1) the control part comprises of all insns defining and/or | 96 | where (1) the control part comprises of all insns defining and/or |
302 | @@ -116,8 +115,10 @@ | |||
303 | 116 | 115 | ||
304 | 117 | /* The number of different iterations the nodes in ps span, assuming | 116 | /* The number of different iterations the nodes in ps span, assuming |
305 | 118 | the stage boundaries are placed efficiently. */ | 117 | the stage boundaries are placed efficiently. */ |
308 | 119 | #define PS_STAGE_COUNT(ps) ((PS_MAX_CYCLE (ps) - PS_MIN_CYCLE (ps) \ | 118 | #define CALC_STAGE_COUNT(max_cycle,min_cycle,ii) ((max_cycle - min_cycle \ |
309 | 120 | + 1 + (ps)->ii - 1) / (ps)->ii) | 119 | + 1 + ii - 1) / ii) |
310 | 120 | /* The stage count of ps. */ | ||
311 | 121 | #define PS_STAGE_COUNT(ps) (((partial_schedule_ptr)(ps))->stage_count) | ||
312 | 121 | 122 | ||
313 | 122 | /* A single instruction in the partial schedule. */ | 123 | /* A single instruction in the partial schedule. */ |
314 | 123 | struct ps_insn | 124 | struct ps_insn |
315 | @@ -155,6 +156,8 @@ | |||
316 | 155 | int max_cycle; | 156 | int max_cycle; |
317 | 156 | 157 | ||
318 | 157 | ddg_ptr g; /* The DDG of the insns in the partial schedule. */ | 158 | ddg_ptr g; /* The DDG of the insns in the partial schedule. */ |
319 | 159 | |||
320 | 160 | int stage_count; /* The stage count of the partial schedule. */ | ||
321 | 158 | }; | 161 | }; |
322 | 159 | 162 | ||
323 | 160 | /* We use this to record all the register replacements we do in | 163 | /* We use this to record all the register replacements we do in |
324 | @@ -195,7 +198,7 @@ | |||
325 | 195 | rtx, rtx); | 198 | rtx, rtx); |
326 | 196 | static void duplicate_insns_of_cycles (partial_schedule_ptr, | 199 | static void duplicate_insns_of_cycles (partial_schedule_ptr, |
327 | 197 | int, int, int, rtx); | 200 | int, int, int, rtx); |
329 | 198 | 201 | static int calculate_stage_count (partial_schedule_ptr ps); | |
330 | 199 | #define SCHED_ASAP(x) (((node_sched_params_ptr)(x)->aux.info)->asap) | 202 | #define SCHED_ASAP(x) (((node_sched_params_ptr)(x)->aux.info)->asap) |
331 | 200 | #define SCHED_TIME(x) (((node_sched_params_ptr)(x)->aux.info)->time) | 203 | #define SCHED_TIME(x) (((node_sched_params_ptr)(x)->aux.info)->time) |
332 | 201 | #define SCHED_FIRST_REG_MOVE(x) \ | 204 | #define SCHED_FIRST_REG_MOVE(x) \ |
333 | @@ -310,10 +313,10 @@ | |||
334 | 310 | either a single (parallel) branch-on-count or a (non-parallel) | 313 | either a single (parallel) branch-on-count or a (non-parallel) |
335 | 311 | branch immediately preceded by a single (decrement) insn. */ | 314 | branch immediately preceded by a single (decrement) insn. */ |
336 | 312 | first_insn_not_to_check = (GET_CODE (PATTERN (tail)) == PARALLEL ? tail | 315 | first_insn_not_to_check = (GET_CODE (PATTERN (tail)) == PARALLEL ? tail |
338 | 313 | : PREV_INSN (tail)); | 316 | : prev_nondebug_insn (tail)); |
339 | 314 | 317 | ||
340 | 315 | for (insn = head; insn != first_insn_not_to_check; insn = NEXT_INSN (insn)) | 318 | for (insn = head; insn != first_insn_not_to_check; insn = NEXT_INSN (insn)) |
342 | 316 | if (reg_mentioned_p (reg, insn)) | 319 | if (reg_mentioned_p (reg, insn) && !DEBUG_INSN_P (insn)) |
343 | 317 | { | 320 | { |
344 | 318 | if (dump_file) | 321 | if (dump_file) |
345 | 319 | { | 322 | { |
346 | @@ -569,13 +572,12 @@ | |||
347 | 569 | } | 572 | } |
348 | 570 | } | 573 | } |
349 | 571 | 574 | ||
352 | 572 | /* Bump the SCHED_TIMEs of all nodes to start from zero. Set the values | 575 | /* Bump the SCHED_TIMEs of all nodes by AMOUNT. Set the values of |
353 | 573 | of SCHED_ROW and SCHED_STAGE. */ | 576 | SCHED_ROW and SCHED_STAGE. */ |
354 | 574 | static void | 577 | static void |
356 | 575 | normalize_sched_times (partial_schedule_ptr ps) | 578 | reset_sched_times (partial_schedule_ptr ps, int amount) |
357 | 576 | { | 579 | { |
358 | 577 | int row; | 580 | int row; |
359 | 578 | int amount = PS_MIN_CYCLE (ps); | ||
360 | 579 | int ii = ps->ii; | 581 | int ii = ps->ii; |
361 | 580 | ps_insn_ptr crr_insn; | 582 | ps_insn_ptr crr_insn; |
362 | 581 | 583 | ||
363 | @@ -584,19 +586,43 @@ | |||
364 | 584 | { | 586 | { |
365 | 585 | ddg_node_ptr u = crr_insn->node; | 587 | ddg_node_ptr u = crr_insn->node; |
366 | 586 | int normalized_time = SCHED_TIME (u) - amount; | 588 | int normalized_time = SCHED_TIME (u) - amount; |
367 | 589 | int new_min_cycle = PS_MIN_CYCLE (ps) - amount; | ||
368 | 590 | int sc_until_cycle_zero, stage; | ||
369 | 587 | 591 | ||
374 | 588 | if (dump_file) | 592 | if (dump_file) |
375 | 589 | fprintf (dump_file, "crr_insn->node=%d, crr_insn->cycle=%d,\ | 593 | { |
376 | 590 | min_cycle=%d\n", crr_insn->node->cuid, SCHED_TIME | 594 | /* Print the scheduling times after the rotation. */ |
377 | 591 | (u), ps->min_cycle); | 595 | fprintf (dump_file, "crr_insn->node=%d (insn id %d), " |
378 | 596 | "crr_insn->cycle=%d, min_cycle=%d", crr_insn->node->cuid, | ||
379 | 597 | INSN_UID (crr_insn->node->insn), SCHED_TIME (u), | ||
380 | 598 | normalized_time); | ||
381 | 599 | if (JUMP_P (crr_insn->node->insn)) | ||
382 | 600 | fprintf (dump_file, " (branch)"); | ||
383 | 601 | fprintf (dump_file, "\n"); | ||
384 | 602 | } | ||
385 | 603 | |||
386 | 592 | gcc_assert (SCHED_TIME (u) >= ps->min_cycle); | 604 | gcc_assert (SCHED_TIME (u) >= ps->min_cycle); |
387 | 593 | gcc_assert (SCHED_TIME (u) <= ps->max_cycle); | 605 | gcc_assert (SCHED_TIME (u) <= ps->max_cycle); |
388 | 594 | SCHED_TIME (u) = normalized_time; | 606 | SCHED_TIME (u) = normalized_time; |
391 | 595 | SCHED_ROW (u) = normalized_time % ii; | 607 | SCHED_ROW (u) = SMODULO (normalized_time, ii); |
392 | 596 | SCHED_STAGE (u) = normalized_time / ii; | 608 | |
393 | 609 | /* The calculation of stage count is done adding the number | ||
394 | 610 | of stages before cycle zero and after cycle zero. */ | ||
395 | 611 | sc_until_cycle_zero = CALC_STAGE_COUNT (-1, new_min_cycle, ii); | ||
396 | 612 | |||
397 | 613 | if (SCHED_TIME (u) < 0) | ||
398 | 614 | { | ||
399 | 615 | stage = CALC_STAGE_COUNT (-1, SCHED_TIME (u), ii); | ||
400 | 616 | SCHED_STAGE (u) = sc_until_cycle_zero - stage; | ||
401 | 617 | } | ||
402 | 618 | else | ||
403 | 619 | { | ||
404 | 620 | stage = CALC_STAGE_COUNT (SCHED_TIME (u), 0, ii); | ||
405 | 621 | SCHED_STAGE (u) = sc_until_cycle_zero + stage - 1; | ||
406 | 622 | } | ||
407 | 597 | } | 623 | } |
408 | 598 | } | 624 | } |
410 | 599 | 625 | ||
411 | 600 | /* Set SCHED_COLUMN of each node according to its position in PS. */ | 626 | /* Set SCHED_COLUMN of each node according to its position in PS. */ |
412 | 601 | static void | 627 | static void |
413 | 602 | set_columns_for_ps (partial_schedule_ptr ps) | 628 | set_columns_for_ps (partial_schedule_ptr ps) |
414 | @@ -646,9 +672,12 @@ | |||
415 | 646 | 672 | ||
416 | 647 | /* Do not duplicate any insn which refers to count_reg as it | 673 | /* Do not duplicate any insn which refers to count_reg as it |
417 | 648 | belongs to the control part. | 674 | belongs to the control part. |
418 | 675 | The closing branch is scheduled as well and thus should | ||
419 | 676 | be ignored. | ||
420 | 649 | TODO: This should be done by analyzing the control part of | 677 | TODO: This should be done by analyzing the control part of |
421 | 650 | the loop. */ | 678 | the loop. */ |
423 | 651 | if (reg_mentioned_p (count_reg, u_node->insn)) | 679 | if (reg_mentioned_p (count_reg, u_node->insn) |
424 | 680 | || JUMP_P (ps_ij->node->insn)) | ||
425 | 652 | continue; | 681 | continue; |
426 | 653 | 682 | ||
427 | 654 | if (for_prolog) | 683 | if (for_prolog) |
428 | @@ -1009,9 +1038,11 @@ | |||
429 | 1009 | continue; | 1038 | continue; |
430 | 1010 | } | 1039 | } |
431 | 1011 | 1040 | ||
435 | 1012 | /* Don't handle BBs with calls or barriers, or !single_set insns, | 1041 | /* Don't handle BBs with calls or barriers or auto-increment insns |
436 | 1013 | or auto-increment insns (to avoid creating invalid reg-moves | 1042 | (to avoid creating invalid reg-moves for the auto-increment insns), |
437 | 1014 | for the auto-increment insns). | 1043 | or !single_set with the exception of instructions that include |
438 | 1044 | count_reg---these instructions are part of the control part | ||
439 | 1045 | that do-loop recognizes. | ||
440 | 1015 | ??? Should handle auto-increment insns. | 1046 | ??? Should handle auto-increment insns. |
441 | 1016 | ??? Should handle insns defining subregs. */ | 1047 | ??? Should handle insns defining subregs. */ |
442 | 1017 | for (insn = head; insn != NEXT_INSN (tail); insn = NEXT_INSN (insn)) | 1048 | for (insn = head; insn != NEXT_INSN (tail); insn = NEXT_INSN (insn)) |
443 | @@ -1021,7 +1052,8 @@ | |||
444 | 1021 | if (CALL_P (insn) | 1052 | if (CALL_P (insn) |
445 | 1022 | || BARRIER_P (insn) | 1053 | || BARRIER_P (insn) |
446 | 1023 | || (NONDEBUG_INSN_P (insn) && !JUMP_P (insn) | 1054 | || (NONDEBUG_INSN_P (insn) && !JUMP_P (insn) |
448 | 1024 | && !single_set (insn) && GET_CODE (PATTERN (insn)) != USE) | 1055 | && !single_set (insn) && GET_CODE (PATTERN (insn)) != USE |
449 | 1056 | && !reg_mentioned_p (count_reg, insn)) | ||
450 | 1025 | || (FIND_REG_INC_NOTE (insn, NULL_RTX) != 0) | 1057 | || (FIND_REG_INC_NOTE (insn, NULL_RTX) != 0) |
451 | 1026 | || (INSN_P (insn) && (set = single_set (insn)) | 1058 | || (INSN_P (insn) && (set = single_set (insn)) |
452 | 1027 | && GET_CODE (SET_DEST (set)) == SUBREG)) | 1059 | && GET_CODE (SET_DEST (set)) == SUBREG)) |
453 | @@ -1049,7 +1081,11 @@ | |||
454 | 1049 | continue; | 1081 | continue; |
455 | 1050 | } | 1082 | } |
456 | 1051 | 1083 | ||
458 | 1052 | if (! (g = create_ddg (bb, 0))) | 1084 | /* Always schedule the closing branch with the rest of the |
459 | 1085 | instructions. The branch is rotated to be in row ii-1 at the | ||
460 | 1086 | end of the scheduling procedure to make sure it's the last | ||
461 | 1087 | instruction in the iteration. */ | ||
462 | 1088 | if (! (g = create_ddg (bb, 1))) | ||
463 | 1053 | { | 1089 | { |
464 | 1054 | if (dump_file) | 1090 | if (dump_file) |
465 | 1055 | fprintf (dump_file, "SMS create_ddg failed\n"); | 1091 | fprintf (dump_file, "SMS create_ddg failed\n"); |
466 | @@ -1157,14 +1193,17 @@ | |||
467 | 1157 | 1193 | ||
468 | 1158 | ps = sms_schedule_by_order (g, mii, maxii, node_order); | 1194 | ps = sms_schedule_by_order (g, mii, maxii, node_order); |
469 | 1159 | 1195 | ||
474 | 1160 | if (ps){ | 1196 | if (ps) |
475 | 1161 | stage_count = PS_STAGE_COUNT (ps); | 1197 | { |
476 | 1162 | gcc_assert(stage_count >= 1); | 1198 | stage_count = calculate_stage_count (ps); |
477 | 1163 | } | 1199 | gcc_assert(stage_count >= 1); |
478 | 1200 | PS_STAGE_COUNT(ps) = stage_count; | ||
479 | 1201 | } | ||
480 | 1164 | 1202 | ||
484 | 1165 | /* Stage count of 1 means that there is no interleaving between | 1203 | /* The default value of PARAM_SMS_MIN_SC is 2 as stage count of |
485 | 1166 | iterations, let the scheduling passes do the job. */ | 1204 | 1 means that there is no interleaving between iterations thus |
486 | 1167 | if (stage_count <= 1 | 1205 | we let the scheduling passes do the job in this case. */ |
487 | 1206 | if (stage_count < (unsigned) PARAM_VALUE (PARAM_SMS_MIN_SC) | ||
488 | 1168 | || (count_init && (loop_count <= stage_count)) | 1207 | || (count_init && (loop_count <= stage_count)) |
489 | 1169 | || (flag_branch_probabilities && (trip_count <= stage_count))) | 1208 | || (flag_branch_probabilities && (trip_count <= stage_count))) |
490 | 1170 | { | 1209 | { |
491 | @@ -1182,32 +1221,24 @@ | |||
492 | 1182 | else | 1221 | else |
493 | 1183 | { | 1222 | { |
494 | 1184 | struct undo_replace_buff_elem *reg_move_replaces; | 1223 | struct undo_replace_buff_elem *reg_move_replaces; |
498 | 1185 | 1224 | int amount = SCHED_TIME (g->closing_branch) + 1; | |
499 | 1186 | if (dump_file) | 1225 | |
500 | 1187 | { | 1226 | /* Set the stage boundaries. The closing_branch was scheduled |
501 | 1227 | and should appear in the last (ii-1) row. */ | ||
502 | 1228 | reset_sched_times (ps, amount); | ||
503 | 1229 | rotate_partial_schedule (ps, amount); | ||
504 | 1230 | set_columns_for_ps (ps); | ||
505 | 1231 | |||
506 | 1232 | canon_loop (loop); | ||
507 | 1233 | |||
508 | 1234 | if (dump_file) | ||
509 | 1235 | { | ||
510 | 1188 | fprintf (dump_file, | 1236 | fprintf (dump_file, |
511 | 1189 | "SMS succeeded %d %d (with ii, sc)\n", ps->ii, | 1237 | "SMS succeeded %d %d (with ii, sc)\n", ps->ii, |
512 | 1190 | stage_count); | 1238 | stage_count); |
513 | 1191 | print_partial_schedule (ps, dump_file); | 1239 | print_partial_schedule (ps, dump_file); |
514 | 1192 | fprintf (dump_file, | ||
515 | 1193 | "SMS Branch (%d) will later be scheduled at cycle %d.\n", | ||
516 | 1194 | g->closing_branch->cuid, PS_MIN_CYCLE (ps) - 1); | ||
517 | 1195 | } | 1240 | } |
533 | 1196 | 1241 | ||
519 | 1197 | /* Set the stage boundaries. If the DDG is built with closing_branch_deps, | ||
520 | 1198 | the closing_branch was scheduled and should appear in the last (ii-1) | ||
521 | 1199 | row. Otherwise, we are free to schedule the branch, and we let nodes | ||
522 | 1200 | that were scheduled at the first PS_MIN_CYCLE cycle appear in the first | ||
523 | 1201 | row; this should reduce stage_count to minimum. | ||
524 | 1202 | TODO: Revisit the issue of scheduling the insns of the | ||
525 | 1203 | control part relative to the branch when the control part | ||
526 | 1204 | has more than one insn. */ | ||
527 | 1205 | normalize_sched_times (ps); | ||
528 | 1206 | rotate_partial_schedule (ps, PS_MIN_CYCLE (ps)); | ||
529 | 1207 | set_columns_for_ps (ps); | ||
530 | 1208 | |||
531 | 1209 | canon_loop (loop); | ||
532 | 1210 | |||
534 | 1211 | /* case the BCT count is not known , Do loop-versioning */ | 1242 | /* case the BCT count is not known , Do loop-versioning */ |
535 | 1212 | if (count_reg && ! count_init) | 1243 | if (count_reg && ! count_init) |
536 | 1213 | { | 1244 | { |
537 | @@ -1760,12 +1791,6 @@ | |||
538 | 1760 | continue; | 1791 | continue; |
539 | 1761 | } | 1792 | } |
540 | 1762 | 1793 | ||
541 | 1763 | if (JUMP_P (insn)) /* Closing branch handled later. */ | ||
542 | 1764 | { | ||
543 | 1765 | RESET_BIT (tobe_scheduled, u); | ||
544 | 1766 | continue; | ||
545 | 1767 | } | ||
546 | 1768 | |||
547 | 1769 | if (TEST_BIT (sched_nodes, u)) | 1794 | if (TEST_BIT (sched_nodes, u)) |
548 | 1770 | continue; | 1795 | continue; |
549 | 1771 | 1796 | ||
550 | @@ -1893,8 +1918,8 @@ | |||
551 | 1893 | if (dump_file) | 1918 | if (dump_file) |
552 | 1894 | fprintf (dump_file, "split_row=%d\n", split_row); | 1919 | fprintf (dump_file, "split_row=%d\n", split_row); |
553 | 1895 | 1920 | ||
556 | 1896 | normalize_sched_times (ps); | 1921 | reset_sched_times (ps, PS_MIN_CYCLE (ps)); |
557 | 1897 | rotate_partial_schedule (ps, ps->min_cycle); | 1922 | rotate_partial_schedule (ps, PS_MIN_CYCLE (ps)); |
558 | 1898 | 1923 | ||
559 | 1899 | rows_new = (ps_insn_ptr *) xcalloc (new_ii, sizeof (ps_insn_ptr)); | 1924 | rows_new = (ps_insn_ptr *) xcalloc (new_ii, sizeof (ps_insn_ptr)); |
560 | 1900 | for (row = 0; row < split_row; row++) | 1925 | for (row = 0; row < split_row; row++) |
561 | @@ -2571,6 +2596,7 @@ | |||
562 | 2571 | ps_insn_ptr next_ps_i; | 2596 | ps_insn_ptr next_ps_i; |
563 | 2572 | ps_insn_ptr first_must_follow = NULL; | 2597 | ps_insn_ptr first_must_follow = NULL; |
564 | 2573 | ps_insn_ptr last_must_precede = NULL; | 2598 | ps_insn_ptr last_must_precede = NULL; |
565 | 2599 | ps_insn_ptr last_in_row = NULL; | ||
566 | 2574 | int row; | 2600 | int row; |
567 | 2575 | 2601 | ||
568 | 2576 | if (! ps_i) | 2602 | if (! ps_i) |
569 | @@ -2597,8 +2623,37 @@ | |||
570 | 2597 | else | 2623 | else |
571 | 2598 | last_must_precede = next_ps_i; | 2624 | last_must_precede = next_ps_i; |
572 | 2599 | } | 2625 | } |
573 | 2626 | /* The closing branch must be the last in the row. */ | ||
574 | 2627 | if (must_precede | ||
575 | 2628 | && TEST_BIT (must_precede, next_ps_i->node->cuid) | ||
576 | 2629 | && JUMP_P (next_ps_i->node->insn)) | ||
577 | 2630 | return false; | ||
578 | 2631 | |||
579 | 2632 | last_in_row = next_ps_i; | ||
580 | 2600 | } | 2633 | } |
581 | 2601 | 2634 | ||
582 | 2635 | /* The closing branch is scheduled as well. Make sure there is no | ||
583 | 2636 | dependent instruction after it as the branch should be the last | ||
584 | 2637 | instruction in the row. */ | ||
585 | 2638 | if (JUMP_P (ps_i->node->insn)) | ||
586 | 2639 | { | ||
587 | 2640 | if (first_must_follow) | ||
588 | 2641 | return false; | ||
589 | 2642 | if (last_in_row) | ||
590 | 2643 | { | ||
591 | 2644 | /* Make the branch the last in the row. New instructions | ||
592 | 2645 | will be inserted at the beginning of the row or after the | ||
593 | 2646 | last must_precede instruction thus the branch is guaranteed | ||
594 | 2647 | to remain the last instruction in the row. */ | ||
595 | 2648 | last_in_row->next_in_row = ps_i; | ||
596 | 2649 | ps_i->prev_in_row = last_in_row; | ||
597 | 2650 | ps_i->next_in_row = NULL; | ||
598 | 2651 | } | ||
599 | 2652 | else | ||
600 | 2653 | ps->rows[row] = ps_i; | ||
601 | 2654 | return true; | ||
602 | 2655 | } | ||
603 | 2656 | |||
604 | 2602 | /* Now insert the node after INSERT_AFTER_PSI. */ | 2657 | /* Now insert the node after INSERT_AFTER_PSI. */ |
605 | 2603 | 2658 | ||
606 | 2604 | if (! last_must_precede) | 2659 | if (! last_must_precede) |
607 | @@ -2820,6 +2875,24 @@ | |||
608 | 2820 | return ps_i; | 2875 | return ps_i; |
609 | 2821 | } | 2876 | } |
610 | 2822 | 2877 | ||
611 | 2878 | /* Calculate the stage count of the partial schedule PS. The calculation | ||
612 | 2879 | takes into account the rotation to bring the closing branch to row | ||
613 | 2880 | ii-1. */ | ||
614 | 2881 | int | ||
615 | 2882 | calculate_stage_count (partial_schedule_ptr ps) | ||
616 | 2883 | { | ||
617 | 2884 | int rotation_amount = (SCHED_TIME (ps->g->closing_branch)) + 1; | ||
618 | 2885 | int new_min_cycle = PS_MIN_CYCLE (ps) - rotation_amount; | ||
619 | 2886 | int new_max_cycle = PS_MAX_CYCLE (ps) - rotation_amount; | ||
620 | 2887 | int stage_count = CALC_STAGE_COUNT (-1, new_min_cycle, ps->ii); | ||
621 | 2888 | |||
622 | 2889 | /* The calculation of stage count is done adding the number of stages | ||
623 | 2890 | before cycle zero and after cycle zero. */ | ||
624 | 2891 | stage_count += CALC_STAGE_COUNT (new_max_cycle, 0, ps->ii); | ||
625 | 2892 | |||
626 | 2893 | return stage_count; | ||
627 | 2894 | } | ||
628 | 2895 | |||
629 | 2823 | /* Rotate the rows of PS such that insns scheduled at time | 2896 | /* Rotate the rows of PS such that insns scheduled at time |
630 | 2824 | START_CYCLE will appear in row 0. Updates max/min_cycles. */ | 2897 | START_CYCLE will appear in row 0. Updates max/min_cycles. */ |
631 | 2825 | void | 2898 | void |
632 | 2826 | 2899 | ||
633 | === modified file 'gcc/params.def' | |||
634 | --- gcc/params.def 2011-04-18 11:31:29 +0000 | |||
635 | +++ gcc/params.def 2011-05-11 10:02:07 +0000 | |||
636 | @@ -344,6 +344,11 @@ | |||
637 | 344 | "sms-max-ii-factor", | 344 | "sms-max-ii-factor", |
638 | 345 | "A factor for tuning the upper bound that swing modulo scheduler uses for scheduling a loop", | 345 | "A factor for tuning the upper bound that swing modulo scheduler uses for scheduling a loop", |
639 | 346 | 100, 0, 0) | 346 | 100, 0, 0) |
640 | 347 | /* The minimum value of stage count that swing modulo scheduler will generate. */ | ||
641 | 348 | DEFPARAM(PARAM_SMS_MIN_SC, | ||
642 | 349 | "sms-min-sc", | ||
643 | 350 | "The minimum value of stage count that swing modulo scheduler will generate.", | ||
644 | 351 | 2, 1, 1) | ||
645 | 347 | DEFPARAM(PARAM_SMS_DFA_HISTORY, | 352 | DEFPARAM(PARAM_SMS_DFA_HISTORY, |
646 | 348 | "sms-dfa-history", | 353 | "sms-dfa-history", |
647 | 349 | "The number of cycles the swing modulo scheduler considers when checking conflicts using DFA", | 354 | "The number of cycles the swing modulo scheduler considers when checking conflicts using DFA", |
cbuild has taken a snapshot of this branch at r106745 and queued it for build.
The snapshot is available at: ex.seabright. co.nz/snapshots /gcc-linaro- 4.6+bzr106745~ eres~sms_ doloop_ for_ARM_ new_version- 4_6.tar. xdelta3. xz
http://
and will be built on the following builders:
a9-builder i686 x86_64
You can track the build queue at: ex.seabright. co.nz/helpers/ scheduler
http://
cbuild-snapshot: gcc-linaro- 4.6+bzr106745~ eres~sms_ doloop_ for_ARM_ new_version- 4_6
cbuild-ancestor: lp:gcc-linaro/4.6+bzr106744
cbuild-state: check