[Bug tree-optimization/45522] VRP misses oppurtunity for statement folding.
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45522 Andrew Pinski pinskia at gcc dot gnu.org changed: What|Removed |Added Keywords||missed-optimization Status|UNCONFIRMED |NEW Last reconfirmed||2010.10.28 20:41:46 Ever Confirmed|0 |1 --- Comment #12 from Andrew Pinski pinskia at gcc dot gnu.org 2010-10-28 20:41:46 UTC --- Confirmed.
[Bug tree-optimization/45522] VRP misses oppurtunity for statement folding.
--- Comment #8 from rguenther at suse dot de 2010-09-04 08:29 --- Subject: Re: VRP misses oppurtunity for statement folding. On Fri, 3 Sep 2010, hubicka at gcc dot gnu dot org wrote: --- Comment #7 from hubicka at gcc dot gnu dot org 2010-09-03 20:28 --- In #5 the expression is created by PRE via create_expression_by_pieces that uses normal fold that is not able of constant variable folding. The statement does not get folded later and survives. I guess one can fold all statements in commit_edge_insertions but it seems by symptomatic? You need to enhance fully_constant_vn_reference_p. Richard. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45522
[Bug tree-optimization/45522] VRP misses oppurtunity for statement folding.
--- Comment #9 from hubicka at gcc dot gnu dot org 2010-09-04 13:51 --- Hi, thanks. In meantime I made tree-ssa-pre to fold statements it produces and it gets me to bootstrapland with sanity check in expr.c except for Ada (with the patches I sent so far) So it seems that I need to basically duplicate all logic for initializer folding from tree-ssa-ccp.c into this function, right? I guess it makes sense, but it is all quite ugly. On VN side, i wondered if we can retire more of expand this way. For example dojump knows that: a = b ror x; if (a != 0) can be folded into: if (b != 0) (ror is rotation). I guess we should do this kind of tricks in VN instead? Honza -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45522
[Bug tree-optimization/45522] VRP misses oppurtunity for statement folding.
--- Comment #10 from rguenther at suse dot de 2010-09-04 14:11 --- Subject: Re: VRP misses oppurtunity for statement folding. On Sat, 4 Sep 2010, hubicka at gcc dot gnu dot org wrote: --- Comment #9 from hubicka at gcc dot gnu dot org 2010-09-04 13:51 --- Hi, thanks. In meantime I made tree-ssa-pre to fold statements it produces and it gets me to bootstrapland with sanity check in expr.c except for Ada (with the patches I sent so far) Well - that's a workaround and will cause us to miss PRE because we do not fold during translation of expressions. So I wouldn't go down that route. So it seems that I need to basically duplicate all logic for initializer folding from tree-ssa-ccp.c into this function, right? I guess it makes sense, but it is all quite ugly. Yes ;) On VN side, i wondered if we can retire more of expand this way. For example dojump knows that: a = b ror x; if (a != 0) can be folded into: if (b != 0) (ror is rotation). I guess we should do this kind of tricks in VN instead? Well ... it's not that easy (that's not CSE but tree-combining, so the specific thing would fit to forwprop). Richard. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45522
[Bug tree-optimization/45522] VRP misses oppurtunity for statement folding.
--- Comment #11 from hubicka at gcc dot gnu dot org 2010-09-04 18:00 --- Created an attachment (id=21700) -- (http://gcc.gnu.org/bugzilla/attachment.cgi?id=21700action=view) proposed fix for sccvn Well, this is patch I am currently testing. At least small part is shared in between tree-ssa-ccp (probably should go into gimple-fold) and VN. I am not sure how much of other initializer folding I need to borrow - i.e. folding of var_decl into its decl_initial, handling of component_refs and such. Also the tree-ssa-ccp code seems quite incomplette, it won't fold array with incomplette initializer for example because it won't find the matching item. Probably worth to fix. Honza -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45522
[Bug tree-optimization/45522] VRP misses oppurtunity for statement folding.
--- Comment #1 from hubicka at gcc dot gnu dot org 2010-09-03 15:59 --- Created an attachment (id=21684) -- (http://gcc.gnu.org/bugzilla/attachment.cgi?id=21684action=view) testcase -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45522
[Bug tree-optimization/45522] VRP misses oppurtunity for statement folding.
--- Comment #2 from hubicka at gcc dot gnu dot org 2010-09-03 16:33 --- OK, the problem seems to be that fold_stmt seems to make no serious attempt to fold constant references. There is some code in maybe_fold_reference that seems to partly duplicate fold_const_aggregate_ref however. What is reason for that? The following patch solves the problem, I am looking what other testcases I can find. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45522
[Bug tree-optimization/45522] VRP misses oppurtunity for statement folding.
--- Comment #3 from hubicka at gcc dot gnu dot org 2010-09-03 16:34 --- Created an attachment (id=21685) -- (http://gcc.gnu.org/bugzilla/attachment.cgi?id=21685action=view) patch for better folding -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45522
[Bug tree-optimization/45522] VRP misses oppurtunity for statement folding.
--- Comment #4 from hubicka at gcc dot gnu dot org 2010-09-03 20:04 --- A related testcase where we fail to fold fundamentals[0] typedef union tree_node *tree; enum tree_code { OFFSET_TYPE, ENUMERAL_TYPE, BOOLEAN_TYPE, POINTER_TYPE, FIXED_POINT_TYPE, }; struct tree_base { unsigned public_flag:1; }; struct tree_decl_with_vis { unsigned comdat_flag:1; }; union tree_node { struct tree_base base; struct tree_decl_with_vis decl_with_vis; }; enum tree_index { TI_LONG_DOUBLE_PTR_TYPE, TI_INTEGER_PTR_TYPE, TI_VOID_TYPE, TI_PTR_TYPE, TI_VA_LIST_FPR_COUNTER_FIELD, TI_BOOLEAN_TYPE, TI_FILEPTR_TYPE, TI_CURRENT_TARGET_PRAGMA, TI_CURRENT_OPTIMIZE_PRAGMA, TI_MAX }; extern tree global_trees[TI_MAX]; emit_support_tinfos (void) { static tree *const fundamentals[] = { global_trees[TI_VOID_TYPE], global_trees[TI_BOOLEAN_TYPE], }; int ix; for (ix = 0; fundamentals[ix]; ix++) { { tree tinfo; { ((void) (!(((tinfo)-base.public_flag) !(__extension__ ( { __typeof (tinfo) __t = (tinfo); __t;} )-decl_with_vis. comdat_flag)) ? fancy_abort (../../gcc/cp/rtti.c, 1529, __FUNCTION__), 0 : 0)); } } } } -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45522
[Bug tree-optimization/45522] VRP misses oppurtunity for statement folding.
--- Comment #5 from hubicka at gcc dot gnu dot org 2010-09-03 20:09 --- And here we fail to fold messages[1] created by PRE enum { ERROR_OK, ERROR_UNKNOWN, ERROR_NUM }; enum { __LC_CTYPE = 0, __LC_NUMERIC = 1, __LC_TIME = 2, __LC_COLLATE = 3, __LC_MONETARY = 4, __LC_MESSAGES = 5, __LC_ALL = 6, __LC_PAPER = 10, __LC_MEASUREMENT = 11, __LC_IDENTIFICATION = 12 }; static const char *const _messages[] = { no error, unknown error, Internal error: unknown reason, }; elf_errmsg (int err) { if (err 0 || err = ERROR_NUM || _messages[err] == ((void *) 0)) { err = ERROR_UNKNOWN; } return _messages[err]; } -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45522
[Bug tree-optimization/45522] VRP misses oppurtunity for statement folding.
--- Comment #6 from hubicka at gcc dot gnu dot org 2010-09-03 20:12 --- In testcase from comment #4 the problem is that value in DECL_INITIAL is not in the form acceptable for gimple_min_invariant. Have patch. In testcase from comment #5 we never try to fold it. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45522
[Bug tree-optimization/45522] VRP misses oppurtunity for statement folding.
--- Comment #7 from hubicka at gcc dot gnu dot org 2010-09-03 20:28 --- In #5 the expression is created by PRE via create_expression_by_pieces that uses normal fold that is not able of constant variable folding. The statement does not get folded later and survives. I guess one can fold all statements in commit_edge_insertions but it seems by symptomatic? -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45522