This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
| Other format: | [Raw text] | |
On Mon, May 21, 2012 at 2:56 AM, Richard Guenther <richard.guenther@gmail.com> wrote: > On Sun, May 20, 2012 at 1:40 AM, Andrew Pinski <pinskia@gmail.com> wrote: >> The problem here is that tree-if-conv.c produces COND_EXPR instead of >> the MAX/MIN EXPRs. When I added the expansion from COND_EXPR to >> conditional moves, I assumes that the expressions which should have >> been converted into MAX_EXPR/MIN_EXPR have already happened. >> >> This fixes the problem by having tree-if-conv fold the expression so >> the MIN_EXPR/MAX_EXPR appears in the IR rather than COND_EXPR and the >> expansion happens correctly to the min/max rtl rather than just >> through the conditional move ones. >> >> OK? Bootstrapped and tested on x86_64-linux-gnu with no regressions. > > As we are unconditionally building a gimple_assign from the folding result > you need to re-gimplify it. The code was using build3 instead of fold_build3 > to avoid that and to make sure we create a plain COND_EXPR we can > later CSE / simplify properly. Generating a MAX_EXPR directly is certainly > fine (can we always vectorize that?), but I suppose simply changing the > code to use fold_build3 will have unwanted fallout (consider folds habit > to insert conversions that are not requried on gimple). > > So I'd rather prefer to abstract the build3 (COND_EXPR,... into a > helper function that uses fold_ternary and only if the result is an > invariant/register or a MIN/MAX_EXPR use the result, canonicalizing > it properly. Here is an updated patch which does exactly that. Note I noticed another regression dealing with my expansion for COND_EXPR dealing with min/max and I will be submitting patches for those issue tomorrow. OK? Bootstrap and tested on x86_64-linux-gnu. Thanks, Andrew Pinski ChangeLog: * tree-if-conv.c (constant_or_ssa_name): New function. (fold_build_cond_expr): New function. (predicate_scalar_phi): Use fold_build_cond_expr instead of build3. (predicate_mem_writes): Likewise.
Attachment:
t.diff.txt
Description: Text document
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |