On Thu, May 10, 2012 at 12:26 PM, Eric Botcazou <ebotca...@adacore.com> wrote: >> As far as I can see this happens when we fold >> >> (bitsizetype) (#1 + 7) * 8 + 7 PLUS_EXPR 1 >> >> which we fold to >> >> ((bitsizetype) (#1 + 7) + 1) * 8 >> >> The #1 + 7 expression is computed in sizetype (which is now unsigned >> and thus has defined overflow - thus we cannot optimize the widening >> to bitsizetype). > > I see, thanks for the investigation. > >> As I previously suggested we can put in special knowledge into >> size_binop, or maybe better, provide abstraction for conversion >> of sizetype to bitsizetype that would associate the type >> conversions. The original plan was of course to at some point >> have PLUSNV_EXPR so we can explicitely mark #1 + 7 as not >> overflowing. It might be that introducing those just for >> size expressions right now (and then dropping them down >> to regular PLUS_EXPRs during gimplification) might be >> something to explore for 4.8. > > OK, I'll think about it. No objections by me to going ahead with the patches.
For example Index: stor-layout.c =================================================================== --- stor-layout.c (revision 187364) +++ stor-layout.c (working copy) @@ -791,6 +791,10 @@ start_record_layout (tree t) tree bit_from_pos (tree offset, tree bitpos) { + if (TREE_CODE (offset) == PLUS_EXPR) + offset = size_binop (PLUS_EXPR, + fold_convert (bitsizetype, TREE_OPERAND (offset, 0)), + fold_convert (bitsizetype, TREE_OPERAND (offset, 1))); return size_binop (PLUS_EXPR, bitpos, size_binop (MULT_EXPR, fold_convert (bitsizetype, offset), fixes the specific testcase you provided. I suppose if stor-layout.c would be more carefully handle advancing offset/bitpos, avoding repeated translations between them, those issues would not exist. Of course the mere existence of DECL_OFFSET_ALIGN complicates matters for no good reasons (well, at least I did not find a good use of it until now ...). Richard. > -- > Eric Botcazou