http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51990
vries at gcc dot gnu.org changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |UNCONFIRMED Ever Confirmed|1 |0 --- Comment #5 from vries at gcc dot gnu.org 2012-01-25 11:41:50 UTC --- (In reply to comment #4) > (In reply to comment #1) > I think there are a lot of bugs lurking in the compiler with respect to > not handling WITH_SIZE_EXPR (which incidentially isn't a handled-component, > nor tcc_reference ...). You btw. also need to handle re-materializing > them in create_component_ref_by_pieces_1. Indeed. Using the proposed patch and this example: ... int y; extern int foo (int, ...) __attribute__((pure)); int zzz (char *s1, char *s2, int len, int *q, int c) { int z = 5; unsigned int i, b; struct s { char a[z]; }; struct s x; int y_tmp = 5; for (i = 0; i < len; i++) s1[i] = s2[i]; b = z & 0x3; len += (b == 0 ? 0 : 1) + z; *q = len; if (c) y_tmp = foo (z, x, x) + 4; z = foo (z, x, x) + 4; y = y_tmp; return z; } ... I hit this ICE: ... test2.c: In function ‘zzz’: test2.c:5:1: internal compiler error: in create_component_ref_by_pieces_1, at tree-ssa-pre.c:2925 Please submit a full bug report, with preprocessed source if appropriate. See <http://gcc.gnu.org/bugs.html> for instructions. ... tentative patch: ... Index: tree-ssa-pre.c =================================================================== --- tree-ssa-pre.c (revision 183325) +++ tree-ssa-pre.c (working copy) @@ -2780,6 +2780,7 @@ create_component_ref_by_pieces_1 (basic_ case REALPART_EXPR: case IMAGPART_EXPR: case VIEW_CONVERT_EXPR: + case WITH_SIZE_EXPR: { tree folded; tree genop0 = create_component_ref_by_pieces_1 (block, ref, @@ -2787,8 +2788,12 @@ create_component_ref_by_pieces_1 (basic_ stmts, domstmt); if (!genop0) return NULL_TREE; - folded = fold_build1 (currop->opcode, currop->type, - genop0); + + folded + = (currop->opcode == WITH_SIZE_EXPR + ? fold_build2 (currop->opcode, currop->type, genop0, currop->op0) + : fold_build1 (currop->opcode, currop->type, genop0)); + return folded; } break; ...