diff options
author | Khem Raj <raj.khem@gmail.com> | 2011-07-30 05:58:13 +0000 |
---|---|---|
committer | Koen Kooi <koen@dominion.thruhere.net> | 2011-07-30 10:44:50 +0200 |
commit | 7280929da603f17518d07a9cfd3820dc01b43904 (patch) | |
tree | 2bd57391b3b78b673e6a7eaea840e878914563ad /meta-oe/recipes-devtools | |
parent | 0aa9586cb3654023de7996adcbade525ca70fe4b (diff) | |
download | meta-openembedded-7280929da603f17518d07a9cfd3820dc01b43904.tar.gz |
gcc-4.5: Bring latest upstream and linaro patches
Build tested on angstrom-2010/console-image for all qemus + beagleboard
for both uclibc/eglibc
Signed-off-by: Khem Raj <raj.khem@gmail.com>
Signed-off-by: Koen Kooi <koen@dominion.thruhere.net>
Diffstat (limited to 'meta-oe/recipes-devtools')
12 files changed, 1870 insertions, 199 deletions
diff --git a/meta-oe/recipes-devtools/gcc/gcc-4.5.inc b/meta-oe/recipes-devtools/gcc/gcc-4.5.inc index abd30882d..e214a4dc6 100644 --- a/meta-oe/recipes-devtools/gcc/gcc-4.5.inc +++ b/meta-oe/recipes-devtools/gcc/gcc-4.5.inc | |||
@@ -24,7 +24,7 @@ INC_PR = "r39" | |||
24 | 24 | ||
25 | BINV = "${PV}.4" | 25 | BINV = "${PV}.4" |
26 | 26 | ||
27 | SRCREV = 175127 | 27 | SRCREV = 176640 |
28 | BRANCH = "gcc-4_5-branch" | 28 | BRANCH = "gcc-4_5-branch" |
29 | PR_append = "+svnr${SRCPV}" | 29 | PR_append = "+svnr${SRCPV}" |
30 | 30 | ||
@@ -192,6 +192,15 @@ SRC_URI = "svn://gcc.gnu.org/svn/gcc/branches;module=${BRANCH};proto=http \ | |||
192 | file://linaro/gcc-4.5-linaro-r99511.patch \ | 192 | file://linaro/gcc-4.5-linaro-r99511.patch \ |
193 | file://linaro/gcc-4.5-linaro-r99514.patch \ | 193 | file://linaro/gcc-4.5-linaro-r99514.patch \ |
194 | file://linaro/gcc-4.5-linaro-r99516.patch \ | 194 | file://linaro/gcc-4.5-linaro-r99516.patch \ |
195 | file://linaro/gcc-4.5-linaro-r99519.patch \ | ||
196 | file://linaro/gcc-4.5-linaro-r99521.patch \ | ||
197 | file://linaro/gcc-4.5-linaro-r99522.patch \ | ||
198 | file://linaro/gcc-4.5-linaro-r99523.patch \ | ||
199 | file://linaro/gcc-4.5-linaro-r99524.patch \ | ||
200 | file://linaro/gcc-4.5-linaro-r99525.patch \ | ||
201 | file://linaro/gcc-4.5-linaro-r99528.patch \ | ||
202 | file://linaro/gcc-4.5-linaro-r99529.patch \ | ||
203 | file://linaro/linaro-lp815435.patch \ | ||
195 | \ | 204 | \ |
196 | file://more-epilogues.patch \ | 205 | file://more-epilogues.patch \ |
197 | file://gcc-scalar-widening-pr45847.patch \ | 206 | file://gcc-scalar-widening-pr45847.patch \ |
diff --git a/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99396.patch b/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99396.patch index 655399ab1..b7eaa685a 100644 --- a/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99396.patch +++ b/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99396.patch | |||
@@ -110,8 +110,10 @@ | |||
110 | Backport from mainline: | 110 | Backport from mainline: |
111 | 111 | ||
112 | === modified file 'gcc/cfgexpand.c' | 112 | === modified file 'gcc/cfgexpand.c' |
113 | --- old/gcc/cfgexpand.c 2010-09-01 13:29:58 +0000 | 113 | Index: gcc-4_5-branch/gcc/cfgexpand.c |
114 | +++ new/gcc/cfgexpand.c 2010-09-16 09:15:46 +0000 | 114 | =================================================================== |
115 | --- gcc-4_5-branch.orig/gcc/cfgexpand.c 2011-07-22 16:59:23.000000000 -0700 | ||
116 | +++ gcc-4_5-branch/gcc/cfgexpand.c 2011-07-22 16:59:28.581747691 -0700 | ||
115 | @@ -64,7 +64,13 @@ | 117 | @@ -64,7 +64,13 @@ |
116 | 118 | ||
117 | grhs_class = get_gimple_rhs_class (gimple_expr_code (stmt)); | 119 | grhs_class = get_gimple_rhs_class (gimple_expr_code (stmt)); |
@@ -127,7 +129,7 @@ | |||
127 | t = build2 (gimple_assign_rhs_code (stmt), | 129 | t = build2 (gimple_assign_rhs_code (stmt), |
128 | TREE_TYPE (gimple_assign_lhs (stmt)), | 130 | TREE_TYPE (gimple_assign_lhs (stmt)), |
129 | gimple_assign_rhs1 (stmt), | 131 | gimple_assign_rhs1 (stmt), |
130 | @@ -1887,6 +1893,9 @@ | 132 | @@ -1893,6 +1899,9 @@ |
131 | ops.type = TREE_TYPE (lhs); | 133 | ops.type = TREE_TYPE (lhs); |
132 | switch (get_gimple_rhs_class (gimple_expr_code (stmt))) | 134 | switch (get_gimple_rhs_class (gimple_expr_code (stmt))) |
133 | { | 135 | { |
@@ -137,7 +139,7 @@ | |||
137 | case GIMPLE_BINARY_RHS: | 139 | case GIMPLE_BINARY_RHS: |
138 | ops.op1 = gimple_assign_rhs2 (stmt); | 140 | ops.op1 = gimple_assign_rhs2 (stmt); |
139 | /* Fallthru */ | 141 | /* Fallthru */ |
140 | @@ -2237,6 +2246,8 @@ | 142 | @@ -2243,6 +2252,8 @@ |
141 | { | 143 | { |
142 | case COND_EXPR: | 144 | case COND_EXPR: |
143 | case DOT_PROD_EXPR: | 145 | case DOT_PROD_EXPR: |
@@ -146,7 +148,7 @@ | |||
146 | goto ternary; | 148 | goto ternary; |
147 | 149 | ||
148 | case TRUTH_ANDIF_EXPR: | 150 | case TRUTH_ANDIF_EXPR: |
149 | @@ -3023,6 +3034,8 @@ | 151 | @@ -3030,6 +3041,8 @@ |
150 | return NULL; | 152 | return NULL; |
151 | 153 | ||
152 | case WIDEN_MULT_EXPR: | 154 | case WIDEN_MULT_EXPR: |
@@ -155,7 +157,7 @@ | |||
155 | if (SCALAR_INT_MODE_P (GET_MODE (op0)) | 157 | if (SCALAR_INT_MODE_P (GET_MODE (op0)) |
156 | && SCALAR_INT_MODE_P (mode)) | 158 | && SCALAR_INT_MODE_P (mode)) |
157 | { | 159 | { |
158 | @@ -3035,7 +3048,13 @@ | 160 | @@ -3042,7 +3055,13 @@ |
159 | op1 = simplify_gen_unary (ZERO_EXTEND, mode, op1, inner_mode); | 161 | op1 = simplify_gen_unary (ZERO_EXTEND, mode, op1, inner_mode); |
160 | else | 162 | else |
161 | op1 = simplify_gen_unary (SIGN_EXTEND, mode, op1, inner_mode); | 163 | op1 = simplify_gen_unary (SIGN_EXTEND, mode, op1, inner_mode); |
@@ -170,10 +172,10 @@ | |||
170 | } | 172 | } |
171 | return NULL; | 173 | return NULL; |
172 | 174 | ||
173 | 175 | Index: gcc-4_5-branch/gcc/config/arm/arm.md | |
174 | === modified file 'gcc/config/arm/arm.md' | 176 | =================================================================== |
175 | --- old/gcc/config/arm/arm.md 2010-09-15 16:55:55 +0000 | 177 | --- gcc-4_5-branch.orig/gcc/config/arm/arm.md 2011-07-22 16:59:25.000000000 -0700 |
176 | +++ new/gcc/config/arm/arm.md 2010-09-16 09:15:46 +0000 | 178 | +++ gcc-4_5-branch/gcc/config/arm/arm.md 2011-07-22 16:59:28.581747691 -0700 |
177 | @@ -1507,7 +1507,15 @@ | 179 | @@ -1507,7 +1507,15 @@ |
178 | (set_attr "predicable" "yes")] | 180 | (set_attr "predicable" "yes")] |
179 | ) | 181 | ) |
@@ -248,10 +250,10 @@ | |||
248 | [(set_attr "insn" "smlalxy") | 250 | [(set_attr "insn" "smlalxy") |
249 | (set_attr "predicable" "yes")]) | 251 | (set_attr "predicable" "yes")]) |
250 | 252 | ||
251 | 253 | Index: gcc-4_5-branch/gcc/doc/gimple.texi | |
252 | === modified file 'gcc/doc/gimple.texi' | 254 | =================================================================== |
253 | --- old/gcc/doc/gimple.texi 2010-07-06 19:23:53 +0000 | 255 | --- gcc-4_5-branch.orig/gcc/doc/gimple.texi 2011-07-22 16:58:48.000000000 -0700 |
254 | +++ new/gcc/doc/gimple.texi 2010-09-16 09:15:46 +0000 | 256 | +++ gcc-4_5-branch/gcc/doc/gimple.texi 2011-07-22 16:59:28.581747691 -0700 |
255 | @@ -554,6 +554,9 @@ | 257 | @@ -554,6 +554,9 @@ |
256 | @item @code{GIMPLE_INVALID_RHS} | 258 | @item @code{GIMPLE_INVALID_RHS} |
257 | The tree cannot be used as a GIMPLE operand. | 259 | The tree cannot be used as a GIMPLE operand. |
@@ -295,7 +297,7 @@ | |||
295 | @deftypefn {GIMPLE function} void gimple_assign_set_lhs (gimple g, tree lhs) | 297 | @deftypefn {GIMPLE function} void gimple_assign_set_lhs (gimple g, tree lhs) |
296 | Set @code{LHS} to be the @code{LHS} operand of assignment statement @code{G}. | 298 | Set @code{LHS} to be the @code{LHS} operand of assignment statement @code{G}. |
297 | @end deftypefn | 299 | @end deftypefn |
298 | @@ -1092,20 +1105,16 @@ | 300 | @@ -1092,17 +1105,13 @@ |
299 | statement @code{G}. | 301 | statement @code{G}. |
300 | @end deftypefn | 302 | @end deftypefn |
301 | 303 | ||
@@ -305,27 +307,23 @@ | |||
305 | - | 307 | - |
306 | -@deftypefn {GIMPLE function} tree *gimple_assign_rhs2_ptr (gimple g) | 308 | -@deftypefn {GIMPLE function} tree *gimple_assign_rhs2_ptr (gimple g) |
307 | -Return a pointer to the second operand on the @code{RHS} of assignment | 309 | -Return a pointer to the second operand on the @code{RHS} of assignment |
308 | -statement @code{G}. | 310 | +@deftypefn {GIMPLE function} void gimple_assign_set_rhs2 (gimple g, tree rhs) |
309 | -@end deftypefn | 311 | +Set @code{RHS} to be the second operand on the @code{RHS} of assignment |
310 | - | ||
311 | @deftypefn {GIMPLE function} void gimple_assign_set_rhs2 (gimple g, tree rhs) | ||
312 | Set @code{RHS} to be the second operand on the @code{RHS} of assignment | ||
313 | statement @code{G}. | 312 | statement @code{G}. |
314 | @end deftypefn | 313 | @end deftypefn |
315 | 314 | ||
315 | -@deftypefn {GIMPLE function} void gimple_assign_set_rhs2 (gimple g, tree rhs) | ||
316 | -Set @code{RHS} to be the second operand on the @code{RHS} of assignment | ||
316 | +@deftypefn {GIMPLE function} void gimple_assign_set_rhs3 (gimple g, tree rhs) | 317 | +@deftypefn {GIMPLE function} void gimple_assign_set_rhs3 (gimple g, tree rhs) |
317 | +Set @code{RHS} to be the third operand on the @code{RHS} of assignment | 318 | +Set @code{RHS} to be the third operand on the @code{RHS} of assignment |
318 | +statement @code{G}. | 319 | statement @code{G}. |
319 | +@end deftypefn | ||
320 | + | ||
321 | @deftypefn {GIMPLE function} bool gimple_assign_cast_p (gimple s) | ||
322 | Return true if @code{S} is a type-cast assignment. | ||
323 | @end deftypefn | 320 | @end deftypefn |
324 | 321 | ||
325 | === modified file 'gcc/expr.c' | 322 | Index: gcc-4_5-branch/gcc/expr.c |
326 | --- old/gcc/expr.c 2010-09-01 13:29:58 +0000 | 323 | =================================================================== |
327 | +++ new/gcc/expr.c 2010-09-16 09:15:46 +0000 | 324 | --- gcc-4_5-branch.orig/gcc/expr.c 2011-07-22 16:59:23.000000000 -0700 |
328 | @@ -7225,8 +7225,6 @@ | 325 | +++ gcc-4_5-branch/gcc/expr.c 2011-07-22 16:59:28.591747691 -0700 |
326 | @@ -7228,8 +7228,6 @@ | ||
329 | rtx subtarget, original_target; | 327 | rtx subtarget, original_target; |
330 | int ignore; | 328 | int ignore; |
331 | bool reduce_bit_field; | 329 | bool reduce_bit_field; |
@@ -334,7 +332,7 @@ | |||
334 | location_t loc = ops->location; | 332 | location_t loc = ops->location; |
335 | tree treeop0, treeop1; | 333 | tree treeop0, treeop1; |
336 | #define REDUCE_BIT_FIELD(expr) (reduce_bit_field \ | 334 | #define REDUCE_BIT_FIELD(expr) (reduce_bit_field \ |
337 | @@ -7246,7 +7244,8 @@ | 335 | @@ -7249,7 +7247,8 @@ |
338 | exactly those that are valid in gimple expressions that aren't | 336 | exactly those that are valid in gimple expressions that aren't |
339 | GIMPLE_SINGLE_RHS (or invalid). */ | 337 | GIMPLE_SINGLE_RHS (or invalid). */ |
340 | gcc_assert (get_gimple_rhs_class (code) == GIMPLE_UNARY_RHS | 338 | gcc_assert (get_gimple_rhs_class (code) == GIMPLE_UNARY_RHS |
@@ -344,7 +342,7 @@ | |||
344 | 342 | ||
345 | ignore = (target == const0_rtx | 343 | ignore = (target == const0_rtx |
346 | || ((CONVERT_EXPR_CODE_P (code) | 344 | || ((CONVERT_EXPR_CODE_P (code) |
347 | @@ -7421,58 +7420,6 @@ | 345 | @@ -7424,58 +7423,6 @@ |
348 | fold_convert_loc (loc, ssizetype, | 346 | fold_convert_loc (loc, ssizetype, |
349 | treeop1)); | 347 | treeop1)); |
350 | case PLUS_EXPR: | 348 | case PLUS_EXPR: |
@@ -403,7 +401,7 @@ | |||
403 | /* If we are adding a constant, a VAR_DECL that is sp, fp, or ap, and | 401 | /* If we are adding a constant, a VAR_DECL that is sp, fp, or ap, and |
404 | something else, make sure we add the register to the constant and | 402 | something else, make sure we add the register to the constant and |
405 | then to the other thing. This case can occur during strength | 403 | then to the other thing. This case can occur during strength |
406 | @@ -7587,57 +7534,6 @@ | 404 | @@ -7590,57 +7537,6 @@ |
407 | return REDUCE_BIT_FIELD (simplify_gen_binary (PLUS, mode, op0, op1)); | 405 | return REDUCE_BIT_FIELD (simplify_gen_binary (PLUS, mode, op0, op1)); |
408 | 406 | ||
409 | case MINUS_EXPR: | 407 | case MINUS_EXPR: |
@@ -461,7 +459,7 @@ | |||
461 | /* For initializers, we are allowed to return a MINUS of two | 459 | /* For initializers, we are allowed to return a MINUS of two |
462 | symbolic constants. Here we handle all cases when both operands | 460 | symbolic constants. Here we handle all cases when both operands |
463 | are constant. */ | 461 | are constant. */ |
464 | @@ -7678,6 +7574,14 @@ | 462 | @@ -7681,6 +7577,14 @@ |
465 | 463 | ||
466 | goto binop2; | 464 | goto binop2; |
467 | 465 | ||
@@ -476,10 +474,10 @@ | |||
476 | case WIDEN_MULT_EXPR: | 474 | case WIDEN_MULT_EXPR: |
477 | /* If first operand is constant, swap them. | 475 | /* If first operand is constant, swap them. |
478 | Thus the following special case checks need only | 476 | Thus the following special case checks need only |
479 | 477 | Index: gcc-4_5-branch/gcc/gimple-pretty-print.c | |
480 | === modified file 'gcc/gimple-pretty-print.c' | 478 | =================================================================== |
481 | --- old/gcc/gimple-pretty-print.c 2009-11-25 10:55:54 +0000 | 479 | --- gcc-4_5-branch.orig/gcc/gimple-pretty-print.c 2011-07-22 16:58:48.000000000 -0700 |
482 | +++ new/gcc/gimple-pretty-print.c 2010-09-16 09:15:46 +0000 | 480 | +++ gcc-4_5-branch/gcc/gimple-pretty-print.c 2011-07-22 16:59:28.591747691 -0700 |
483 | @@ -376,6 +376,34 @@ | 481 | @@ -376,6 +376,34 @@ |
484 | } | 482 | } |
485 | } | 483 | } |
@@ -524,10 +522,10 @@ | |||
524 | else | 522 | else |
525 | gcc_unreachable (); | 523 | gcc_unreachable (); |
526 | if (!(flags & TDF_RHS_ONLY)) | 524 | if (!(flags & TDF_RHS_ONLY)) |
527 | 525 | Index: gcc-4_5-branch/gcc/gimple.c | |
528 | === modified file 'gcc/gimple.c' | 526 | =================================================================== |
529 | --- old/gcc/gimple.c 2010-09-15 16:47:52 +0000 | 527 | --- gcc-4_5-branch.orig/gcc/gimple.c 2011-07-22 16:59:25.000000000 -0700 |
530 | +++ new/gcc/gimple.c 2010-09-16 09:15:46 +0000 | 528 | +++ gcc-4_5-branch/gcc/gimple.c 2011-07-22 16:59:28.591747691 -0700 |
531 | @@ -289,31 +289,40 @@ | 529 | @@ -289,31 +289,40 @@ |
532 | 530 | ||
533 | 531 | ||
@@ -547,13 +545,10 @@ | |||
547 | grhs_class = get_gimple_rhs_class (*subcode_p); | 545 | grhs_class = get_gimple_rhs_class (*subcode_p); |
548 | 546 | ||
549 | - if (grhs_class == GIMPLE_BINARY_RHS) | 547 | - if (grhs_class == GIMPLE_BINARY_RHS) |
550 | - { | ||
551 | - *op1_p = TREE_OPERAND (expr, 0); | ||
552 | - *op2_p = TREE_OPERAND (expr, 1); | ||
553 | + if (grhs_class == GIMPLE_TERNARY_RHS) | 548 | + if (grhs_class == GIMPLE_TERNARY_RHS) |
554 | + { | 549 | { |
555 | + *op1_p = TREE_OPERAND (expr, 0); | 550 | *op1_p = TREE_OPERAND (expr, 0); |
556 | + *op2_p = TREE_OPERAND (expr, 1); | 551 | *op2_p = TREE_OPERAND (expr, 1); |
557 | + *op3_p = TREE_OPERAND (expr, 2); | 552 | + *op3_p = TREE_OPERAND (expr, 2); |
558 | + } | 553 | + } |
559 | + else if (grhs_class == GIMPLE_BINARY_RHS) | 554 | + else if (grhs_class == GIMPLE_BINARY_RHS) |
@@ -668,10 +663,10 @@ | |||
668 | : ((SYM) == COND_EXPR \ | 663 | : ((SYM) == COND_EXPR \ |
669 | || (SYM) == CONSTRUCTOR \ | 664 | || (SYM) == CONSTRUCTOR \ |
670 | || (SYM) == OBJ_TYPE_REF \ | 665 | || (SYM) == OBJ_TYPE_REF \ |
671 | 666 | Index: gcc-4_5-branch/gcc/gimple.h | |
672 | === modified file 'gcc/gimple.h' | 667 | =================================================================== |
673 | --- old/gcc/gimple.h 2010-08-10 13:31:21 +0000 | 668 | --- gcc-4_5-branch.orig/gcc/gimple.h 2011-07-22 16:59:12.000000000 -0700 |
674 | +++ new/gcc/gimple.h 2010-09-16 09:15:46 +0000 | 669 | +++ gcc-4_5-branch/gcc/gimple.h 2011-07-22 16:59:28.591747691 -0700 |
675 | @@ -80,6 +80,7 @@ | 670 | @@ -80,6 +80,7 @@ |
676 | enum gimple_rhs_class | 671 | enum gimple_rhs_class |
677 | { | 672 | { |
@@ -774,10 +769,10 @@ | |||
774 | /* Returns true if GS is a nontemporal move. */ | 769 | /* Returns true if GS is a nontemporal move. */ |
775 | 770 | ||
776 | static inline bool | 771 | static inline bool |
777 | 772 | Index: gcc-4_5-branch/gcc/optabs.c | |
778 | === modified file 'gcc/optabs.c' | 773 | =================================================================== |
779 | --- old/gcc/optabs.c 2010-03-19 19:45:01 +0000 | 774 | --- gcc-4_5-branch.orig/gcc/optabs.c 2011-07-22 16:58:48.000000000 -0700 |
780 | +++ new/gcc/optabs.c 2010-09-16 09:15:46 +0000 | 775 | +++ gcc-4_5-branch/gcc/optabs.c 2011-07-22 16:59:28.601747691 -0700 |
781 | @@ -408,6 +408,20 @@ | 776 | @@ -408,6 +408,20 @@ |
782 | case DOT_PROD_EXPR: | 777 | case DOT_PROD_EXPR: |
783 | return TYPE_UNSIGNED (type) ? udot_prod_optab : sdot_prod_optab; | 778 | return TYPE_UNSIGNED (type) ? udot_prod_optab : sdot_prod_optab; |
@@ -813,21 +808,21 @@ | |||
813 | gcc_assert (icode != CODE_FOR_nothing); | 808 | gcc_assert (icode != CODE_FOR_nothing); |
814 | xmode0 = insn_data[icode].operand[1].mode; | 809 | xmode0 = insn_data[icode].operand[1].mode; |
815 | 810 | ||
816 | 811 | Index: gcc-4_5-branch/gcc/testsuite/gcc.target/arm/wmul-1.c | |
817 | === modified file 'gcc/testsuite/gcc.target/arm/wmul-1.c' | 812 | =================================================================== |
818 | --- old/gcc/testsuite/gcc.target/arm/wmul-1.c 2010-09-01 13:29:58 +0000 | 813 | --- gcc-4_5-branch.orig/gcc/testsuite/gcc.target/arm/wmul-1.c 2011-07-22 16:59:24.000000000 -0700 |
819 | +++ new/gcc/testsuite/gcc.target/arm/wmul-1.c 2010-09-16 09:15:46 +0000 | 814 | +++ gcc-4_5-branch/gcc/testsuite/gcc.target/arm/wmul-1.c 2011-07-22 16:59:28.601747691 -0700 |
820 | @@ -15,4 +15,4 @@ | 815 | @@ -15,4 +15,4 @@ |
821 | return sqr; | 816 | return sqr; |
822 | } | 817 | } |
823 | 818 | ||
824 | -/* { dg-final { scan-assembler-times "smulbb" 2 } } */ | 819 | -/* { dg-final { scan-assembler-times "smulbb" 2 } } */ |
825 | +/* { dg-final { scan-assembler-times "smlabb" 2 } } */ | 820 | +/* { dg-final { scan-assembler-times "smlabb" 2 } } */ |
826 | 821 | Index: gcc-4_5-branch/gcc/tree-cfg.c | |
827 | === modified file 'gcc/tree-cfg.c' | 822 | =================================================================== |
828 | --- old/gcc/tree-cfg.c 2010-09-01 13:29:58 +0000 | 823 | --- gcc-4_5-branch.orig/gcc/tree-cfg.c 2011-07-22 16:59:24.000000000 -0700 |
829 | +++ new/gcc/tree-cfg.c 2010-09-16 09:15:46 +0000 | 824 | +++ gcc-4_5-branch/gcc/tree-cfg.c 2011-07-22 16:59:28.601747691 -0700 |
830 | @@ -3483,6 +3483,65 @@ | 825 | @@ -3484,6 +3484,65 @@ |
831 | return false; | 826 | return false; |
832 | } | 827 | } |
833 | 828 | ||
@@ -893,7 +888,7 @@ | |||
893 | /* Verify a gimple assignment statement STMT with a single rhs. | 888 | /* Verify a gimple assignment statement STMT with a single rhs. |
894 | Returns true if anything is wrong. */ | 889 | Returns true if anything is wrong. */ |
895 | 890 | ||
896 | @@ -3615,6 +3674,9 @@ | 891 | @@ -3616,6 +3675,9 @@ |
897 | case GIMPLE_BINARY_RHS: | 892 | case GIMPLE_BINARY_RHS: |
898 | return verify_gimple_assign_binary (stmt); | 893 | return verify_gimple_assign_binary (stmt); |
899 | 894 | ||
@@ -903,11 +898,11 @@ | |||
903 | default: | 898 | default: |
904 | gcc_unreachable (); | 899 | gcc_unreachable (); |
905 | } | 900 | } |
906 | 901 | Index: gcc-4_5-branch/gcc/tree-inline.c | |
907 | === modified file 'gcc/tree-inline.c' | 902 | =================================================================== |
908 | --- old/gcc/tree-inline.c 2010-09-01 13:29:58 +0000 | 903 | --- gcc-4_5-branch.orig/gcc/tree-inline.c 2011-07-22 16:59:24.000000000 -0700 |
909 | +++ new/gcc/tree-inline.c 2010-09-16 09:15:46 +0000 | 904 | +++ gcc-4_5-branch/gcc/tree-inline.c 2011-07-22 16:59:28.601747691 -0700 |
910 | @@ -3199,6 +3199,8 @@ | 905 | @@ -3207,6 +3207,8 @@ |
911 | case WIDEN_SUM_EXPR: | 906 | case WIDEN_SUM_EXPR: |
912 | case WIDEN_MULT_EXPR: | 907 | case WIDEN_MULT_EXPR: |
913 | case DOT_PROD_EXPR: | 908 | case DOT_PROD_EXPR: |
@@ -916,10 +911,10 @@ | |||
916 | 911 | ||
917 | case VEC_WIDEN_MULT_HI_EXPR: | 912 | case VEC_WIDEN_MULT_HI_EXPR: |
918 | case VEC_WIDEN_MULT_LO_EXPR: | 913 | case VEC_WIDEN_MULT_LO_EXPR: |
919 | 914 | Index: gcc-4_5-branch/gcc/tree-pretty-print.c | |
920 | === modified file 'gcc/tree-pretty-print.c' | 915 | =================================================================== |
921 | --- old/gcc/tree-pretty-print.c 2009-11-30 10:36:54 +0000 | 916 | --- gcc-4_5-branch.orig/gcc/tree-pretty-print.c 2011-07-22 16:58:48.000000000 -0700 |
922 | +++ new/gcc/tree-pretty-print.c 2010-09-16 09:15:46 +0000 | 917 | +++ gcc-4_5-branch/gcc/tree-pretty-print.c 2011-07-22 16:59:28.611747691 -0700 |
923 | @@ -1939,6 +1939,26 @@ | 918 | @@ -1939,6 +1939,26 @@ |
924 | pp_string (buffer, " > "); | 919 | pp_string (buffer, " > "); |
925 | break; | 920 | break; |
@@ -956,10 +951,10 @@ | |||
956 | case MULT_EXPR: | 951 | case MULT_EXPR: |
957 | case TRUNC_DIV_EXPR: | 952 | case TRUNC_DIV_EXPR: |
958 | case CEIL_DIV_EXPR: | 953 | case CEIL_DIV_EXPR: |
959 | 954 | Index: gcc-4_5-branch/gcc/tree-ssa-ccp.c | |
960 | === modified file 'gcc/tree-ssa-ccp.c' | 955 | =================================================================== |
961 | --- old/gcc/tree-ssa-ccp.c 2010-08-10 13:31:21 +0000 | 956 | --- gcc-4_5-branch.orig/gcc/tree-ssa-ccp.c 2011-07-22 16:59:12.000000000 -0700 |
962 | +++ new/gcc/tree-ssa-ccp.c 2010-09-16 09:15:46 +0000 | 957 | +++ gcc-4_5-branch/gcc/tree-ssa-ccp.c 2011-07-22 16:59:28.611747691 -0700 |
963 | @@ -915,6 +915,23 @@ | 958 | @@ -915,6 +915,23 @@ |
964 | TREE_TYPE (TREE_OPERAND (addr, 0)))); | 959 | TREE_TYPE (TREE_OPERAND (addr, 0)))); |
965 | } | 960 | } |
@@ -1079,10 +1074,10 @@ | |||
1079 | case GIMPLE_INVALID_RHS: | 1074 | case GIMPLE_INVALID_RHS: |
1080 | gcc_unreachable (); | 1075 | gcc_unreachable (); |
1081 | } | 1076 | } |
1082 | 1077 | Index: gcc-4_5-branch/gcc/tree-ssa-dom.c | |
1083 | === modified file 'gcc/tree-ssa-dom.c' | 1078 | =================================================================== |
1084 | --- old/gcc/tree-ssa-dom.c 2010-07-20 11:44:16 +0000 | 1079 | --- gcc-4_5-branch.orig/gcc/tree-ssa-dom.c 2011-07-22 16:58:48.000000000 -0700 |
1085 | +++ new/gcc/tree-ssa-dom.c 2010-09-16 09:15:46 +0000 | 1080 | +++ gcc-4_5-branch/gcc/tree-ssa-dom.c 2011-07-22 17:23:51.501747355 -0700 |
1086 | @@ -54,6 +54,7 @@ | 1081 | @@ -54,6 +54,7 @@ |
1087 | EXPR_SINGLE, | 1082 | EXPR_SINGLE, |
1088 | EXPR_UNARY, | 1083 | EXPR_UNARY, |
@@ -1101,58 +1096,31 @@ | |||
1101 | struct { tree fn; bool pure; size_t nargs; tree *args; } call; | 1096 | struct { tree fn; bool pure; size_t nargs; tree *args; } call; |
1102 | } ops; | 1097 | } ops; |
1103 | }; | 1098 | }; |
1104 | @@ -214,22 +216,30 @@ | 1099 | @@ -229,6 +231,14 @@ |
1105 | switch (get_gimple_rhs_class (subcode)) | 1100 | expr->ops.binary.opnd0 = gimple_assign_rhs1 (stmt); |
1106 | { | 1101 | expr->ops.binary.opnd1 = gimple_assign_rhs2 (stmt); |
1107 | case GIMPLE_SINGLE_RHS: | 1102 | break; |
1108 | - expr->kind = EXPR_SINGLE; | ||
1109 | - expr->ops.single.rhs = gimple_assign_rhs1 (stmt); | ||
1110 | - break; | ||
1111 | + expr->kind = EXPR_SINGLE; | ||
1112 | + expr->ops.single.rhs = gimple_assign_rhs1 (stmt); | ||
1113 | + break; | ||
1114 | case GIMPLE_UNARY_RHS: | ||
1115 | - expr->kind = EXPR_UNARY; | ||
1116 | + expr->kind = EXPR_UNARY; | ||
1117 | expr->type = TREE_TYPE (gimple_assign_lhs (stmt)); | ||
1118 | - expr->ops.unary.op = subcode; | ||
1119 | - expr->ops.unary.opnd = gimple_assign_rhs1 (stmt); | ||
1120 | - break; | ||
1121 | + expr->ops.unary.op = subcode; | ||
1122 | + expr->ops.unary.opnd = gimple_assign_rhs1 (stmt); | ||
1123 | + break; | ||
1124 | case GIMPLE_BINARY_RHS: | ||
1125 | - expr->kind = EXPR_BINARY; | ||
1126 | - expr->type = TREE_TYPE (gimple_assign_lhs (stmt)); | ||
1127 | - expr->ops.binary.op = subcode; | ||
1128 | - expr->ops.binary.opnd0 = gimple_assign_rhs1 (stmt); | ||
1129 | - expr->ops.binary.opnd1 = gimple_assign_rhs2 (stmt); | ||
1130 | - break; | ||
1131 | + expr->kind = EXPR_BINARY; | ||
1132 | + expr->type = TREE_TYPE (gimple_assign_lhs (stmt)); | ||
1133 | + expr->ops.binary.op = subcode; | ||
1134 | + expr->ops.binary.opnd0 = gimple_assign_rhs1 (stmt); | ||
1135 | + expr->ops.binary.opnd1 = gimple_assign_rhs2 (stmt); | ||
1136 | + break; | ||
1137 | + case GIMPLE_TERNARY_RHS: | 1103 | + case GIMPLE_TERNARY_RHS: |
1138 | + expr->kind = EXPR_TERNARY; | 1104 | + expr->kind = EXPR_TERNARY; |
1139 | + expr->type = TREE_TYPE (gimple_assign_lhs (stmt)); | 1105 | + expr->type = TREE_TYPE (gimple_assign_lhs (stmt)); |
1140 | + expr->ops.ternary.op = subcode; | 1106 | + expr->ops.ternary.op = subcode; |
1141 | + expr->ops.ternary.opnd0 = gimple_assign_rhs1 (stmt); | 1107 | + expr->ops.ternary.opnd0 = gimple_assign_rhs1 (stmt); |
1142 | + expr->ops.ternary.opnd1 = gimple_assign_rhs2 (stmt); | 1108 | + expr->ops.ternary.opnd1 = gimple_assign_rhs2 (stmt); |
1143 | + expr->ops.ternary.opnd2 = gimple_assign_rhs3 (stmt); | 1109 | + expr->ops.ternary.opnd2 = gimple_assign_rhs3 (stmt); |
1144 | + break; | 1110 | + break; |
1145 | default: | 1111 | default: |
1146 | gcc_unreachable (); | 1112 | gcc_unreachable (); |
1147 | } | 1113 | } |
1148 | @@ -374,23 +384,40 @@ | 1114 | @@ -373,23 +383,40 @@ |
1149 | expr1->ops.unary.opnd, 0); | 1115 | expr1->ops.unary.opnd, 0); |
1150 | 1116 | ||
1151 | case EXPR_BINARY: | 1117 | case EXPR_BINARY: |
1152 | - { | 1118 | - { |
1153 | - if (expr0->ops.binary.op != expr1->ops.binary.op) | 1119 | - if (expr0->ops.binary.op != expr1->ops.binary.op) |
1154 | - return false; | 1120 | - return false; |
1155 | - | 1121 | + if (expr0->ops.binary.op != expr1->ops.binary.op) |
1122 | + return false; | ||
1123 | |||
1156 | - if (operand_equal_p (expr0->ops.binary.opnd0, | 1124 | - if (operand_equal_p (expr0->ops.binary.opnd0, |
1157 | - expr1->ops.binary.opnd0, 0) | 1125 | - expr1->ops.binary.opnd0, 0) |
1158 | - && operand_equal_p (expr0->ops.binary.opnd1, | 1126 | - && operand_equal_p (expr0->ops.binary.opnd1, |
@@ -1166,9 +1134,6 @@ | |||
1166 | - && operand_equal_p (expr0->ops.binary.opnd1, | 1134 | - && operand_equal_p (expr0->ops.binary.opnd1, |
1167 | - expr1->ops.binary.opnd0, 0)); | 1135 | - expr1->ops.binary.opnd0, 0)); |
1168 | - } | 1136 | - } |
1169 | + if (expr0->ops.binary.op != expr1->ops.binary.op) | ||
1170 | + return false; | ||
1171 | + | ||
1172 | + if (operand_equal_p (expr0->ops.binary.opnd0, | 1137 | + if (operand_equal_p (expr0->ops.binary.opnd0, |
1173 | + expr1->ops.binary.opnd0, 0) | 1138 | + expr1->ops.binary.opnd0, 0) |
1174 | + && operand_equal_p (expr0->ops.binary.opnd1, | 1139 | + && operand_equal_p (expr0->ops.binary.opnd1, |
@@ -1203,7 +1168,7 @@ | |||
1203 | 1168 | ||
1204 | case EXPR_CALL: | 1169 | case EXPR_CALL: |
1205 | { | 1170 | { |
1206 | @@ -453,8 +480,8 @@ | 1171 | @@ -452,8 +479,8 @@ |
1207 | case EXPR_BINARY: | 1172 | case EXPR_BINARY: |
1208 | val = iterative_hash_object (expr->ops.binary.op, val); | 1173 | val = iterative_hash_object (expr->ops.binary.op, val); |
1209 | if (commutative_tree_code (expr->ops.binary.op)) | 1174 | if (commutative_tree_code (expr->ops.binary.op)) |
@@ -1214,7 +1179,7 @@ | |||
1214 | else | 1179 | else |
1215 | { | 1180 | { |
1216 | val = iterative_hash_expr (expr->ops.binary.opnd0, val); | 1181 | val = iterative_hash_expr (expr->ops.binary.opnd0, val); |
1217 | @@ -462,6 +489,19 @@ | 1182 | @@ -461,6 +488,19 @@ |
1218 | } | 1183 | } |
1219 | break; | 1184 | break; |
1220 | 1185 | ||
@@ -1234,7 +1199,7 @@ | |||
1234 | case EXPR_CALL: | 1199 | case EXPR_CALL: |
1235 | { | 1200 | { |
1236 | size_t i; | 1201 | size_t i; |
1237 | @@ -514,6 +554,16 @@ | 1202 | @@ -513,6 +553,16 @@ |
1238 | print_generic_expr (stream, element->expr.ops.binary.opnd1, 0); | 1203 | print_generic_expr (stream, element->expr.ops.binary.opnd1, 0); |
1239 | break; | 1204 | break; |
1240 | 1205 | ||
@@ -1251,11 +1216,11 @@ | |||
1251 | case EXPR_CALL: | 1216 | case EXPR_CALL: |
1252 | { | 1217 | { |
1253 | size_t i; | 1218 | size_t i; |
1254 | 1219 | Index: gcc-4_5-branch/gcc/tree-ssa-math-opts.c | |
1255 | === modified file 'gcc/tree-ssa-math-opts.c' | 1220 | =================================================================== |
1256 | --- old/gcc/tree-ssa-math-opts.c 2010-09-01 13:29:58 +0000 | 1221 | --- gcc-4_5-branch.orig/gcc/tree-ssa-math-opts.c 2011-07-22 16:59:24.000000000 -0700 |
1257 | +++ new/gcc/tree-ssa-math-opts.c 2010-09-16 09:15:46 +0000 | 1222 | +++ gcc-4_5-branch/gcc/tree-ssa-math-opts.c 2011-07-22 16:59:28.611747691 -0700 |
1258 | @@ -1261,6 +1261,235 @@ | 1223 | @@ -1270,6 +1270,235 @@ |
1259 | } | 1224 | } |
1260 | }; | 1225 | }; |
1261 | 1226 | ||
@@ -1491,7 +1456,7 @@ | |||
1491 | /* Find integer multiplications where the operands are extended from | 1456 | /* Find integer multiplications where the operands are extended from |
1492 | smaller types, and replace the MULT_EXPR with a WIDEN_MULT_EXPR | 1457 | smaller types, and replace the MULT_EXPR with a WIDEN_MULT_EXPR |
1493 | where appropriate. */ | 1458 | where appropriate. */ |
1494 | @@ -1278,94 +1507,19 @@ | 1459 | @@ -1287,94 +1516,19 @@ |
1495 | for (gsi = gsi_after_labels (bb); !gsi_end_p (gsi); gsi_next (&gsi)) | 1460 | for (gsi = gsi_after_labels (bb); !gsi_end_p (gsi); gsi_next (&gsi)) |
1496 | { | 1461 | { |
1497 | gimple stmt = gsi_stmt (gsi); | 1462 | gimple stmt = gsi_stmt (gsi); |
@@ -1499,11 +1464,13 @@ | |||
1499 | - tree type, type1 = NULL, type2 = NULL; | 1464 | - tree type, type1 = NULL, type2 = NULL; |
1500 | - tree rhs1, rhs2, rhs1_convop = NULL, rhs2_convop = NULL; | 1465 | - tree rhs1, rhs2, rhs1_convop = NULL, rhs2_convop = NULL; |
1501 | - enum tree_code rhs1_code, rhs2_code; | 1466 | - enum tree_code rhs1_code, rhs2_code; |
1502 | - | 1467 | + enum tree_code code; |
1468 | |||
1503 | - if (!is_gimple_assign (stmt) | 1469 | - if (!is_gimple_assign (stmt) |
1504 | - || gimple_assign_rhs_code (stmt) != MULT_EXPR) | 1470 | - || gimple_assign_rhs_code (stmt) != MULT_EXPR) |
1505 | - continue; | 1471 | + if (!is_gimple_assign (stmt)) |
1506 | - | 1472 | continue; |
1473 | |||
1507 | - type = TREE_TYPE (gimple_assign_lhs (stmt)); | 1474 | - type = TREE_TYPE (gimple_assign_lhs (stmt)); |
1508 | - | 1475 | - |
1509 | - if (TREE_CODE (type) != INTEGER_TYPE) | 1476 | - if (TREE_CODE (type) != INTEGER_TYPE) |
@@ -1581,11 +1548,6 @@ | |||
1581 | - gimple_assign_set_rhs_code (stmt, WIDEN_MULT_EXPR); | 1548 | - gimple_assign_set_rhs_code (stmt, WIDEN_MULT_EXPR); |
1582 | - update_stmt (stmt); | 1549 | - update_stmt (stmt); |
1583 | - changed = true; | 1550 | - changed = true; |
1584 | + enum tree_code code; | ||
1585 | + | ||
1586 | + if (!is_gimple_assign (stmt)) | ||
1587 | + continue; | ||
1588 | + | ||
1589 | + code = gimple_assign_rhs_code (stmt); | 1551 | + code = gimple_assign_rhs_code (stmt); |
1590 | + if (code == MULT_EXPR) | 1552 | + if (code == MULT_EXPR) |
1591 | + changed |= convert_mult_to_widen (stmt); | 1553 | + changed |= convert_mult_to_widen (stmt); |
@@ -1597,10 +1559,10 @@ | |||
1597 | return (changed ? TODO_dump_func | TODO_update_ssa | TODO_verify_ssa | 1559 | return (changed ? TODO_dump_func | TODO_update_ssa | TODO_verify_ssa |
1598 | | TODO_verify_stmts : 0); | 1560 | | TODO_verify_stmts : 0); |
1599 | } | 1561 | } |
1600 | 1562 | Index: gcc-4_5-branch/gcc/tree-ssa-operands.c | |
1601 | === modified file 'gcc/tree-ssa-operands.c' | 1563 | =================================================================== |
1602 | --- old/gcc/tree-ssa-operands.c 2010-04-02 18:54:46 +0000 | 1564 | --- gcc-4_5-branch.orig/gcc/tree-ssa-operands.c 2011-07-22 16:58:48.000000000 -0700 |
1603 | +++ new/gcc/tree-ssa-operands.c 2010-09-16 09:15:46 +0000 | 1565 | +++ gcc-4_5-branch/gcc/tree-ssa-operands.c 2011-07-22 16:59:28.611747691 -0700 |
1604 | @@ -994,11 +994,13 @@ | 1566 | @@ -994,11 +994,13 @@ |
1605 | 1567 | ||
1606 | case DOT_PROD_EXPR: | 1568 | case DOT_PROD_EXPR: |
@@ -1618,11 +1580,11 @@ | |||
1618 | } | 1580 | } |
1619 | 1581 | ||
1620 | case FUNCTION_DECL: | 1582 | case FUNCTION_DECL: |
1621 | 1583 | Index: gcc-4_5-branch/gcc/tree-ssa-sccvn.c | |
1622 | === modified file 'gcc/tree-ssa-sccvn.c' | 1584 | =================================================================== |
1623 | --- old/gcc/tree-ssa-sccvn.c 2010-05-14 11:40:18 +0000 | 1585 | --- gcc-4_5-branch.orig/gcc/tree-ssa-sccvn.c 2011-07-22 16:58:48.000000000 -0700 |
1624 | +++ new/gcc/tree-ssa-sccvn.c 2010-09-16 09:15:46 +0000 | 1586 | +++ gcc-4_5-branch/gcc/tree-ssa-sccvn.c 2011-07-22 16:59:28.611747691 -0700 |
1625 | @@ -2277,6 +2277,10 @@ | 1587 | @@ -2298,6 +2298,10 @@ |
1626 | case GIMPLE_BINARY_RHS: | 1588 | case GIMPLE_BINARY_RHS: |
1627 | return (is_gimple_min_invariant (gimple_assign_rhs1 (stmt)) | 1589 | return (is_gimple_min_invariant (gimple_assign_rhs1 (stmt)) |
1628 | || is_gimple_min_invariant (gimple_assign_rhs2 (stmt))); | 1590 | || is_gimple_min_invariant (gimple_assign_rhs2 (stmt))); |
@@ -1633,10 +1595,10 @@ | |||
1633 | case GIMPLE_SINGLE_RHS: | 1595 | case GIMPLE_SINGLE_RHS: |
1634 | /* Constants inside reference ops are rarely interesting, but | 1596 | /* Constants inside reference ops are rarely interesting, but |
1635 | it can take a lot of looking to find them. */ | 1597 | it can take a lot of looking to find them. */ |
1636 | 1598 | Index: gcc-4_5-branch/gcc/tree-ssa-threadedge.c | |
1637 | === modified file 'gcc/tree-ssa-threadedge.c' | 1599 | =================================================================== |
1638 | --- old/gcc/tree-ssa-threadedge.c 2009-11-25 10:55:54 +0000 | 1600 | --- gcc-4_5-branch.orig/gcc/tree-ssa-threadedge.c 2011-07-22 16:58:48.000000000 -0700 |
1639 | +++ new/gcc/tree-ssa-threadedge.c 2010-09-16 09:15:46 +0000 | 1601 | +++ gcc-4_5-branch/gcc/tree-ssa-threadedge.c 2011-07-22 16:59:28.611747691 -0700 |
1640 | @@ -247,14 +247,14 @@ | 1602 | @@ -247,14 +247,14 @@ |
1641 | 1603 | ||
1642 | return fold (rhs); | 1604 | return fold (rhs); |
@@ -1672,10 +1634,10 @@ | |||
1672 | default: | 1634 | default: |
1673 | gcc_unreachable (); | 1635 | gcc_unreachable (); |
1674 | } | 1636 | } |
1675 | 1637 | Index: gcc-4_5-branch/gcc/tree-vrp.c | |
1676 | === modified file 'gcc/tree-vrp.c' | 1638 | =================================================================== |
1677 | --- old/gcc/tree-vrp.c 2010-06-14 14:23:31 +0000 | 1639 | --- gcc-4_5-branch.orig/gcc/tree-vrp.c 2011-07-22 16:58:48.000000000 -0700 |
1678 | +++ new/gcc/tree-vrp.c 2010-09-16 09:15:46 +0000 | 1640 | +++ gcc-4_5-branch/gcc/tree-vrp.c 2011-07-22 16:59:28.621747691 -0700 |
1679 | @@ -864,6 +864,8 @@ | 1641 | @@ -864,6 +864,8 @@ |
1680 | gimple_assign_rhs1 (stmt), | 1642 | gimple_assign_rhs1 (stmt), |
1681 | gimple_assign_rhs2 (stmt), | 1643 | gimple_assign_rhs2 (stmt), |
@@ -1694,11 +1656,11 @@ | |||
1694 | case GIMPLE_SINGLE_RHS: | 1656 | case GIMPLE_SINGLE_RHS: |
1695 | return tree_single_nonzero_warnv_p (gimple_assign_rhs1 (stmt), | 1657 | return tree_single_nonzero_warnv_p (gimple_assign_rhs1 (stmt), |
1696 | strict_overflow_p); | 1658 | strict_overflow_p); |
1697 | 1659 | Index: gcc-4_5-branch/gcc/tree.c | |
1698 | === modified file 'gcc/tree.c' | 1660 | =================================================================== |
1699 | --- old/gcc/tree.c 2010-08-10 13:31:21 +0000 | 1661 | --- gcc-4_5-branch.orig/gcc/tree.c 2011-07-22 16:59:13.000000000 -0700 |
1700 | +++ new/gcc/tree.c 2010-09-16 09:15:46 +0000 | 1662 | +++ gcc-4_5-branch/gcc/tree.c 2011-07-22 16:59:28.621747691 -0700 |
1701 | @@ -6538,6 +6538,23 @@ | 1663 | @@ -6548,6 +6548,23 @@ |
1702 | return false; | 1664 | return false; |
1703 | } | 1665 | } |
1704 | 1666 | ||
@@ -1722,10 +1684,10 @@ | |||
1722 | /* Generate a hash value for an expression. This can be used iteratively | 1684 | /* Generate a hash value for an expression. This can be used iteratively |
1723 | by passing a previous result as the VAL argument. | 1685 | by passing a previous result as the VAL argument. |
1724 | 1686 | ||
1725 | 1687 | Index: gcc-4_5-branch/gcc/tree.def | |
1726 | === modified file 'gcc/tree.def' | 1688 | =================================================================== |
1727 | --- old/gcc/tree.def 2010-04-02 18:54:46 +0000 | 1689 | --- gcc-4_5-branch.orig/gcc/tree.def 2011-07-22 16:58:48.000000000 -0700 |
1728 | +++ new/gcc/tree.def 2010-09-16 09:15:46 +0000 | 1690 | +++ gcc-4_5-branch/gcc/tree.def 2011-07-22 16:59:28.631747691 -0700 |
1729 | @@ -1083,6 +1083,18 @@ | 1691 | @@ -1083,6 +1083,18 @@ |
1730 | the arguments from type t1 to type t2, and then multiplying them. */ | 1692 | the arguments from type t1 to type t2, and then multiplying them. */ |
1731 | DEFTREECODE (WIDEN_MULT_EXPR, "widen_mult_expr", tcc_binary, 2) | 1693 | DEFTREECODE (WIDEN_MULT_EXPR, "widen_mult_expr", tcc_binary, 2) |
@@ -1745,11 +1707,11 @@ | |||
1745 | /* Whole vector left/right shift in bits. | 1707 | /* Whole vector left/right shift in bits. |
1746 | Operand 0 is a vector to be shifted. | 1708 | Operand 0 is a vector to be shifted. |
1747 | Operand 1 is an integer shift amount in bits. */ | 1709 | Operand 1 is an integer shift amount in bits. */ |
1748 | 1710 | Index: gcc-4_5-branch/gcc/tree.h | |
1749 | === modified file 'gcc/tree.h' | 1711 | =================================================================== |
1750 | --- old/gcc/tree.h 2010-08-10 13:31:21 +0000 | 1712 | --- gcc-4_5-branch.orig/gcc/tree.h 2011-07-22 16:59:13.000000000 -0700 |
1751 | +++ new/gcc/tree.h 2010-09-16 09:15:46 +0000 | 1713 | +++ gcc-4_5-branch/gcc/tree.h 2011-07-22 16:59:28.631747691 -0700 |
1752 | @@ -4705,6 +4705,7 @@ | 1714 | @@ -4687,6 +4687,7 @@ |
1753 | extern int type_num_arguments (const_tree); | 1715 | extern int type_num_arguments (const_tree); |
1754 | extern bool associative_tree_code (enum tree_code); | 1716 | extern bool associative_tree_code (enum tree_code); |
1755 | extern bool commutative_tree_code (enum tree_code); | 1717 | extern bool commutative_tree_code (enum tree_code); |
@@ -1757,4 +1719,3 @@ | |||
1757 | extern tree upper_bound_in_type (tree, tree); | 1719 | extern tree upper_bound_in_type (tree, tree); |
1758 | extern tree lower_bound_in_type (tree, tree); | 1720 | extern tree lower_bound_in_type (tree, tree); |
1759 | extern int operand_equal_for_phi_arg_p (const_tree, const_tree); | 1721 | extern int operand_equal_for_phi_arg_p (const_tree, const_tree); |
1760 | |||
diff --git a/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99436.patch b/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99436.patch index deb749efc..1373b83ed 100644 --- a/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99436.patch +++ b/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99436.patch | |||
@@ -6,8 +6,10 @@ | |||
6 | (try_combine, simplify_if_then_else): Update. | 6 | (try_combine, simplify_if_then_else): Update. |
7 | 7 | ||
8 | === modified file 'gcc/combine.c' | 8 | === modified file 'gcc/combine.c' |
9 | --- old/gcc/combine.c 2010-11-04 12:39:28 +0000 | 9 | Index: gcc-4_5-branch/gcc/combine.c |
10 | +++ new/gcc/combine.c 2010-11-25 11:11:45 +0000 | 10 | =================================================================== |
11 | --- gcc-4_5-branch.orig/gcc/combine.c 2011-07-22 17:24:46.000000000 -0700 | ||
12 | +++ gcc-4_5-branch/gcc/combine.c 2011-07-22 17:34:41.961747206 -0700 | ||
11 | @@ -392,8 +392,8 @@ | 13 | @@ -392,8 +392,8 @@ |
12 | static void undo_all (void); | 14 | static void undo_all (void); |
13 | static void undo_commit (void); | 15 | static void undo_commit (void); |
@@ -19,7 +21,7 @@ | |||
19 | static rtx simplify_if_then_else (rtx); | 21 | static rtx simplify_if_then_else (rtx); |
20 | static rtx simplify_set (rtx); | 22 | static rtx simplify_set (rtx); |
21 | static rtx simplify_logical (rtx); | 23 | static rtx simplify_logical (rtx); |
22 | @@ -2944,12 +2944,12 @@ | 24 | @@ -2962,12 +2962,12 @@ |
23 | if (i1) | 25 | if (i1) |
24 | { | 26 | { |
25 | subst_low_luid = DF_INSN_LUID (i1); | 27 | subst_low_luid = DF_INSN_LUID (i1); |
@@ -34,7 +36,7 @@ | |||
34 | } | 36 | } |
35 | } | 37 | } |
36 | 38 | ||
37 | @@ -2960,7 +2960,7 @@ | 39 | @@ -2978,7 +2978,7 @@ |
38 | to avoid self-referential rtl. */ | 40 | to avoid self-referential rtl. */ |
39 | 41 | ||
40 | subst_low_luid = DF_INSN_LUID (i2); | 42 | subst_low_luid = DF_INSN_LUID (i2); |
@@ -43,7 +45,7 @@ | |||
43 | ! i1_feeds_i3 && i1dest_in_i1src); | 45 | ! i1_feeds_i3 && i1dest_in_i1src); |
44 | substed_i2 = 1; | 46 | substed_i2 = 1; |
45 | 47 | ||
46 | @@ -2991,7 +2991,7 @@ | 48 | @@ -3009,7 +3009,7 @@ |
47 | 49 | ||
48 | n_occurrences = 0; | 50 | n_occurrences = 0; |
49 | subst_low_luid = DF_INSN_LUID (i1); | 51 | subst_low_luid = DF_INSN_LUID (i1); |
@@ -52,7 +54,7 @@ | |||
52 | substed_i1 = 1; | 54 | substed_i1 = 1; |
53 | } | 55 | } |
54 | 56 | ||
55 | @@ -3053,7 +3053,7 @@ | 57 | @@ -3071,7 +3071,7 @@ |
56 | else | 58 | else |
57 | /* See comment where i2pat is assigned. */ | 59 | /* See comment where i2pat is assigned. */ |
58 | XVECEXP (newpat, 0, --total_sets) | 60 | XVECEXP (newpat, 0, --total_sets) |
@@ -61,7 +63,7 @@ | |||
61 | } | 63 | } |
62 | } | 64 | } |
63 | 65 | ||
64 | @@ -4605,11 +4605,13 @@ | 66 | @@ -4623,11 +4623,13 @@ |
65 | 67 | ||
66 | IN_DEST is nonzero if we are processing the SET_DEST of a SET. | 68 | IN_DEST is nonzero if we are processing the SET_DEST of a SET. |
67 | 69 | ||
@@ -76,7 +78,7 @@ | |||
76 | { | 78 | { |
77 | enum rtx_code code = GET_CODE (x); | 79 | enum rtx_code code = GET_CODE (x); |
78 | enum machine_mode op0_mode = VOIDmode; | 80 | enum machine_mode op0_mode = VOIDmode; |
79 | @@ -4670,7 +4672,7 @@ | 81 | @@ -4688,7 +4690,7 @@ |
80 | && GET_CODE (XVECEXP (x, 0, 0)) == SET | 82 | && GET_CODE (XVECEXP (x, 0, 0)) == SET |
81 | && GET_CODE (SET_SRC (XVECEXP (x, 0, 0))) == ASM_OPERANDS) | 83 | && GET_CODE (SET_SRC (XVECEXP (x, 0, 0))) == ASM_OPERANDS) |
82 | { | 84 | { |
@@ -85,7 +87,7 @@ | |||
85 | 87 | ||
86 | /* If this substitution failed, this whole thing fails. */ | 88 | /* If this substitution failed, this whole thing fails. */ |
87 | if (GET_CODE (new_rtx) == CLOBBER | 89 | if (GET_CODE (new_rtx) == CLOBBER |
88 | @@ -4687,7 +4689,7 @@ | 90 | @@ -4705,7 +4707,7 @@ |
89 | && GET_CODE (dest) != CC0 | 91 | && GET_CODE (dest) != CC0 |
90 | && GET_CODE (dest) != PC) | 92 | && GET_CODE (dest) != PC) |
91 | { | 93 | { |
@@ -94,7 +96,7 @@ | |||
94 | 96 | ||
95 | /* If this substitution failed, this whole thing fails. */ | 97 | /* If this substitution failed, this whole thing fails. */ |
96 | if (GET_CODE (new_rtx) == CLOBBER | 98 | if (GET_CODE (new_rtx) == CLOBBER |
97 | @@ -4733,8 +4735,8 @@ | 99 | @@ -4751,8 +4753,8 @@ |
98 | } | 100 | } |
99 | else | 101 | else |
100 | { | 102 | { |
@@ -105,7 +107,7 @@ | |||
105 | 107 | ||
106 | /* If this substitution failed, this whole thing | 108 | /* If this substitution failed, this whole thing |
107 | fails. */ | 109 | fails. */ |
108 | @@ -4811,7 +4813,9 @@ | 110 | @@ -4829,7 +4831,9 @@ |
109 | && (code == SUBREG || code == STRICT_LOW_PART | 111 | && (code == SUBREG || code == STRICT_LOW_PART |
110 | || code == ZERO_EXTRACT)) | 112 | || code == ZERO_EXTRACT)) |
111 | || code == SET) | 113 | || code == SET) |
@@ -116,7 +118,7 @@ | |||
116 | 118 | ||
117 | /* If we found that we will have to reject this combination, | 119 | /* If we found that we will have to reject this combination, |
118 | indicate that by returning the CLOBBER ourselves, rather than | 120 | indicate that by returning the CLOBBER ourselves, rather than |
119 | @@ -4868,7 +4872,7 @@ | 121 | @@ -4886,7 +4890,7 @@ |
120 | /* If X is sufficiently simple, don't bother trying to do anything | 122 | /* If X is sufficiently simple, don't bother trying to do anything |
121 | with it. */ | 123 | with it. */ |
122 | if (code != CONST_INT && code != REG && code != CLOBBER) | 124 | if (code != CONST_INT && code != REG && code != CLOBBER) |
@@ -125,7 +127,7 @@ | |||
125 | 127 | ||
126 | if (GET_CODE (x) == code) | 128 | if (GET_CODE (x) == code) |
127 | break; | 129 | break; |
128 | @@ -4888,10 +4892,12 @@ | 130 | @@ -4906,10 +4910,12 @@ |
129 | expression. | 131 | expression. |
130 | 132 | ||
131 | OP0_MODE is the original mode of XEXP (x, 0). IN_DEST is nonzero | 133 | OP0_MODE is the original mode of XEXP (x, 0). IN_DEST is nonzero |
@@ -140,7 +142,7 @@ | |||
140 | { | 142 | { |
141 | enum rtx_code code = GET_CODE (x); | 143 | enum rtx_code code = GET_CODE (x); |
142 | enum machine_mode mode = GET_MODE (x); | 144 | enum machine_mode mode = GET_MODE (x); |
143 | @@ -4946,8 +4952,8 @@ | 145 | @@ -4964,8 +4970,8 @@ |
144 | false arms to store-flag values. Be careful to use copy_rtx | 146 | false arms to store-flag values. Be careful to use copy_rtx |
145 | here since true_rtx or false_rtx might share RTL with x as a | 147 | here since true_rtx or false_rtx might share RTL with x as a |
146 | result of the if_then_else_cond call above. */ | 148 | result of the if_then_else_cond call above. */ |
@@ -151,16 +153,16 @@ | |||
151 | 153 | ||
152 | /* If true_rtx and false_rtx are not general_operands, an if_then_else | 154 | /* If true_rtx and false_rtx are not general_operands, an if_then_else |
153 | is unlikely to be simpler. */ | 155 | is unlikely to be simpler. */ |
154 | @@ -5291,7 +5297,7 @@ | 156 | @@ -5309,7 +5315,7 @@ |
155 | { | 157 | { |
156 | /* Try to simplify the expression further. */ | 158 | /* Try to simplify the expression further. */ |
157 | rtx tor = simplify_gen_binary (IOR, mode, XEXP (x, 0), XEXP (x, 1)); | 159 | rtx tor = simplify_gen_binary (IOR, mode, XEXP (x, 0), XEXP (x, 1)); |
158 | - temp = combine_simplify_rtx (tor, mode, in_dest); | 160 | - temp = combine_simplify_rtx (tor, VOIDmode, in_dest); |
159 | + temp = combine_simplify_rtx (tor, mode, in_dest, 0); | 161 | + temp = combine_simplify_rtx (tor, VOIDmode, in_dest, 0); |
160 | 162 | ||
161 | /* If we could, great. If not, do not go ahead with the IOR | 163 | /* If we could, great. If not, do not go ahead with the IOR |
162 | replacement, since PLUS appears in many special purpose | 164 | replacement, since PLUS appears in many special purpose |
163 | @@ -5384,7 +5390,16 @@ | 165 | @@ -5402,7 +5408,16 @@ |
164 | ZERO_EXTRACT is indeed appropriate, it will be placed back by | 166 | ZERO_EXTRACT is indeed appropriate, it will be placed back by |
165 | the call to make_compound_operation in the SET case. */ | 167 | the call to make_compound_operation in the SET case. */ |
166 | 168 | ||
@@ -178,7 +180,7 @@ | |||
178 | && new_code == NE && GET_MODE_CLASS (mode) == MODE_INT | 180 | && new_code == NE && GET_MODE_CLASS (mode) == MODE_INT |
179 | && op1 == const0_rtx | 181 | && op1 == const0_rtx |
180 | && mode == GET_MODE (op0) | 182 | && mode == GET_MODE (op0) |
181 | @@ -5628,11 +5643,11 @@ | 183 | @@ -5646,11 +5661,11 @@ |
182 | if (reg_mentioned_p (from, true_rtx)) | 184 | if (reg_mentioned_p (from, true_rtx)) |
183 | true_rtx = subst (known_cond (copy_rtx (true_rtx), true_code, | 185 | true_rtx = subst (known_cond (copy_rtx (true_rtx), true_code, |
184 | from, true_val), | 186 | from, true_val), |
@@ -192,7 +194,7 @@ | |||
192 | 194 | ||
193 | SUBST (XEXP (x, 1), swapped ? false_rtx : true_rtx); | 195 | SUBST (XEXP (x, 1), swapped ? false_rtx : true_rtx); |
194 | SUBST (XEXP (x, 2), swapped ? true_rtx : false_rtx); | 196 | SUBST (XEXP (x, 2), swapped ? true_rtx : false_rtx); |
195 | @@ -5849,11 +5864,11 @@ | 197 | @@ -5867,11 +5882,11 @@ |
196 | { | 198 | { |
197 | temp = subst (simplify_gen_relational (true_code, m, VOIDmode, | 199 | temp = subst (simplify_gen_relational (true_code, m, VOIDmode, |
198 | cond_op0, cond_op1), | 200 | cond_op0, cond_op1), |
@@ -206,4 +208,3 @@ | |||
206 | temp = simplify_gen_binary (op, m, gen_lowpart (m, z), temp); | 208 | temp = simplify_gen_binary (op, m, gen_lowpart (m, z), temp); |
207 | 209 | ||
208 | if (extend_op != UNKNOWN) | 210 | if (extend_op != UNKNOWN) |
209 | |||
diff --git a/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99519.patch b/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99519.patch new file mode 100644 index 000000000..5337070af --- /dev/null +++ b/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99519.patch | |||
@@ -0,0 +1,25 @@ | |||
1 | 2011-07-01 Ramana Radhakrishnan <ramana.radhakrishnan@linaro.org> | ||
2 | |||
3 | Backport from mainline. | ||
4 | LP 744754 | ||
5 | 2011-04-17 Chung-Lin Tang <cltang@codesourcery.com> | ||
6 | |||
7 | * config/arm/arm.c (neon_struct_mem_operand): | ||
8 | Support POST_INC/PRE_DEC memory operands. | ||
9 | |||
10 | === modified file 'gcc/config/arm/arm.c' | ||
11 | --- old/gcc/config/arm/arm.c 2011-05-11 14:47:14 +0000 | ||
12 | +++ new/gcc/config/arm/arm.c 2011-06-29 10:46:39 +0000 | ||
13 | @@ -9322,6 +9322,11 @@ | ||
14 | if (GET_CODE (ind) == REG) | ||
15 | return arm_address_register_rtx_p (ind, 0); | ||
16 | |||
17 | + /* vldm/vstm allows POST_INC (ia) and PRE_DEC (db). */ | ||
18 | + if (GET_CODE (ind) == POST_INC | ||
19 | + || GET_CODE (ind) == PRE_DEC) | ||
20 | + return arm_address_register_rtx_p (XEXP (ind, 0), 0); | ||
21 | + | ||
22 | return FALSE; | ||
23 | } | ||
24 | |||
25 | |||
diff --git a/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99521.patch b/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99521.patch new file mode 100644 index 000000000..6d2d75bf9 --- /dev/null +++ b/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99521.patch | |||
@@ -0,0 +1,166 @@ | |||
1 | 2011-07-08 Richard Sandiford <rdsandiford@googlemail.com> | ||
2 | |||
3 | gcc/ | ||
4 | * builtins.c (get_object_alignment): Fix comment. | ||
5 | * fold-const.c (get_pointer_modulus_and_residue): Remove | ||
6 | allow_func_align. Use get_object_alignment. | ||
7 | (fold_binary_loc): Update caller. | ||
8 | |||
9 | 2011-07-08 Richard Sandiford <rdsandiford@googlemail.com> | ||
10 | |||
11 | gcc/ | ||
12 | Backport from mainline: | ||
13 | |||
14 | 2011-06-29 Richard Sandiford <richard.sandiford@linaro.org> | ||
15 | |||
16 | PR tree-optimization/49545 | ||
17 | * builtins.c (get_object_alignment_1): Update function comment. | ||
18 | Do not use DECL_ALIGN for functions, but test | ||
19 | TARGET_PTRMEMFUNC_VBIT_LOCATION instead. | ||
20 | * fold-const.c (get_pointer_modulus_and_residue): Don't check | ||
21 | for functions here. | ||
22 | |||
23 | gcc/testsuite/ | ||
24 | Backport from mainline: | ||
25 | |||
26 | 2011-06-29 Richard Sandiford <richard.sandiford@linaro.org> | ||
27 | |||
28 | * gcc.dg/torture/pr49169.c: Restrict to ARM and MIPS targets. | ||
29 | |||
30 | 2011-07-08 Richard Sandiford <richard.sandiford@linaro.org> | ||
31 | |||
32 | gcc/ | ||
33 | Backport from mainline: | ||
34 | |||
35 | 2011-07-27 Richard Guenther <rguenther@suse.de> | ||
36 | |||
37 | PR tree-optimization/49169 | ||
38 | * fold-const.c (get_pointer_modulus_and_residue): Don't rely on | ||
39 | the alignment of function decls. | ||
40 | |||
41 | gcc/testsuite/ | ||
42 | Backport from mainline: | ||
43 | |||
44 | 2011-07-27 Michael Hope <michael.hope@linaro.org> | ||
45 | Richard Sandiford <richard.sandiford@linaro.org> | ||
46 | |||
47 | PR tree-optimization/49169 | ||
48 | * gcc.dg/torture/pr49169.c: New test. | ||
49 | |||
50 | === modified file 'gcc/builtins.c' | ||
51 | --- old/gcc/builtins.c 2011-01-06 11:02:44 +0000 | ||
52 | +++ new/gcc/builtins.c 2011-06-29 09:59:48 +0000 | ||
53 | @@ -263,7 +263,14 @@ | ||
54 | |||
55 | /* Return the alignment in bits of EXP, an object. | ||
56 | Don't return more than MAX_ALIGN no matter what, ALIGN is the inital | ||
57 | - guessed alignment e.g. from type alignment. */ | ||
58 | + guessed alignment e.g. from type alignment. | ||
59 | + | ||
60 | + Note that the address (and thus the alignment) computed here is based | ||
61 | + on the address to which a symbol resolves, whereas DECL_ALIGN is based | ||
62 | + on the address at which an object is actually located. These two | ||
63 | + addresses are not always the same. For example, on ARM targets, | ||
64 | + the address &foo of a Thumb function foo() has the lowest bit set, | ||
65 | + whereas foo() itself starts on an even address. */ | ||
66 | |||
67 | int | ||
68 | get_object_alignment (tree exp, unsigned int align, unsigned int max_align) | ||
69 | @@ -327,7 +334,21 @@ | ||
70 | exp = DECL_INITIAL (exp); | ||
71 | if (DECL_P (exp) | ||
72 | && TREE_CODE (exp) != LABEL_DECL) | ||
73 | - align = MIN (inner, DECL_ALIGN (exp)); | ||
74 | + { | ||
75 | + if (TREE_CODE (exp) == FUNCTION_DECL) | ||
76 | + { | ||
77 | + /* Function addresses can encode extra information besides their | ||
78 | + alignment. However, if TARGET_PTRMEMFUNC_VBIT_LOCATION | ||
79 | + allows the low bit to be used as a virtual bit, we know | ||
80 | + that the address itself must be 2-byte aligned. */ | ||
81 | + if (TARGET_PTRMEMFUNC_VBIT_LOCATION == ptrmemfunc_vbit_in_pfn) | ||
82 | + align = 2 * BITS_PER_UNIT; | ||
83 | + else | ||
84 | + align = BITS_PER_UNIT; | ||
85 | + } | ||
86 | + else | ||
87 | + align = MIN (inner, DECL_ALIGN (exp)); | ||
88 | + } | ||
89 | #ifdef CONSTANT_ALIGNMENT | ||
90 | else if (CONSTANT_CLASS_P (exp)) | ||
91 | align = MIN (inner, (unsigned)CONSTANT_ALIGNMENT (exp, align)); | ||
92 | |||
93 | === modified file 'gcc/fold-const.c' | ||
94 | --- old/gcc/fold-const.c 2011-05-05 14:28:53 +0000 | ||
95 | +++ new/gcc/fold-const.c 2011-07-08 12:54:44 +0000 | ||
96 | @@ -10030,15 +10030,10 @@ | ||
97 | 0 <= N < M as is common. In general, the precise value of P is unknown. | ||
98 | M is chosen as large as possible such that constant N can be determined. | ||
99 | |||
100 | - Returns M and sets *RESIDUE to N. | ||
101 | - | ||
102 | - If ALLOW_FUNC_ALIGN is true, do take functions' DECL_ALIGN_UNIT into | ||
103 | - account. This is not always possible due to PR 35705. | ||
104 | - */ | ||
105 | + Returns M and sets *RESIDUE to N. */ | ||
106 | |||
107 | static unsigned HOST_WIDE_INT | ||
108 | -get_pointer_modulus_and_residue (tree expr, unsigned HOST_WIDE_INT *residue, | ||
109 | - bool allow_func_align) | ||
110 | +get_pointer_modulus_and_residue (tree expr, unsigned HOST_WIDE_INT *residue) | ||
111 | { | ||
112 | enum tree_code code; | ||
113 | |||
114 | @@ -10068,9 +10063,8 @@ | ||
115 | } | ||
116 | } | ||
117 | |||
118 | - if (DECL_P (expr) | ||
119 | - && (allow_func_align || TREE_CODE (expr) != FUNCTION_DECL)) | ||
120 | - return DECL_ALIGN_UNIT (expr); | ||
121 | + if (DECL_P (expr)) | ||
122 | + return get_object_alignment (expr, BITS_PER_UNIT, ~0U) / BITS_PER_UNIT; | ||
123 | } | ||
124 | else if (code == POINTER_PLUS_EXPR) | ||
125 | { | ||
126 | @@ -10080,8 +10074,7 @@ | ||
127 | |||
128 | op0 = TREE_OPERAND (expr, 0); | ||
129 | STRIP_NOPS (op0); | ||
130 | - modulus = get_pointer_modulus_and_residue (op0, residue, | ||
131 | - allow_func_align); | ||
132 | + modulus = get_pointer_modulus_and_residue (op0, residue); | ||
133 | |||
134 | op1 = TREE_OPERAND (expr, 1); | ||
135 | STRIP_NOPS (op1); | ||
136 | @@ -11801,8 +11794,7 @@ | ||
137 | unsigned HOST_WIDE_INT modulus, residue; | ||
138 | unsigned HOST_WIDE_INT low = TREE_INT_CST_LOW (arg1); | ||
139 | |||
140 | - modulus = get_pointer_modulus_and_residue (arg0, &residue, | ||
141 | - integer_onep (arg1)); | ||
142 | + modulus = get_pointer_modulus_and_residue (arg0, &residue); | ||
143 | |||
144 | /* This works because modulus is a power of 2. If this weren't the | ||
145 | case, we'd have to replace it by its greatest power-of-2 | ||
146 | |||
147 | === added file 'gcc/testsuite/gcc.dg/torture/pr49169.c' | ||
148 | --- old/gcc/testsuite/gcc.dg/torture/pr49169.c 1970-01-01 00:00:00 +0000 | ||
149 | +++ new/gcc/testsuite/gcc.dg/torture/pr49169.c 2011-06-29 09:59:48 +0000 | ||
150 | @@ -0,0 +1,15 @@ | ||
151 | +/* { dg-do compile { target { arm*-*-* || mips*-*-* } } } */ | ||
152 | + | ||
153 | +#include <stdlib.h> | ||
154 | +#include <stdint.h> | ||
155 | + | ||
156 | +int | ||
157 | +main (void) | ||
158 | +{ | ||
159 | + void *p = main; | ||
160 | + if ((intptr_t) p & 1) | ||
161 | + abort (); | ||
162 | + return 0; | ||
163 | +} | ||
164 | + | ||
165 | +/* { dg-final { scan-assembler "abort" } } */ | ||
166 | |||
diff --git a/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99522.patch b/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99522.patch new file mode 100644 index 000000000..cdf44b118 --- /dev/null +++ b/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99522.patch | |||
@@ -0,0 +1,210 @@ | |||
1 | 2011-07-11 Revital Eres <revital.eres@linaro.org> | ||
2 | |||
3 | Backport from mainline -r175091 | ||
4 | gcc/ | ||
5 | * modulo-sched.c (struct ps_insn): Remove row_rest_count field. | ||
6 | (struct partial_schedule): Add rows_length field. | ||
7 | (verify_partial_schedule): Check rows_length. | ||
8 | (ps_insert_empty_row): Handle rows_length. | ||
9 | (create_partial_schedule): Likewise. | ||
10 | (free_partial_schedule): Likewise. | ||
11 | (reset_partial_schedule): Likewise. | ||
12 | (create_ps_insn): Remove rest_count argument. | ||
13 | (remove_node_from_ps): Update rows_length. | ||
14 | (add_node_to_ps): Update rows_length and call create_ps_insn | ||
15 | without passing row_rest_count. | ||
16 | (rotate_partial_schedule): Update rows_length. | ||
17 | |||
18 | === modified file 'gcc/modulo-sched.c' | ||
19 | --- old/gcc/modulo-sched.c 2011-05-13 16:16:22 +0000 | ||
20 | +++ new/gcc/modulo-sched.c 2011-07-04 11:39:09 +0000 | ||
21 | @@ -134,8 +134,6 @@ | ||
22 | ps_insn_ptr next_in_row, | ||
23 | prev_in_row; | ||
24 | |||
25 | - /* The number of nodes in the same row that come after this node. */ | ||
26 | - int row_rest_count; | ||
27 | }; | ||
28 | |||
29 | /* Holds the partial schedule as an array of II rows. Each entry of the | ||
30 | @@ -149,6 +147,12 @@ | ||
31 | /* rows[i] points to linked list of insns scheduled in row i (0<=i<ii). */ | ||
32 | ps_insn_ptr *rows; | ||
33 | |||
34 | + /* rows_length[i] holds the number of instructions in the row. | ||
35 | + It is used only (as an optimization) to back off quickly from | ||
36 | + trying to schedule a node in a full row; that is, to avoid running | ||
37 | + through futile DFA state transitions. */ | ||
38 | + int *rows_length; | ||
39 | + | ||
40 | /* The earliest absolute cycle of an insn in the partial schedule. */ | ||
41 | int min_cycle; | ||
42 | |||
43 | @@ -1907,6 +1911,7 @@ | ||
44 | int ii = ps->ii; | ||
45 | int new_ii = ii + 1; | ||
46 | int row; | ||
47 | + int *rows_length_new; | ||
48 | |||
49 | verify_partial_schedule (ps, sched_nodes); | ||
50 | |||
51 | @@ -1921,9 +1926,11 @@ | ||
52 | rotate_partial_schedule (ps, PS_MIN_CYCLE (ps)); | ||
53 | |||
54 | rows_new = (ps_insn_ptr *) xcalloc (new_ii, sizeof (ps_insn_ptr)); | ||
55 | + rows_length_new = (int *) xcalloc (new_ii, sizeof (int)); | ||
56 | for (row = 0; row < split_row; row++) | ||
57 | { | ||
58 | rows_new[row] = ps->rows[row]; | ||
59 | + rows_length_new[row] = ps->rows_length[row]; | ||
60 | ps->rows[row] = NULL; | ||
61 | for (crr_insn = rows_new[row]; | ||
62 | crr_insn; crr_insn = crr_insn->next_in_row) | ||
63 | @@ -1944,6 +1951,7 @@ | ||
64 | for (row = split_row; row < ii; row++) | ||
65 | { | ||
66 | rows_new[row + 1] = ps->rows[row]; | ||
67 | + rows_length_new[row + 1] = ps->rows_length[row]; | ||
68 | ps->rows[row] = NULL; | ||
69 | for (crr_insn = rows_new[row + 1]; | ||
70 | crr_insn; crr_insn = crr_insn->next_in_row) | ||
71 | @@ -1965,6 +1973,8 @@ | ||
72 | + (SMODULO (ps->max_cycle, ii) >= split_row ? 1 : 0); | ||
73 | free (ps->rows); | ||
74 | ps->rows = rows_new; | ||
75 | + free (ps->rows_length); | ||
76 | + ps->rows_length = rows_length_new; | ||
77 | ps->ii = new_ii; | ||
78 | gcc_assert (ps->min_cycle >= 0); | ||
79 | |||
80 | @@ -2040,16 +2050,23 @@ | ||
81 | ps_insn_ptr crr_insn; | ||
82 | |||
83 | for (row = 0; row < ps->ii; row++) | ||
84 | - for (crr_insn = ps->rows[row]; crr_insn; crr_insn = crr_insn->next_in_row) | ||
85 | - { | ||
86 | - ddg_node_ptr u = crr_insn->node; | ||
87 | - | ||
88 | - gcc_assert (TEST_BIT (sched_nodes, u->cuid)); | ||
89 | - /* ??? Test also that all nodes of sched_nodes are in ps, perhaps by | ||
90 | - popcount (sched_nodes) == number of insns in ps. */ | ||
91 | - gcc_assert (SCHED_TIME (u) >= ps->min_cycle); | ||
92 | - gcc_assert (SCHED_TIME (u) <= ps->max_cycle); | ||
93 | - } | ||
94 | + { | ||
95 | + int length = 0; | ||
96 | + | ||
97 | + for (crr_insn = ps->rows[row]; crr_insn; crr_insn = crr_insn->next_in_row) | ||
98 | + { | ||
99 | + ddg_node_ptr u = crr_insn->node; | ||
100 | + | ||
101 | + length++; | ||
102 | + gcc_assert (TEST_BIT (sched_nodes, u->cuid)); | ||
103 | + /* ??? Test also that all nodes of sched_nodes are in ps, perhaps by | ||
104 | + popcount (sched_nodes) == number of insns in ps. */ | ||
105 | + gcc_assert (SCHED_TIME (u) >= ps->min_cycle); | ||
106 | + gcc_assert (SCHED_TIME (u) <= ps->max_cycle); | ||
107 | + } | ||
108 | + | ||
109 | + gcc_assert (ps->rows_length[row] == length); | ||
110 | + } | ||
111 | } | ||
112 | |||
113 | |||
114 | @@ -2455,6 +2472,7 @@ | ||
115 | { | ||
116 | partial_schedule_ptr ps = XNEW (struct partial_schedule); | ||
117 | ps->rows = (ps_insn_ptr *) xcalloc (ii, sizeof (ps_insn_ptr)); | ||
118 | + ps->rows_length = (int *) xcalloc (ii, sizeof (int)); | ||
119 | ps->ii = ii; | ||
120 | ps->history = history; | ||
121 | ps->min_cycle = INT_MAX; | ||
122 | @@ -2493,6 +2511,7 @@ | ||
123 | return; | ||
124 | free_ps_insns (ps); | ||
125 | free (ps->rows); | ||
126 | + free (ps->rows_length); | ||
127 | free (ps); | ||
128 | } | ||
129 | |||
130 | @@ -2510,6 +2529,8 @@ | ||
131 | ps->rows = (ps_insn_ptr *) xrealloc (ps->rows, new_ii | ||
132 | * sizeof (ps_insn_ptr)); | ||
133 | memset (ps->rows, 0, new_ii * sizeof (ps_insn_ptr)); | ||
134 | + ps->rows_length = (int *) xrealloc (ps->rows_length, new_ii * sizeof (int)); | ||
135 | + memset (ps->rows_length, 0, new_ii * sizeof (int)); | ||
136 | ps->ii = new_ii; | ||
137 | ps->min_cycle = INT_MAX; | ||
138 | ps->max_cycle = INT_MIN; | ||
139 | @@ -2538,14 +2559,13 @@ | ||
140 | |||
141 | /* Creates an object of PS_INSN and initializes it to the given parameters. */ | ||
142 | static ps_insn_ptr | ||
143 | -create_ps_insn (ddg_node_ptr node, int rest_count, int cycle) | ||
144 | +create_ps_insn (ddg_node_ptr node, int cycle) | ||
145 | { | ||
146 | ps_insn_ptr ps_i = XNEW (struct ps_insn); | ||
147 | |||
148 | ps_i->node = node; | ||
149 | ps_i->next_in_row = NULL; | ||
150 | ps_i->prev_in_row = NULL; | ||
151 | - ps_i->row_rest_count = rest_count; | ||
152 | ps_i->cycle = cycle; | ||
153 | |||
154 | return ps_i; | ||
155 | @@ -2578,6 +2598,8 @@ | ||
156 | if (ps_i->next_in_row) | ||
157 | ps_i->next_in_row->prev_in_row = ps_i->prev_in_row; | ||
158 | } | ||
159 | + | ||
160 | + ps->rows_length[row] -= 1; | ||
161 | free (ps_i); | ||
162 | return true; | ||
163 | } | ||
164 | @@ -2734,17 +2756,12 @@ | ||
165 | sbitmap must_precede, sbitmap must_follow) | ||
166 | { | ||
167 | ps_insn_ptr ps_i; | ||
168 | - int rest_count = 1; | ||
169 | int row = SMODULO (cycle, ps->ii); | ||
170 | |||
171 | - if (ps->rows[row] | ||
172 | - && ps->rows[row]->row_rest_count >= issue_rate) | ||
173 | + if (ps->rows_length[row] >= issue_rate) | ||
174 | return NULL; | ||
175 | |||
176 | - if (ps->rows[row]) | ||
177 | - rest_count += ps->rows[row]->row_rest_count; | ||
178 | - | ||
179 | - ps_i = create_ps_insn (node, rest_count, cycle); | ||
180 | + ps_i = create_ps_insn (node, cycle); | ||
181 | |||
182 | /* Finds and inserts PS_I according to MUST_FOLLOW and | ||
183 | MUST_PRECEDE. */ | ||
184 | @@ -2754,6 +2771,7 @@ | ||
185 | return NULL; | ||
186 | } | ||
187 | |||
188 | + ps->rows_length[row] += 1; | ||
189 | return ps_i; | ||
190 | } | ||
191 | |||
192 | @@ -2909,11 +2927,16 @@ | ||
193 | for (i = 0; i < backward_rotates; i++) | ||
194 | { | ||
195 | ps_insn_ptr first_row = ps->rows[0]; | ||
196 | + int first_row_length = ps->rows_length[0]; | ||
197 | |||
198 | for (row = 0; row < last_row; row++) | ||
199 | - ps->rows[row] = ps->rows[row+1]; | ||
200 | + { | ||
201 | + ps->rows[row] = ps->rows[row + 1]; | ||
202 | + ps->rows_length[row] = ps->rows_length[row + 1]; | ||
203 | + } | ||
204 | |||
205 | ps->rows[last_row] = first_row; | ||
206 | + ps->rows_length[last_row] = first_row_length; | ||
207 | } | ||
208 | |||
209 | ps->max_cycle -= start_cycle; | ||
210 | |||
diff --git a/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99523.patch b/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99523.patch new file mode 100644 index 000000000..64eb23777 --- /dev/null +++ b/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99523.patch | |||
@@ -0,0 +1,119 @@ | |||
1 | 2011-07-14 Richard Sandiford <richard.sandiford@linaro.org> | ||
2 | |||
3 | Backport from mainline: | ||
4 | gcc/ | ||
5 | 2011-07-07 Richard Sandiford <richard.sandiford@linaro.org> | ||
6 | |||
7 | * reload1.c (choose_reload_regs): Use mode sizes to check whether | ||
8 | an old reload register completely defines the required value. | ||
9 | |||
10 | gcc/testsuite/ | ||
11 | 2011-07-07 Richard Sandiford <richard.sandiford@linaro.org> | ||
12 | |||
13 | * gcc.target/arm/neon-modes-3.c: New test. | ||
14 | |||
15 | === modified file 'gcc/reload1.c' | ||
16 | --- old/gcc/reload1.c 2011-07-01 09:27:50 +0000 | ||
17 | +++ new/gcc/reload1.c 2011-07-11 10:05:08 +0000 | ||
18 | @@ -6449,6 +6449,8 @@ | ||
19 | |||
20 | if (regno >= 0 | ||
21 | && reg_last_reload_reg[regno] != 0 | ||
22 | + && (GET_MODE_SIZE (GET_MODE (reg_last_reload_reg[regno])) | ||
23 | + >= GET_MODE_SIZE (mode) + byte) | ||
24 | #ifdef CANNOT_CHANGE_MODE_CLASS | ||
25 | /* Verify that the register it's in can be used in | ||
26 | mode MODE. */ | ||
27 | @@ -6460,24 +6462,12 @@ | ||
28 | { | ||
29 | enum reg_class rclass = rld[r].rclass, last_class; | ||
30 | rtx last_reg = reg_last_reload_reg[regno]; | ||
31 | - enum machine_mode need_mode; | ||
32 | |||
33 | i = REGNO (last_reg); | ||
34 | i += subreg_regno_offset (i, GET_MODE (last_reg), byte, mode); | ||
35 | last_class = REGNO_REG_CLASS (i); | ||
36 | |||
37 | - if (byte == 0) | ||
38 | - need_mode = mode; | ||
39 | - else | ||
40 | - need_mode | ||
41 | - = smallest_mode_for_size | ||
42 | - (GET_MODE_BITSIZE (mode) + byte * BITS_PER_UNIT, | ||
43 | - GET_MODE_CLASS (mode) == MODE_PARTIAL_INT | ||
44 | - ? MODE_INT : GET_MODE_CLASS (mode)); | ||
45 | - | ||
46 | - if ((GET_MODE_SIZE (GET_MODE (last_reg)) | ||
47 | - >= GET_MODE_SIZE (need_mode)) | ||
48 | - && reg_reloaded_contents[i] == regno | ||
49 | + if (reg_reloaded_contents[i] == regno | ||
50 | && TEST_HARD_REG_BIT (reg_reloaded_valid, i) | ||
51 | && HARD_REGNO_MODE_OK (i, rld[r].mode) | ||
52 | && (TEST_HARD_REG_BIT (reg_class_contents[(int) rclass], i) | ||
53 | |||
54 | === added file 'gcc/testsuite/gcc.target/arm/neon-modes-3.c' | ||
55 | --- old/gcc/testsuite/gcc.target/arm/neon-modes-3.c 1970-01-01 00:00:00 +0000 | ||
56 | +++ new/gcc/testsuite/gcc.target/arm/neon-modes-3.c 2011-07-11 10:05:08 +0000 | ||
57 | @@ -0,0 +1,61 @@ | ||
58 | +/* { dg-do compile } */ | ||
59 | +/* { dg-require-effective-target arm_neon_ok } */ | ||
60 | +/* { dg-options "-O" } */ | ||
61 | +/* { dg-add-options arm_neon } */ | ||
62 | + | ||
63 | +#include <arm_neon.h> | ||
64 | + | ||
65 | +void f1 (volatile float32x4_t *dest, volatile float32x4x4_t *src, int n) | ||
66 | +{ | ||
67 | + float32x4x4_t a5, a6, a7, a8, a9; | ||
68 | + int i; | ||
69 | + | ||
70 | + a5 = *src; | ||
71 | + a6 = *src; | ||
72 | + a7 = *src; | ||
73 | + a8 = *src; | ||
74 | + a9 = *src; | ||
75 | + while (n--) | ||
76 | + { | ||
77 | + for (i = 0; i < 8; i++) | ||
78 | + { | ||
79 | + float32x4x4_t a0, a1, a2, a3, a4; | ||
80 | + | ||
81 | + a0 = *src; | ||
82 | + a1 = *src; | ||
83 | + a2 = *src; | ||
84 | + a3 = *src; | ||
85 | + a4 = *src; | ||
86 | + *src = a0; | ||
87 | + *dest = a0.val[0]; | ||
88 | + *dest = a0.val[3]; | ||
89 | + *src = a1; | ||
90 | + *dest = a1.val[0]; | ||
91 | + *dest = a1.val[3]; | ||
92 | + *src = a2; | ||
93 | + *dest = a2.val[0]; | ||
94 | + *dest = a2.val[3]; | ||
95 | + *src = a3; | ||
96 | + *dest = a3.val[0]; | ||
97 | + *dest = a3.val[3]; | ||
98 | + *src = a4; | ||
99 | + *dest = a4.val[0]; | ||
100 | + *dest = a4.val[3]; | ||
101 | + } | ||
102 | + *src = a5; | ||
103 | + *dest = a5.val[0]; | ||
104 | + *dest = a5.val[3]; | ||
105 | + *src = a6; | ||
106 | + *dest = a6.val[0]; | ||
107 | + *dest = a6.val[3]; | ||
108 | + *src = a7; | ||
109 | + *dest = a7.val[0]; | ||
110 | + *dest = a7.val[3]; | ||
111 | + *src = a8; | ||
112 | + *dest = a8.val[0]; | ||
113 | + *dest = a8.val[3]; | ||
114 | + *src = a9; | ||
115 | + *dest = a9.val[0]; | ||
116 | + *dest = a9.val[3]; | ||
117 | + } | ||
118 | +} | ||
119 | |||
diff --git a/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99524.patch b/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99524.patch new file mode 100644 index 000000000..2e8e12d2a --- /dev/null +++ b/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99524.patch | |||
@@ -0,0 +1,209 @@ | |||
1 | 2011-07-14 Richard Sandiford <richard.sandiford@linaro.org> | ||
2 | |||
3 | gcc/ | ||
4 | * config/arm/arm.h (ARM_LEGITIMIZE_RELOAD_ADDRESS): Apply the | ||
5 | arm_legitimize_reload_address changes marked [*] below. | ||
6 | |||
7 | Backport from mainline: | ||
8 | |||
9 | 2011-04-20 Chung-Lin Tang <cltang@codesourcery.com> | ||
10 | |||
11 | [*] config/arm/arm.c (arm_legitimize_reload_address): For NEON | ||
12 | quad-word modes, reduce to 9-bit index range when above 1016 | ||
13 | limit. | ||
14 | |||
15 | 2011-04-11 Chung-Lin Tang <cltang@codesourcery.com> | ||
16 | Richard Earnshaw <rearnsha@arm.com> | ||
17 | |||
18 | PR target/48250 | ||
19 | [*] config/arm/arm.c (arm_legitimize_reload_address): Update cases | ||
20 | to use sign-magnitude offsets. Reject unsupported unaligned | ||
21 | cases. Add detailed description in comments. | ||
22 | * config/arm/arm.md (reload_outdf): Disable for ARM mode; change | ||
23 | condition from TARGET_32BIT to TARGET_ARM. | ||
24 | |||
25 | === modified file 'gcc/config/arm/arm.h' | ||
26 | --- old/gcc/config/arm/arm.h 2011-04-20 10:07:36 +0000 | ||
27 | +++ new/gcc/config/arm/arm.h 2011-07-12 16:35:20 +0000 | ||
28 | @@ -1399,6 +1399,11 @@ | ||
29 | ? GENERAL_REGS : NO_REGS) \ | ||
30 | : THUMB_SECONDARY_INPUT_RELOAD_CLASS (CLASS, MODE, X))) | ||
31 | |||
32 | +#define SIGN_MAG_LOW_ADDR_BITS(VAL, N) \ | ||
33 | + (((VAL) & ((1 << (N)) - 1)) \ | ||
34 | + ? (((VAL) & ((1 << ((N) + 1)) - 1)) ^ (1 << (N))) - (1 << (N)) \ | ||
35 | + : 0) | ||
36 | + | ||
37 | /* Try a machine-dependent way of reloading an illegitimate address | ||
38 | operand. If we find one, push the reload and jump to WIN. This | ||
39 | macro is used in only one place: `find_reloads_address' in reload.c. | ||
40 | @@ -1418,26 +1423,135 @@ | ||
41 | HOST_WIDE_INT val = INTVAL (XEXP (X, 1)); \ | ||
42 | HOST_WIDE_INT low, high; \ | ||
43 | \ | ||
44 | - if (MODE == DImode || (MODE == DFmode && TARGET_SOFT_FLOAT)) \ | ||
45 | - low = ((val & 0xf) ^ 0x8) - 0x8; \ | ||
46 | - else if (TARGET_MAVERICK && TARGET_HARD_FLOAT) \ | ||
47 | - /* Need to be careful, -256 is not a valid offset. */ \ | ||
48 | - low = val >= 0 ? (val & 0xff) : -((-val) & 0xff); \ | ||
49 | - else if (TARGET_REALLY_IWMMXT && MODE == SImode) \ | ||
50 | - /* Need to be careful, -1024 is not a valid offset. */ \ | ||
51 | - low = val >= 0 ? (val & 0x3ff) : -((-val) & 0x3ff); \ | ||
52 | - else if (MODE == SImode \ | ||
53 | - || (MODE == SFmode && TARGET_SOFT_FLOAT) \ | ||
54 | - || ((MODE == HImode || MODE == QImode) && ! arm_arch4)) \ | ||
55 | - /* Need to be careful, -4096 is not a valid offset. */ \ | ||
56 | - low = val >= 0 ? (val & 0xfff) : -((-val) & 0xfff); \ | ||
57 | - else if ((MODE == HImode || MODE == QImode) && arm_arch4) \ | ||
58 | - /* Need to be careful, -256 is not a valid offset. */ \ | ||
59 | - low = val >= 0 ? (val & 0xff) : -((-val) & 0xff); \ | ||
60 | - else if (GET_MODE_CLASS (MODE) == MODE_FLOAT \ | ||
61 | - && TARGET_HARD_FLOAT && TARGET_FPA) \ | ||
62 | - /* Need to be careful, -1024 is not a valid offset. */ \ | ||
63 | - low = val >= 0 ? (val & 0x3ff) : -((-val) & 0x3ff); \ | ||
64 | + /* Detect coprocessor load/stores. */ \ | ||
65 | + bool coproc_p = ((TARGET_HARD_FLOAT \ | ||
66 | + && (TARGET_VFP || TARGET_FPA || TARGET_MAVERICK) \ | ||
67 | + && (mode == SFmode || mode == DFmode \ | ||
68 | + || (mode == DImode && TARGET_MAVERICK))) \ | ||
69 | + || (TARGET_REALLY_IWMMXT \ | ||
70 | + && VALID_IWMMXT_REG_MODE (mode)) \ | ||
71 | + || (TARGET_NEON \ | ||
72 | + && (VALID_NEON_DREG_MODE (mode) \ | ||
73 | + || VALID_NEON_QREG_MODE (mode)))); \ | ||
74 | + \ | ||
75 | + /* For some conditions, bail out when lower two bits are \ | ||
76 | + unaligned. */ \ | ||
77 | + if ((val & 0x3) != 0 \ | ||
78 | + /* Coprocessor load/store indexes are 8-bits + '00' \ | ||
79 | + appended. */ \ | ||
80 | + && (coproc_p \ | ||
81 | + /* For DI, and DF under soft-float: */ \ | ||
82 | + || ((mode == DImode || mode == DFmode) \ | ||
83 | + /* Without ldrd, we use stm/ldm, which does not \ | ||
84 | + fair well with unaligned bits. */ \ | ||
85 | + && (! TARGET_LDRD \ | ||
86 | + /* Thumb-2 ldrd/strd is [-1020,+1020] in \ | ||
87 | + steps of 4. */ \ | ||
88 | + || TARGET_THUMB2)))) \ | ||
89 | + break; \ | ||
90 | + \ | ||
91 | + /* When breaking down a [reg+index] reload address into \ | ||
92 | + [(reg+high)+low], of which the (reg+high) gets turned into \ | ||
93 | + a reload add insn, we try to decompose the index into \ | ||
94 | + high/low values that can often also lead to better reload \ | ||
95 | + CSE. For example: \ | ||
96 | + ldr r0, [r2, #4100] // Offset too large \ | ||
97 | + ldr r1, [r2, #4104] // Offset too large \ | ||
98 | + \ | ||
99 | + is best reloaded as: \ | ||
100 | + add t1, r2, #4096 \ | ||
101 | + ldr r0, [t1, #4] \ | ||
102 | + add t2, r2, #4096 \ | ||
103 | + ldr r1, [t2, #8] \ | ||
104 | + \ | ||
105 | + which post-reload CSE can simplify in most cases to eliminate \ | ||
106 | + the second add instruction: \ | ||
107 | + add t1, r2, #4096 \ | ||
108 | + ldr r0, [t1, #4] \ | ||
109 | + ldr r1, [t1, #8] \ | ||
110 | + \ | ||
111 | + The idea here is that we want to split out the bits of the \ | ||
112 | + constant as a mask, rather than as subtracting the maximum \ | ||
113 | + offset that the respective type of load/store used can \ | ||
114 | + handle. \ | ||
115 | + \ | ||
116 | + When encountering negative offsets, we can still utilize it \ | ||
117 | + even if the overall offset is positive; sometimes this may \ | ||
118 | + lead to an immediate that can be constructed with fewer \ | ||
119 | + instructions. For example: \ | ||
120 | + ldr r0, [r2, #0x3FFFFC] \ | ||
121 | + \ | ||
122 | + This is best reloaded as: \ | ||
123 | + add t1, r2, #0x400000 \ | ||
124 | + ldr r0, [t1, #-4] \ | ||
125 | + \ | ||
126 | + The trick for spotting this for a load insn with N bits of \ | ||
127 | + offset (i.e. bits N-1:0) is to look at bit N; if it is set, \ | ||
128 | + then chose a negative offset that is going to make bit N and \ | ||
129 | + all the bits below it become zero in the remainder part. \ | ||
130 | + \ | ||
131 | + The SIGN_MAG_LOW_ADDR_BITS macro below implements this, \ | ||
132 | + with respect to sign-magnitude addressing (i.e. separate \ | ||
133 | + +- bit, or 1's complement), used in most cases of ARM \ | ||
134 | + load/store instructions. */ \ | ||
135 | + \ | ||
136 | + if (coproc_p) \ | ||
137 | + { \ | ||
138 | + low = SIGN_MAG_LOW_ADDR_BITS (val, 10); \ | ||
139 | + \ | ||
140 | + /* NEON quad-word load/stores are made of two double-word \ | ||
141 | + accesses, so the valid index range is reduced by 8. \ | ||
142 | + Treat as 9-bit range if we go over it. */ \ | ||
143 | + if (TARGET_NEON && VALID_NEON_QREG_MODE (mode) && low >= 1016) \ | ||
144 | + low = SIGN_MAG_LOW_ADDR_BITS (val, 9); \ | ||
145 | + } \ | ||
146 | + else if (GET_MODE_SIZE (mode) == 8) \ | ||
147 | + { \ | ||
148 | + if (TARGET_LDRD) \ | ||
149 | + low = (TARGET_THUMB2 \ | ||
150 | + ? SIGN_MAG_LOW_ADDR_BITS (val, 10) \ | ||
151 | + : SIGN_MAG_LOW_ADDR_BITS (val, 8)); \ | ||
152 | + else \ | ||
153 | + /* For pre-ARMv5TE (without ldrd), we use ldm/stm(db/da/ib) \ | ||
154 | + to access doublewords. The supported load/store offsets \ | ||
155 | + are -8, -4, and 4, which we try to produce here. */ \ | ||
156 | + low = ((val & 0xf) ^ 0x8) - 0x8; \ | ||
157 | + } \ | ||
158 | + else if (GET_MODE_SIZE (mode) < 8) \ | ||
159 | + { \ | ||
160 | + /* NEON element load/stores do not have an offset. */ \ | ||
161 | + if (TARGET_NEON_FP16 && mode == HFmode) \ | ||
162 | + break; \ | ||
163 | + \ | ||
164 | + if (TARGET_THUMB2) \ | ||
165 | + { \ | ||
166 | + /* Thumb-2 has an asymmetrical index range of (-256,4096). \ | ||
167 | + Try the wider 12-bit range first, and re-try if the \ | ||
168 | + result is out of range. */ \ | ||
169 | + low = SIGN_MAG_LOW_ADDR_BITS (val, 12); \ | ||
170 | + if (low < -255) \ | ||
171 | + low = SIGN_MAG_LOW_ADDR_BITS (val, 8); \ | ||
172 | + } \ | ||
173 | + else \ | ||
174 | + { \ | ||
175 | + if (mode == HImode || mode == HFmode) \ | ||
176 | + { \ | ||
177 | + if (arm_arch4) \ | ||
178 | + low = SIGN_MAG_LOW_ADDR_BITS (val, 8); \ | ||
179 | + else \ | ||
180 | + { \ | ||
181 | + /* The storehi/movhi_bytes fallbacks can use \ | ||
182 | + only [-4094,+4094] of the full ldrb/strb \ | ||
183 | + index range. */ \ | ||
184 | + low = SIGN_MAG_LOW_ADDR_BITS (val, 12); \ | ||
185 | + if (low == 4095 || low == -4095) \ | ||
186 | + break; \ | ||
187 | + } \ | ||
188 | + } \ | ||
189 | + else \ | ||
190 | + low = SIGN_MAG_LOW_ADDR_BITS (val, 12); \ | ||
191 | + } \ | ||
192 | + } \ | ||
193 | else \ | ||
194 | break; \ | ||
195 | \ | ||
196 | |||
197 | === modified file 'gcc/config/arm/arm.md' | ||
198 | --- old/gcc/config/arm/arm.md 2011-04-28 16:13:24 +0000 | ||
199 | +++ new/gcc/config/arm/arm.md 2011-07-12 16:35:20 +0000 | ||
200 | @@ -6167,7 +6167,7 @@ | ||
201 | [(match_operand:DF 0 "arm_reload_memory_operand" "=o") | ||
202 | (match_operand:DF 1 "s_register_operand" "r") | ||
203 | (match_operand:SI 2 "s_register_operand" "=&r")] | ||
204 | - "TARGET_32BIT" | ||
205 | + "TARGET_THUMB2" | ||
206 | " | ||
207 | { | ||
208 | enum rtx_code code = GET_CODE (XEXP (operands[0], 0)); | ||
209 | |||
diff --git a/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99525.patch b/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99525.patch new file mode 100644 index 000000000..560a830bf --- /dev/null +++ b/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99525.patch | |||
@@ -0,0 +1,67 @@ | |||
1 | 2011-07-15 Michael Hope <michael.hope@linaro.org> | ||
2 | |||
3 | gcc/ | ||
4 | Backport from mainline: | ||
5 | |||
6 | 2011-04-05 Eric Botcazou <ebotcazou@adacore.com> | ||
7 | |||
8 | * ifcvt.c (cond_exec_process_insns): Disallow converting a block | ||
9 | that contains the prologue. | ||
10 | |||
11 | gcc/testsuite/ | ||
12 | Backport from mainline: | ||
13 | |||
14 | 2011-04-01 Bernd Schmidt <bernds@codesourcery.com> | ||
15 | |||
16 | * gcc.c-torture/compile/20110401-1.c: New test. | ||
17 | |||
18 | === modified file 'gcc/ifcvt.c' | ||
19 | --- old/gcc/ifcvt.c 2011-05-05 14:28:53 +0000 | ||
20 | +++ new/gcc/ifcvt.c 2011-07-11 04:08:33 +0000 | ||
21 | @@ -1,5 +1,6 @@ | ||
22 | /* If-conversion support. | ||
23 | - Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2010 | ||
24 | + Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2010, | ||
25 | + 2011 | ||
26 | Free Software Foundation, Inc. | ||
27 | |||
28 | This file is part of GCC. | ||
29 | @@ -311,6 +312,10 @@ | ||
30 | |||
31 | for (insn = start; ; insn = NEXT_INSN (insn)) | ||
32 | { | ||
33 | + /* dwarf2out can't cope with conditional prologues. */ | ||
34 | + if (NOTE_P (insn) && NOTE_KIND (insn) == NOTE_INSN_PROLOGUE_END) | ||
35 | + return FALSE; | ||
36 | + | ||
37 | if (NOTE_P (insn) || DEBUG_INSN_P (insn)) | ||
38 | goto insn_done; | ||
39 | |||
40 | |||
41 | === added file 'gcc/testsuite/gcc.c-torture/compile/20110401-1.c' | ||
42 | --- old/gcc/testsuite/gcc.c-torture/compile/20110401-1.c 1970-01-01 00:00:00 +0000 | ||
43 | +++ new/gcc/testsuite/gcc.c-torture/compile/20110401-1.c 2011-07-11 04:08:33 +0000 | ||
44 | @@ -0,0 +1,22 @@ | ||
45 | +void asn1_length_der (unsigned long int len, unsigned char *ans, int *ans_len) | ||
46 | +{ | ||
47 | + int k; | ||
48 | + unsigned char temp[4]; | ||
49 | + if (len < 128) { | ||
50 | + if (ans != ((void *) 0)) | ||
51 | + ans[0] = (unsigned char) len; | ||
52 | + *ans_len = 1; | ||
53 | + } else { | ||
54 | + k = 0; | ||
55 | + while (len) { | ||
56 | + temp[k++] = len & 0xFF; | ||
57 | + len = len >> 8; | ||
58 | + } | ||
59 | + *ans_len = k + 1; | ||
60 | + if (ans != ((void *) 0)) { | ||
61 | + ans[0] = ((unsigned char) k & 0x7F) + 128; | ||
62 | + while (k--) | ||
63 | + ans[*ans_len - 1 - k] = temp[k]; | ||
64 | + } | ||
65 | + } | ||
66 | +} | ||
67 | |||
diff --git a/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99528.patch b/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99528.patch new file mode 100644 index 000000000..874358306 --- /dev/null +++ b/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99528.patch | |||
@@ -0,0 +1,138 @@ | |||
1 | 2011-07-19 Revital Eres <revital.eres@linaro.org> | ||
2 | |||
3 | Backport from mainline -r175090 | ||
4 | gcc/ | ||
5 | * ddg.c (add_intra_loop_mem_dep): New function. | ||
6 | (build_intra_loop_deps): Call it. | ||
7 | |||
8 | gcc/testsuite | ||
9 | * gcc.dg/sms-9.c: New file. | ||
10 | |||
11 | === modified file 'gcc/ddg.c' | ||
12 | --- old/gcc/ddg.c 2011-05-13 16:16:22 +0000 | ||
13 | +++ new/gcc/ddg.c 2011-07-05 09:02:18 +0000 | ||
14 | @@ -352,6 +352,33 @@ | ||
15 | } | ||
16 | |||
17 | |||
18 | +/* Given two nodes, analyze their RTL insns and add intra-loop mem deps | ||
19 | + to ddg G. */ | ||
20 | +static void | ||
21 | +add_intra_loop_mem_dep (ddg_ptr g, ddg_node_ptr from, ddg_node_ptr to) | ||
22 | +{ | ||
23 | + | ||
24 | + if ((from->cuid == to->cuid) | ||
25 | + || !insn_alias_sets_conflict_p (from->insn, to->insn)) | ||
26 | + /* Do not create edge if memory references have disjoint alias sets | ||
27 | + or 'to' and 'from' are the same instruction. */ | ||
28 | + return; | ||
29 | + | ||
30 | + if (mem_write_insn_p (from->insn)) | ||
31 | + { | ||
32 | + if (mem_read_insn_p (to->insn)) | ||
33 | + create_ddg_dep_no_link (g, from, to, | ||
34 | + DEBUG_INSN_P (to->insn) | ||
35 | + ? ANTI_DEP : TRUE_DEP, MEM_DEP, 0); | ||
36 | + else | ||
37 | + create_ddg_dep_no_link (g, from, to, | ||
38 | + DEBUG_INSN_P (to->insn) | ||
39 | + ? ANTI_DEP : OUTPUT_DEP, MEM_DEP, 0); | ||
40 | + } | ||
41 | + else if (!mem_read_insn_p (to->insn)) | ||
42 | + create_ddg_dep_no_link (g, from, to, ANTI_DEP, MEM_DEP, 0); | ||
43 | +} | ||
44 | + | ||
45 | /* Given two nodes, analyze their RTL insns and add inter-loop mem deps | ||
46 | to ddg G. */ | ||
47 | static void | ||
48 | @@ -439,10 +466,22 @@ | ||
49 | if (DEBUG_INSN_P (j_node->insn)) | ||
50 | continue; | ||
51 | if (mem_access_insn_p (j_node->insn)) | ||
52 | - /* Don't bother calculating inter-loop dep if an intra-loop dep | ||
53 | - already exists. */ | ||
54 | + { | ||
55 | + /* Don't bother calculating inter-loop dep if an intra-loop dep | ||
56 | + already exists. */ | ||
57 | if (! TEST_BIT (dest_node->successors, j)) | ||
58 | add_inter_loop_mem_dep (g, dest_node, j_node); | ||
59 | + /* If -fmodulo-sched-allow-regmoves | ||
60 | + is set certain anti-dep edges are not created. | ||
61 | + It might be that these anti-dep edges are on the | ||
62 | + path from one memory instruction to another such that | ||
63 | + removing these edges could cause a violation of the | ||
64 | + memory dependencies. Thus we add intra edges between | ||
65 | + every two memory instructions in this case. */ | ||
66 | + if (flag_modulo_sched_allow_regmoves | ||
67 | + && !TEST_BIT (dest_node->predecessors, j)) | ||
68 | + add_intra_loop_mem_dep (g, j_node, dest_node); | ||
69 | + } | ||
70 | } | ||
71 | } | ||
72 | } | ||
73 | |||
74 | === added file 'gcc/testsuite/gcc.dg/sms-9.c' | ||
75 | --- old/gcc/testsuite/gcc.dg/sms-9.c 1970-01-01 00:00:00 +0000 | ||
76 | +++ new/gcc/testsuite/gcc.dg/sms-9.c 2011-07-04 11:13:26 +0000 | ||
77 | @@ -0,0 +1,60 @@ | ||
78 | +/* { dg-do run } */ | ||
79 | +/* { dg-options "-O2 -fmodulo-sched -fno-auto-inc-dec -O2 -fmodulo-sched-allow-regmoves" } */ | ||
80 | + | ||
81 | +#include <stdlib.h> | ||
82 | +#include <stdarg.h> | ||
83 | + | ||
84 | +struct df_ref_info | ||
85 | +{ | ||
86 | + unsigned int *begin; | ||
87 | + unsigned int *count; | ||
88 | +}; | ||
89 | + | ||
90 | +extern void *memset (void *s, int c, __SIZE_TYPE__ n); | ||
91 | + | ||
92 | + | ||
93 | +__attribute__ ((noinline)) | ||
94 | + int | ||
95 | + df_reorganize_refs_by_reg_by_insn (struct df_ref_info *ref_info, | ||
96 | + int num, unsigned int start) | ||
97 | +{ | ||
98 | + unsigned int m = num; | ||
99 | + unsigned int offset = 77; | ||
100 | + unsigned int r; | ||
101 | + | ||
102 | + for (r = start; r < m; r++) | ||
103 | + { | ||
104 | + ref_info->begin[r] = offset; | ||
105 | + offset += ref_info->count[r]; | ||
106 | + ref_info->count[r] = 0; | ||
107 | + } | ||
108 | + | ||
109 | + return offset; | ||
110 | +} | ||
111 | + | ||
112 | +int | ||
113 | +main () | ||
114 | +{ | ||
115 | + struct df_ref_info temp; | ||
116 | + int num = 100; | ||
117 | + unsigned int start = 5; | ||
118 | + int i, offset; | ||
119 | + | ||
120 | + temp.begin = malloc (100 * sizeof (unsigned int)); | ||
121 | + temp.count = malloc (100 * sizeof (unsigned int)); | ||
122 | + | ||
123 | + memset (temp.begin, 0, sizeof (unsigned int) * num); | ||
124 | + memset (temp.count, 0, sizeof (unsigned int) * num); | ||
125 | + | ||
126 | + for (i = 0; i < num; i++) | ||
127 | + temp.count[i] = i + 1; | ||
128 | + | ||
129 | + offset = df_reorganize_refs_by_reg_by_insn (&temp, num, start); | ||
130 | + | ||
131 | + if (offset != 5112) | ||
132 | + abort (); | ||
133 | + | ||
134 | + free (temp.begin); | ||
135 | + free (temp.count); | ||
136 | + return 0; | ||
137 | +} | ||
138 | |||
diff --git a/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99529.patch b/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99529.patch new file mode 100644 index 000000000..f0f6a9432 --- /dev/null +++ b/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99529.patch | |||
@@ -0,0 +1,741 @@ | |||
1 | 2011-07-21 Richard Sandiford <richard.sandiford@linaro.org> | ||
2 | |||
3 | gcc/ | ||
4 | PR middle-end/49736 | ||
5 | * expr.c (all_zeros_p): Undo bogus part of last change. | ||
6 | |||
7 | 2011-07-21 Richard Sandiford <rdsandiford@googlemail.com> | ||
8 | |||
9 | Backport from mainline: | ||
10 | gcc/cp/ | ||
11 | 2011-07-13 Richard Sandiford <richard.sandiford@linaro.org> | ||
12 | |||
13 | * typeck2.c (split_nonconstant_init_1): Pass the initializer directly, | ||
14 | rather than a pointer to it. Return true if the whole of the value | ||
15 | was initialized by the generated statements. Use | ||
16 | complete_ctor_at_level_p instead of count_type_elements. | ||
17 | |||
18 | gcc/ | ||
19 | 2011-07-13 Richard Sandiford <richard.sandiford@linaro.org> | ||
20 | |||
21 | * tree.h (categorize_ctor_elements): Remove comment. Fix long line. | ||
22 | (count_type_elements): Delete. | ||
23 | (complete_ctor_at_level_p): Declare. | ||
24 | * expr.c (flexible_array_member_p): New function, split out from... | ||
25 | (count_type_elements): ...here. Make static. Replace allow_flexarr | ||
26 | parameter with for_ctor_p. When for_ctor_p is true, return the | ||
27 | number of elements that should appear in the top-level constructor, | ||
28 | otherwise return an estimate of the number of scalars. | ||
29 | (categorize_ctor_elements): Replace p_must_clear with p_complete. | ||
30 | (categorize_ctor_elements_1): Likewise. Use complete_ctor_at_level_p. | ||
31 | (complete_ctor_at_level_p): New function, borrowing union logic | ||
32 | from old categorize_ctor_elements_1. | ||
33 | (mostly_zeros_p): Return true if the constructor is not complete. | ||
34 | (all_zeros_p): Update call to categorize_ctor_elements. | ||
35 | * gimplify.c (gimplify_init_constructor): Update call to | ||
36 | categorize_ctor_elements. Don't call count_type_elements. | ||
37 | Unconditionally prevent clearing for variable-sized types, | ||
38 | otherwise rely on categorize_ctor_elements to detect | ||
39 | incomplete initializers. | ||
40 | |||
41 | gcc/testsuite/ | ||
42 | 2011-07-13 Chung-Lin Tang <cltang@codesourcery.com> | ||
43 | |||
44 | * gcc.target/arm/pr48183.c: New test. | ||
45 | |||
46 | === modified file 'gcc/cp/typeck2.c' | ||
47 | --- old/gcc/cp/typeck2.c 2010-07-30 14:05:57 +0000 | ||
48 | +++ new/gcc/cp/typeck2.c 2011-07-13 13:36:36 +0000 | ||
49 | @@ -546,18 +546,20 @@ | ||
50 | |||
51 | |||
52 | /* The recursive part of split_nonconstant_init. DEST is an lvalue | ||
53 | - expression to which INIT should be assigned. INIT is a CONSTRUCTOR. */ | ||
54 | + expression to which INIT should be assigned. INIT is a CONSTRUCTOR. | ||
55 | + Return true if the whole of the value was initialized by the | ||
56 | + generated statements. */ | ||
57 | |||
58 | -static void | ||
59 | -split_nonconstant_init_1 (tree dest, tree *initp) | ||
60 | +static bool | ||
61 | +split_nonconstant_init_1 (tree dest, tree init) | ||
62 | { | ||
63 | unsigned HOST_WIDE_INT idx; | ||
64 | - tree init = *initp; | ||
65 | tree field_index, value; | ||
66 | tree type = TREE_TYPE (dest); | ||
67 | tree inner_type = NULL; | ||
68 | bool array_type_p = false; | ||
69 | - HOST_WIDE_INT num_type_elements, num_initialized_elements; | ||
70 | + bool complete_p = true; | ||
71 | + HOST_WIDE_INT num_split_elts = 0; | ||
72 | |||
73 | switch (TREE_CODE (type)) | ||
74 | { | ||
75 | @@ -569,7 +571,6 @@ | ||
76 | case RECORD_TYPE: | ||
77 | case UNION_TYPE: | ||
78 | case QUAL_UNION_TYPE: | ||
79 | - num_initialized_elements = 0; | ||
80 | FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (init), idx, | ||
81 | field_index, value) | ||
82 | { | ||
83 | @@ -592,13 +593,14 @@ | ||
84 | sub = build3 (COMPONENT_REF, inner_type, dest, field_index, | ||
85 | NULL_TREE); | ||
86 | |||
87 | - split_nonconstant_init_1 (sub, &value); | ||
88 | + if (!split_nonconstant_init_1 (sub, value)) | ||
89 | + complete_p = false; | ||
90 | + num_split_elts++; | ||
91 | } | ||
92 | else if (!initializer_constant_valid_p (value, inner_type)) | ||
93 | { | ||
94 | tree code; | ||
95 | tree sub; | ||
96 | - HOST_WIDE_INT inner_elements; | ||
97 | |||
98 | /* FIXME: Ordered removal is O(1) so the whole function is | ||
99 | worst-case quadratic. This could be fixed using an aside | ||
100 | @@ -622,21 +624,9 @@ | ||
101 | code = build_stmt (input_location, EXPR_STMT, code); | ||
102 | add_stmt (code); | ||
103 | |||
104 | - inner_elements = count_type_elements (inner_type, true); | ||
105 | - if (inner_elements < 0) | ||
106 | - num_initialized_elements = -1; | ||
107 | - else if (num_initialized_elements >= 0) | ||
108 | - num_initialized_elements += inner_elements; | ||
109 | - continue; | ||
110 | + num_split_elts++; | ||
111 | } | ||
112 | } | ||
113 | - | ||
114 | - num_type_elements = count_type_elements (type, true); | ||
115 | - /* If all elements of the initializer are non-constant and | ||
116 | - have been split out, we don't need the empty CONSTRUCTOR. */ | ||
117 | - if (num_type_elements > 0 | ||
118 | - && num_type_elements == num_initialized_elements) | ||
119 | - *initp = NULL; | ||
120 | break; | ||
121 | |||
122 | case VECTOR_TYPE: | ||
123 | @@ -648,6 +638,7 @@ | ||
124 | code = build2 (MODIFY_EXPR, type, dest, cons); | ||
125 | code = build_stmt (input_location, EXPR_STMT, code); | ||
126 | add_stmt (code); | ||
127 | + num_split_elts += CONSTRUCTOR_NELTS (init); | ||
128 | } | ||
129 | break; | ||
130 | |||
131 | @@ -657,6 +648,8 @@ | ||
132 | |||
133 | /* The rest of the initializer is now a constant. */ | ||
134 | TREE_CONSTANT (init) = 1; | ||
135 | + return complete_p && complete_ctor_at_level_p (TREE_TYPE (init), | ||
136 | + num_split_elts, inner_type); | ||
137 | } | ||
138 | |||
139 | /* A subroutine of store_init_value. Splits non-constant static | ||
140 | @@ -672,7 +665,8 @@ | ||
141 | if (TREE_CODE (init) == CONSTRUCTOR) | ||
142 | { | ||
143 | code = push_stmt_list (); | ||
144 | - split_nonconstant_init_1 (dest, &init); | ||
145 | + if (split_nonconstant_init_1 (dest, init)) | ||
146 | + init = NULL_TREE; | ||
147 | code = pop_stmt_list (code); | ||
148 | DECL_INITIAL (dest) = init; | ||
149 | TREE_READONLY (dest) = 0; | ||
150 | |||
151 | === modified file 'gcc/expr.c' | ||
152 | --- old/gcc/expr.c 2011-04-20 10:07:36 +0000 | ||
153 | +++ new/gcc/expr.c 2011-07-14 11:52:06 +0000 | ||
154 | @@ -4860,16 +4860,136 @@ | ||
155 | return NULL_RTX; | ||
156 | } | ||
157 | |||
158 | +/* Return true if field F of structure TYPE is a flexible array. */ | ||
159 | + | ||
160 | +static bool | ||
161 | +flexible_array_member_p (const_tree f, const_tree type) | ||
162 | +{ | ||
163 | + const_tree tf; | ||
164 | + | ||
165 | + tf = TREE_TYPE (f); | ||
166 | + return (TREE_CHAIN (f) == NULL | ||
167 | + && TREE_CODE (tf) == ARRAY_TYPE | ||
168 | + && TYPE_DOMAIN (tf) | ||
169 | + && TYPE_MIN_VALUE (TYPE_DOMAIN (tf)) | ||
170 | + && integer_zerop (TYPE_MIN_VALUE (TYPE_DOMAIN (tf))) | ||
171 | + && !TYPE_MAX_VALUE (TYPE_DOMAIN (tf)) | ||
172 | + && int_size_in_bytes (type) >= 0); | ||
173 | +} | ||
174 | + | ||
175 | +/* If FOR_CTOR_P, return the number of top-level elements that a constructor | ||
176 | + must have in order for it to completely initialize a value of type TYPE. | ||
177 | + Return -1 if the number isn't known. | ||
178 | + | ||
179 | + If !FOR_CTOR_P, return an estimate of the number of scalars in TYPE. */ | ||
180 | + | ||
181 | +static HOST_WIDE_INT | ||
182 | +count_type_elements (const_tree type, bool for_ctor_p) | ||
183 | +{ | ||
184 | + switch (TREE_CODE (type)) | ||
185 | + { | ||
186 | + case ARRAY_TYPE: | ||
187 | + { | ||
188 | + tree nelts; | ||
189 | + | ||
190 | + nelts = array_type_nelts (type); | ||
191 | + if (nelts && host_integerp (nelts, 1)) | ||
192 | + { | ||
193 | + unsigned HOST_WIDE_INT n; | ||
194 | + | ||
195 | + n = tree_low_cst (nelts, 1) + 1; | ||
196 | + if (n == 0 || for_ctor_p) | ||
197 | + return n; | ||
198 | + else | ||
199 | + return n * count_type_elements (TREE_TYPE (type), false); | ||
200 | + } | ||
201 | + return for_ctor_p ? -1 : 1; | ||
202 | + } | ||
203 | + | ||
204 | + case RECORD_TYPE: | ||
205 | + { | ||
206 | + unsigned HOST_WIDE_INT n; | ||
207 | + tree f; | ||
208 | + | ||
209 | + n = 0; | ||
210 | + for (f = TYPE_FIELDS (type); f ; f = TREE_CHAIN (f)) | ||
211 | + if (TREE_CODE (f) == FIELD_DECL) | ||
212 | + { | ||
213 | + if (!for_ctor_p) | ||
214 | + n += count_type_elements (TREE_TYPE (f), false); | ||
215 | + else if (!flexible_array_member_p (f, type)) | ||
216 | + /* Don't count flexible arrays, which are not supposed | ||
217 | + to be initialized. */ | ||
218 | + n += 1; | ||
219 | + } | ||
220 | + | ||
221 | + return n; | ||
222 | + } | ||
223 | + | ||
224 | + case UNION_TYPE: | ||
225 | + case QUAL_UNION_TYPE: | ||
226 | + { | ||
227 | + tree f; | ||
228 | + HOST_WIDE_INT n, m; | ||
229 | + | ||
230 | + gcc_assert (!for_ctor_p); | ||
231 | + /* Estimate the number of scalars in each field and pick the | ||
232 | + maximum. Other estimates would do instead; the idea is simply | ||
233 | + to make sure that the estimate is not sensitive to the ordering | ||
234 | + of the fields. */ | ||
235 | + n = 1; | ||
236 | + for (f = TYPE_FIELDS (type); f ; f = TREE_CHAIN (f)) | ||
237 | + if (TREE_CODE (f) == FIELD_DECL) | ||
238 | + { | ||
239 | + m = count_type_elements (TREE_TYPE (f), false); | ||
240 | + /* If the field doesn't span the whole union, add an extra | ||
241 | + scalar for the rest. */ | ||
242 | + if (simple_cst_equal (TYPE_SIZE (TREE_TYPE (f)), | ||
243 | + TYPE_SIZE (type)) != 1) | ||
244 | + m++; | ||
245 | + if (n < m) | ||
246 | + n = m; | ||
247 | + } | ||
248 | + return n; | ||
249 | + } | ||
250 | + | ||
251 | + case COMPLEX_TYPE: | ||
252 | + return 2; | ||
253 | + | ||
254 | + case VECTOR_TYPE: | ||
255 | + return TYPE_VECTOR_SUBPARTS (type); | ||
256 | + | ||
257 | + case INTEGER_TYPE: | ||
258 | + case REAL_TYPE: | ||
259 | + case FIXED_POINT_TYPE: | ||
260 | + case ENUMERAL_TYPE: | ||
261 | + case BOOLEAN_TYPE: | ||
262 | + case POINTER_TYPE: | ||
263 | + case OFFSET_TYPE: | ||
264 | + case REFERENCE_TYPE: | ||
265 | + return 1; | ||
266 | + | ||
267 | + case ERROR_MARK: | ||
268 | + return 0; | ||
269 | + | ||
270 | + case VOID_TYPE: | ||
271 | + case METHOD_TYPE: | ||
272 | + case FUNCTION_TYPE: | ||
273 | + case LANG_TYPE: | ||
274 | + default: | ||
275 | + gcc_unreachable (); | ||
276 | + } | ||
277 | +} | ||
278 | + | ||
279 | /* Helper for categorize_ctor_elements. Identical interface. */ | ||
280 | |||
281 | static bool | ||
282 | categorize_ctor_elements_1 (const_tree ctor, HOST_WIDE_INT *p_nz_elts, | ||
283 | - HOST_WIDE_INT *p_elt_count, | ||
284 | - bool *p_must_clear) | ||
285 | + HOST_WIDE_INT *p_init_elts, bool *p_complete) | ||
286 | { | ||
287 | unsigned HOST_WIDE_INT idx; | ||
288 | - HOST_WIDE_INT nz_elts, elt_count; | ||
289 | - tree value, purpose; | ||
290 | + HOST_WIDE_INT nz_elts, init_elts, num_fields; | ||
291 | + tree value, purpose, elt_type; | ||
292 | |||
293 | /* Whether CTOR is a valid constant initializer, in accordance with what | ||
294 | initializer_constant_valid_p does. If inferred from the constructor | ||
295 | @@ -4878,7 +4998,9 @@ | ||
296 | bool const_p = const_from_elts_p ? true : TREE_STATIC (ctor); | ||
297 | |||
298 | nz_elts = 0; | ||
299 | - elt_count = 0; | ||
300 | + init_elts = 0; | ||
301 | + num_fields = 0; | ||
302 | + elt_type = NULL_TREE; | ||
303 | |||
304 | FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (ctor), idx, purpose, value) | ||
305 | { | ||
306 | @@ -4894,6 +5016,8 @@ | ||
307 | mult = (tree_low_cst (hi_index, 1) | ||
308 | - tree_low_cst (lo_index, 1) + 1); | ||
309 | } | ||
310 | + num_fields += mult; | ||
311 | + elt_type = TREE_TYPE (value); | ||
312 | |||
313 | switch (TREE_CODE (value)) | ||
314 | { | ||
315 | @@ -4901,11 +5025,11 @@ | ||
316 | { | ||
317 | HOST_WIDE_INT nz = 0, ic = 0; | ||
318 | |||
319 | - bool const_elt_p | ||
320 | - = categorize_ctor_elements_1 (value, &nz, &ic, p_must_clear); | ||
321 | + bool const_elt_p = categorize_ctor_elements_1 (value, &nz, &ic, | ||
322 | + p_complete); | ||
323 | |||
324 | nz_elts += mult * nz; | ||
325 | - elt_count += mult * ic; | ||
326 | + init_elts += mult * ic; | ||
327 | |||
328 | if (const_from_elts_p && const_p) | ||
329 | const_p = const_elt_p; | ||
330 | @@ -4917,12 +5041,12 @@ | ||
331 | case FIXED_CST: | ||
332 | if (!initializer_zerop (value)) | ||
333 | nz_elts += mult; | ||
334 | - elt_count += mult; | ||
335 | + init_elts += mult; | ||
336 | break; | ||
337 | |||
338 | case STRING_CST: | ||
339 | nz_elts += mult * TREE_STRING_LENGTH (value); | ||
340 | - elt_count += mult * TREE_STRING_LENGTH (value); | ||
341 | + init_elts += mult * TREE_STRING_LENGTH (value); | ||
342 | break; | ||
343 | |||
344 | case COMPLEX_CST: | ||
345 | @@ -4930,7 +5054,7 @@ | ||
346 | nz_elts += mult; | ||
347 | if (!initializer_zerop (TREE_IMAGPART (value))) | ||
348 | nz_elts += mult; | ||
349 | - elt_count += mult; | ||
350 | + init_elts += mult; | ||
351 | break; | ||
352 | |||
353 | case VECTOR_CST: | ||
354 | @@ -4940,60 +5064,31 @@ | ||
355 | { | ||
356 | if (!initializer_zerop (TREE_VALUE (v))) | ||
357 | nz_elts += mult; | ||
358 | - elt_count += mult; | ||
359 | + init_elts += mult; | ||
360 | } | ||
361 | } | ||
362 | break; | ||
363 | |||
364 | default: | ||
365 | - nz_elts += mult; | ||
366 | - elt_count += mult; | ||
367 | + { | ||
368 | + HOST_WIDE_INT tc = count_type_elements (elt_type, false); | ||
369 | + nz_elts += mult * tc; | ||
370 | + init_elts += mult * tc; | ||
371 | |||
372 | - if (const_from_elts_p && const_p) | ||
373 | - const_p = initializer_constant_valid_p (value, TREE_TYPE (value)) | ||
374 | - != NULL_TREE; | ||
375 | + if (const_from_elts_p && const_p) | ||
376 | + const_p = initializer_constant_valid_p (value, elt_type) | ||
377 | + != NULL_TREE; | ||
378 | + } | ||
379 | break; | ||
380 | } | ||
381 | } | ||
382 | |||
383 | - if (!*p_must_clear | ||
384 | - && (TREE_CODE (TREE_TYPE (ctor)) == UNION_TYPE | ||
385 | - || TREE_CODE (TREE_TYPE (ctor)) == QUAL_UNION_TYPE)) | ||
386 | - { | ||
387 | - tree init_sub_type; | ||
388 | - bool clear_this = true; | ||
389 | - | ||
390 | - if (!VEC_empty (constructor_elt, CONSTRUCTOR_ELTS (ctor))) | ||
391 | - { | ||
392 | - /* We don't expect more than one element of the union to be | ||
393 | - initialized. Not sure what we should do otherwise... */ | ||
394 | - gcc_assert (VEC_length (constructor_elt, CONSTRUCTOR_ELTS (ctor)) | ||
395 | - == 1); | ||
396 | - | ||
397 | - init_sub_type = TREE_TYPE (VEC_index (constructor_elt, | ||
398 | - CONSTRUCTOR_ELTS (ctor), | ||
399 | - 0)->value); | ||
400 | - | ||
401 | - /* ??? We could look at each element of the union, and find the | ||
402 | - largest element. Which would avoid comparing the size of the | ||
403 | - initialized element against any tail padding in the union. | ||
404 | - Doesn't seem worth the effort... */ | ||
405 | - if (simple_cst_equal (TYPE_SIZE (TREE_TYPE (ctor)), | ||
406 | - TYPE_SIZE (init_sub_type)) == 1) | ||
407 | - { | ||
408 | - /* And now we have to find out if the element itself is fully | ||
409 | - constructed. E.g. for union { struct { int a, b; } s; } u | ||
410 | - = { .s = { .a = 1 } }. */ | ||
411 | - if (elt_count == count_type_elements (init_sub_type, false)) | ||
412 | - clear_this = false; | ||
413 | - } | ||
414 | - } | ||
415 | - | ||
416 | - *p_must_clear = clear_this; | ||
417 | - } | ||
418 | + if (*p_complete && !complete_ctor_at_level_p (TREE_TYPE (ctor), | ||
419 | + num_fields, elt_type)) | ||
420 | + *p_complete = false; | ||
421 | |||
422 | *p_nz_elts += nz_elts; | ||
423 | - *p_elt_count += elt_count; | ||
424 | + *p_init_elts += init_elts; | ||
425 | |||
426 | return const_p; | ||
427 | } | ||
428 | @@ -5003,111 +5098,50 @@ | ||
429 | and place it in *P_NZ_ELTS; | ||
430 | * how many scalar fields in total are in CTOR, | ||
431 | and place it in *P_ELT_COUNT. | ||
432 | - * if a type is a union, and the initializer from the constructor | ||
433 | - is not the largest element in the union, then set *p_must_clear. | ||
434 | + * whether the constructor is complete -- in the sense that every | ||
435 | + meaningful byte is explicitly given a value -- | ||
436 | + and place it in *P_COMPLETE. | ||
437 | |||
438 | Return whether or not CTOR is a valid static constant initializer, the same | ||
439 | as "initializer_constant_valid_p (CTOR, TREE_TYPE (CTOR)) != 0". */ | ||
440 | |||
441 | bool | ||
442 | categorize_ctor_elements (const_tree ctor, HOST_WIDE_INT *p_nz_elts, | ||
443 | - HOST_WIDE_INT *p_elt_count, | ||
444 | - bool *p_must_clear) | ||
445 | + HOST_WIDE_INT *p_init_elts, bool *p_complete) | ||
446 | { | ||
447 | *p_nz_elts = 0; | ||
448 | - *p_elt_count = 0; | ||
449 | - *p_must_clear = false; | ||
450 | + *p_init_elts = 0; | ||
451 | + *p_complete = true; | ||
452 | |||
453 | - return | ||
454 | - categorize_ctor_elements_1 (ctor, p_nz_elts, p_elt_count, p_must_clear); | ||
455 | + return categorize_ctor_elements_1 (ctor, p_nz_elts, p_init_elts, p_complete); | ||
456 | } | ||
457 | |||
458 | -/* Count the number of scalars in TYPE. Return -1 on overflow or | ||
459 | - variable-sized. If ALLOW_FLEXARR is true, don't count flexible | ||
460 | - array member at the end of the structure. */ | ||
461 | +/* TYPE is initialized by a constructor with NUM_ELTS elements, the last | ||
462 | + of which had type LAST_TYPE. Each element was itself a complete | ||
463 | + initializer, in the sense that every meaningful byte was explicitly | ||
464 | + given a value. Return true if the same is true for the constructor | ||
465 | + as a whole. */ | ||
466 | |||
467 | -HOST_WIDE_INT | ||
468 | -count_type_elements (const_tree type, bool allow_flexarr) | ||
469 | +bool | ||
470 | +complete_ctor_at_level_p (const_tree type, HOST_WIDE_INT num_elts, | ||
471 | + const_tree last_type) | ||
472 | { | ||
473 | - const HOST_WIDE_INT max = ~((HOST_WIDE_INT)1 << (HOST_BITS_PER_WIDE_INT-1)); | ||
474 | - switch (TREE_CODE (type)) | ||
475 | + if (TREE_CODE (type) == UNION_TYPE | ||
476 | + || TREE_CODE (type) == QUAL_UNION_TYPE) | ||
477 | { | ||
478 | - case ARRAY_TYPE: | ||
479 | - { | ||
480 | - tree telts = array_type_nelts (type); | ||
481 | - if (telts && host_integerp (telts, 1)) | ||
482 | - { | ||
483 | - HOST_WIDE_INT n = tree_low_cst (telts, 1) + 1; | ||
484 | - HOST_WIDE_INT m = count_type_elements (TREE_TYPE (type), false); | ||
485 | - if (n == 0) | ||
486 | - return 0; | ||
487 | - else if (max / n > m) | ||
488 | - return n * m; | ||
489 | - } | ||
490 | - return -1; | ||
491 | - } | ||
492 | - | ||
493 | - case RECORD_TYPE: | ||
494 | - { | ||
495 | - HOST_WIDE_INT n = 0, t; | ||
496 | - tree f; | ||
497 | - | ||
498 | - for (f = TYPE_FIELDS (type); f ; f = TREE_CHAIN (f)) | ||
499 | - if (TREE_CODE (f) == FIELD_DECL) | ||
500 | - { | ||
501 | - t = count_type_elements (TREE_TYPE (f), false); | ||
502 | - if (t < 0) | ||
503 | - { | ||
504 | - /* Check for structures with flexible array member. */ | ||
505 | - tree tf = TREE_TYPE (f); | ||
506 | - if (allow_flexarr | ||
507 | - && TREE_CHAIN (f) == NULL | ||
508 | - && TREE_CODE (tf) == ARRAY_TYPE | ||
509 | - && TYPE_DOMAIN (tf) | ||
510 | - && TYPE_MIN_VALUE (TYPE_DOMAIN (tf)) | ||
511 | - && integer_zerop (TYPE_MIN_VALUE (TYPE_DOMAIN (tf))) | ||
512 | - && !TYPE_MAX_VALUE (TYPE_DOMAIN (tf)) | ||
513 | - && int_size_in_bytes (type) >= 0) | ||
514 | - break; | ||
515 | - | ||
516 | - return -1; | ||
517 | - } | ||
518 | - n += t; | ||
519 | - } | ||
520 | - | ||
521 | - return n; | ||
522 | - } | ||
523 | - | ||
524 | - case UNION_TYPE: | ||
525 | - case QUAL_UNION_TYPE: | ||
526 | - return -1; | ||
527 | - | ||
528 | - case COMPLEX_TYPE: | ||
529 | - return 2; | ||
530 | - | ||
531 | - case VECTOR_TYPE: | ||
532 | - return TYPE_VECTOR_SUBPARTS (type); | ||
533 | - | ||
534 | - case INTEGER_TYPE: | ||
535 | - case REAL_TYPE: | ||
536 | - case FIXED_POINT_TYPE: | ||
537 | - case ENUMERAL_TYPE: | ||
538 | - case BOOLEAN_TYPE: | ||
539 | - case POINTER_TYPE: | ||
540 | - case OFFSET_TYPE: | ||
541 | - case REFERENCE_TYPE: | ||
542 | - return 1; | ||
543 | - | ||
544 | - case ERROR_MARK: | ||
545 | - return 0; | ||
546 | - | ||
547 | - case VOID_TYPE: | ||
548 | - case METHOD_TYPE: | ||
549 | - case FUNCTION_TYPE: | ||
550 | - case LANG_TYPE: | ||
551 | - default: | ||
552 | - gcc_unreachable (); | ||
553 | + if (num_elts == 0) | ||
554 | + return false; | ||
555 | + | ||
556 | + gcc_assert (num_elts == 1 && last_type); | ||
557 | + | ||
558 | + /* ??? We could look at each element of the union, and find the | ||
559 | + largest element. Which would avoid comparing the size of the | ||
560 | + initialized element against any tail padding in the union. | ||
561 | + Doesn't seem worth the effort... */ | ||
562 | + return simple_cst_equal (TYPE_SIZE (type), TYPE_SIZE (last_type)) == 1; | ||
563 | } | ||
564 | + | ||
565 | + return count_type_elements (type, true) == num_elts; | ||
566 | } | ||
567 | |||
568 | /* Return 1 if EXP contains mostly (3/4) zeros. */ | ||
569 | @@ -5116,18 +5150,12 @@ | ||
570 | mostly_zeros_p (const_tree exp) | ||
571 | { | ||
572 | if (TREE_CODE (exp) == CONSTRUCTOR) | ||
573 | - | ||
574 | { | ||
575 | - HOST_WIDE_INT nz_elts, count, elts; | ||
576 | - bool must_clear; | ||
577 | - | ||
578 | - categorize_ctor_elements (exp, &nz_elts, &count, &must_clear); | ||
579 | - if (must_clear) | ||
580 | - return 1; | ||
581 | - | ||
582 | - elts = count_type_elements (TREE_TYPE (exp), false); | ||
583 | - | ||
584 | - return nz_elts < elts / 4; | ||
585 | + HOST_WIDE_INT nz_elts, init_elts; | ||
586 | + bool complete_p; | ||
587 | + | ||
588 | + categorize_ctor_elements (exp, &nz_elts, &init_elts, &complete_p); | ||
589 | + return !complete_p || nz_elts < init_elts / 4; | ||
590 | } | ||
591 | |||
592 | return initializer_zerop (exp); | ||
593 | @@ -5139,12 +5167,11 @@ | ||
594 | all_zeros_p (const_tree exp) | ||
595 | { | ||
596 | if (TREE_CODE (exp) == CONSTRUCTOR) | ||
597 | - | ||
598 | { | ||
599 | - HOST_WIDE_INT nz_elts, count; | ||
600 | - bool must_clear; | ||
601 | + HOST_WIDE_INT nz_elts, init_elts; | ||
602 | + bool complete_p; | ||
603 | |||
604 | - categorize_ctor_elements (exp, &nz_elts, &count, &must_clear); | ||
605 | + categorize_ctor_elements (exp, &nz_elts, &init_elts, &complete_p); | ||
606 | return nz_elts == 0; | ||
607 | } | ||
608 | |||
609 | |||
610 | === modified file 'gcc/gimplify.c' | ||
611 | --- old/gcc/gimplify.c 2011-04-07 18:27:20 +0000 | ||
612 | +++ new/gcc/gimplify.c 2011-07-13 13:36:36 +0000 | ||
613 | @@ -3634,9 +3634,8 @@ | ||
614 | case ARRAY_TYPE: | ||
615 | { | ||
616 | struct gimplify_init_ctor_preeval_data preeval_data; | ||
617 | - HOST_WIDE_INT num_type_elements, num_ctor_elements; | ||
618 | - HOST_WIDE_INT num_nonzero_elements; | ||
619 | - bool cleared, valid_const_initializer; | ||
620 | + HOST_WIDE_INT num_ctor_elements, num_nonzero_elements; | ||
621 | + bool cleared, complete_p, valid_const_initializer; | ||
622 | |||
623 | /* Aggregate types must lower constructors to initialization of | ||
624 | individual elements. The exception is that a CONSTRUCTOR node | ||
625 | @@ -3653,7 +3652,7 @@ | ||
626 | can only do so if it known to be a valid constant initializer. */ | ||
627 | valid_const_initializer | ||
628 | = categorize_ctor_elements (ctor, &num_nonzero_elements, | ||
629 | - &num_ctor_elements, &cleared); | ||
630 | + &num_ctor_elements, &complete_p); | ||
631 | |||
632 | /* If a const aggregate variable is being initialized, then it | ||
633 | should never be a lose to promote the variable to be static. */ | ||
634 | @@ -3691,26 +3690,29 @@ | ||
635 | parts in, then generate code for the non-constant parts. */ | ||
636 | /* TODO. There's code in cp/typeck.c to do this. */ | ||
637 | |||
638 | - num_type_elements = count_type_elements (type, true); | ||
639 | + if (int_size_in_bytes (TREE_TYPE (ctor)) < 0) | ||
640 | + /* store_constructor will ignore the clearing of variable-sized | ||
641 | + objects. Initializers for such objects must explicitly set | ||
642 | + every field that needs to be set. */ | ||
643 | + cleared = false; | ||
644 | + else if (!complete_p) | ||
645 | + /* If the constructor isn't complete, clear the whole object | ||
646 | + beforehand. | ||
647 | |||
648 | - /* If count_type_elements could not determine number of type elements | ||
649 | - for a constant-sized object, assume clearing is needed. | ||
650 | - Don't do this for variable-sized objects, as store_constructor | ||
651 | - will ignore the clearing of variable-sized objects. */ | ||
652 | - if (num_type_elements < 0 && int_size_in_bytes (type) >= 0) | ||
653 | + ??? This ought not to be needed. For any element not present | ||
654 | + in the initializer, we should simply set them to zero. Except | ||
655 | + we'd need to *find* the elements that are not present, and that | ||
656 | + requires trickery to avoid quadratic compile-time behavior in | ||
657 | + large cases or excessive memory use in small cases. */ | ||
658 | cleared = true; | ||
659 | - /* If there are "lots" of zeros, then block clear the object first. */ | ||
660 | - else if (num_type_elements - num_nonzero_elements | ||
661 | + else if (num_ctor_elements - num_nonzero_elements | ||
662 | > CLEAR_RATIO (optimize_function_for_speed_p (cfun)) | ||
663 | - && num_nonzero_elements < num_type_elements/4) | ||
664 | - cleared = true; | ||
665 | - /* ??? This bit ought not be needed. For any element not present | ||
666 | - in the initializer, we should simply set them to zero. Except | ||
667 | - we'd need to *find* the elements that are not present, and that | ||
668 | - requires trickery to avoid quadratic compile-time behavior in | ||
669 | - large cases or excessive memory use in small cases. */ | ||
670 | - else if (num_ctor_elements < num_type_elements) | ||
671 | - cleared = true; | ||
672 | + && num_nonzero_elements < num_ctor_elements / 4) | ||
673 | + /* If there are "lots" of zeros, it's more efficient to clear | ||
674 | + the memory and then set the nonzero elements. */ | ||
675 | + cleared = true; | ||
676 | + else | ||
677 | + cleared = false; | ||
678 | |||
679 | /* If there are "lots" of initialized elements, and all of them | ||
680 | are valid address constants, then the entire initializer can | ||
681 | |||
682 | === added file 'gcc/testsuite/gcc.target/arm/pr48183.c' | ||
683 | --- old/gcc/testsuite/gcc.target/arm/pr48183.c 1970-01-01 00:00:00 +0000 | ||
684 | +++ new/gcc/testsuite/gcc.target/arm/pr48183.c 2011-07-13 13:36:36 +0000 | ||
685 | @@ -0,0 +1,25 @@ | ||
686 | +/* testsuite/gcc.target/arm/pr48183.c */ | ||
687 | + | ||
688 | +/* { dg-do compile } */ | ||
689 | +/* { dg-require-effective-target arm_neon_ok } */ | ||
690 | +/* { dg-options "-O -g" } */ | ||
691 | +/* { dg-add-options arm_neon } */ | ||
692 | + | ||
693 | +#include <arm_neon.h> | ||
694 | + | ||
695 | +void move_16bit_to_32bit (int32_t *dst, const short *src, unsigned n) | ||
696 | +{ | ||
697 | + unsigned i; | ||
698 | + int16x4x2_t input; | ||
699 | + int32x4x2_t mid; | ||
700 | + int32x4x2_t output; | ||
701 | + | ||
702 | + for (i = 0; i < n/2; i += 8) { | ||
703 | + input = vld2_s16(src + i); | ||
704 | + mid.val[0] = vmovl_s16(input.val[0]); | ||
705 | + mid.val[1] = vmovl_s16(input.val[1]); | ||
706 | + output.val[0] = vshlq_n_s32(mid.val[0], 8); | ||
707 | + output.val[1] = vshlq_n_s32(mid.val[1], 8); | ||
708 | + vst2q_s32((int32_t *)dst + i, output); | ||
709 | + } | ||
710 | +} | ||
711 | |||
712 | === modified file 'gcc/tree.h' | ||
713 | --- old/gcc/tree.h 2011-04-06 12:29:08 +0000 | ||
714 | +++ new/gcc/tree.h 2011-07-13 13:36:36 +0000 | ||
715 | @@ -4361,21 +4361,10 @@ | ||
716 | |||
717 | extern VEC(tree,gc) *ctor_to_vec (tree); | ||
718 | |||
719 | -/* Examine CTOR to discover: | ||
720 | - * how many scalar fields are set to nonzero values, | ||
721 | - and place it in *P_NZ_ELTS; | ||
722 | - * how many scalar fields in total are in CTOR, | ||
723 | - and place it in *P_ELT_COUNT. | ||
724 | - * if a type is a union, and the initializer from the constructor | ||
725 | - is not the largest element in the union, then set *p_must_clear. | ||
726 | - | ||
727 | - Return whether or not CTOR is a valid static constant initializer, the same | ||
728 | - as "initializer_constant_valid_p (CTOR, TREE_TYPE (CTOR)) != 0". */ | ||
729 | - | ||
730 | -extern bool categorize_ctor_elements (const_tree, HOST_WIDE_INT *, HOST_WIDE_INT *, | ||
731 | - bool *); | ||
732 | - | ||
733 | -extern HOST_WIDE_INT count_type_elements (const_tree, bool); | ||
734 | +extern bool categorize_ctor_elements (const_tree, HOST_WIDE_INT *, | ||
735 | + HOST_WIDE_INT *, bool *); | ||
736 | + | ||
737 | +extern bool complete_ctor_at_level_p (const_tree, HOST_WIDE_INT, const_tree); | ||
738 | |||
739 | /* integer_zerop (tree x) is nonzero if X is an integer constant of value 0. */ | ||
740 | |||
741 | |||
diff --git a/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/linaro-lp815435.patch b/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/linaro-lp815435.patch new file mode 100644 index 000000000..be71a2f64 --- /dev/null +++ b/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/linaro-lp815435.patch | |||
@@ -0,0 +1,25 @@ | |||
1 | 2011-07-29 Ramana Radhakrishnan <ramana.radhakrishnan@linaro.org> | ||
2 | |||
3 | gcc/ | ||
4 | Backport only bits marked as [*] from mainline: | ||
5 | 2010-12-19 Chung-Lin Tang <cltang@codesourcery.com> | ||
6 | |||
7 | * config/arm/arm.c ([*]arm_legitimate_index_p): Add VFP load/store | ||
8 | index range case. Change to SF/DFmode tests to avoid capturing HFmode. | ||
9 | (thumb2_legitimate_index_p): Same. | ||
10 | |||
11 | Index: gcc-4_5-branch/gcc/config/arm/arm.c | ||
12 | =================================================================== | ||
13 | --- gcc-4_5-branch.orig/gcc/config/arm/arm.c 2011-07-22 17:56:51.000000000 -0700 | ||
14 | +++ gcc-4_5-branch/gcc/config/arm/arm.c 2011-07-29 14:43:42.171610966 -0700 | ||
15 | @@ -5631,8 +5631,8 @@ arm_legitimate_index_p (enum machine_mod | ||
16 | |||
17 | /* Standard coprocessor addressing modes. */ | ||
18 | if (TARGET_HARD_FLOAT | ||
19 | - && (TARGET_FPA || TARGET_MAVERICK) | ||
20 | - && (GET_MODE_CLASS (mode) == MODE_FLOAT | ||
21 | + && (TARGET_FPA || TARGET_MAVERICK || TARGET_VFP) | ||
22 | + && ((mode == SFmode || mode == DFmode) | ||
23 | || (TARGET_MAVERICK && mode == DImode))) | ||
24 | return (code == CONST_INT && INTVAL (index) < 1024 | ||
25 | && INTVAL (index) > -1024 | ||