aboutsummaryrefslogtreecommitdiff
path: root/gcc/ifcvt.h
AgeCommit message (Collapse)AuthorFilesLines
2023-02-13ifcvt: Fix regression in aarch64/fcsel_1.cRichard Sandiford1-0/+8
aarch64/fcsel_1.c contains: double f_2 (double a, double b, double c, double d) { if (a > b) return c; else return d; } which started failing in the GCC 12 timeframe. When it passed, the RTL had the form: [A] (set (reg ret) (reg c)) (set (pc) (if_then_else (gt ...) (label_ref ret) (pc))) edge to ret, fallthru to else else: (set (reg ret) (reg d)) fallthru to ret ret: ...exit... i.e. a branch around. Now the RTL has form: [B] (set (reg ret) (reg d)) (set (pc) (if_then_else (gt ...) (label_ref then) (pc))) edge to then, fallthru to ret ret: ...exit... then: (set (reg ret) (reg c)) edge to ret i.e. a branch out. Both are valid, of course, and there's no easy way to predict which we'll get. But ifcvt canonicalises its representation on: if (cond) goto fallthru else goto non-fallthru That is, it canoncalises on the branch-around case for half-diamonds. It therefore wants to invert the comparison in [B] to get: if (...) goto ret else goto then But that isn't possible for strict FP gt, so the optimisation fails. Canonicalising on the branch-around case seems like the wrong choice for half diamonds. The natural way of expressing a conditional branch is for the label_ref to be the "then" destination and pc to be the "else" destination. And the natural choice of condition seems to be the one under which extra stuff *is* done, rather than the one under which extra stuff *isn't* done. But that decision goes back at least 20 years and it doesn't seem like a good idea to change it in stage 4. This patch instead allows the internal structure to store the condition in inverted form. For simplicity it handles only conditional moves, which is the one case that is needed to fix the known regression. (There are probably unknown regressions too, but still.) gcc/ * ifcvt.h (noce_if_info::cond_inverted): New field. * ifcvt.cc (cond_move_convert_if_block): Swap the then and else values when cond_inverted is true. (noce_find_if_block): Allow the condition to be inverted when handling conditional moves.
2023-01-02Update copyright years.Jakub Jelinek1-1/+1
2022-01-03Update copyright years.Jakub Jelinek1-1/+1
2021-01-04Update copyright years.Jakub Jelinek1-1/+1
2020-01-01Update copyright years.Jakub Jelinek1-1/+1
From-SVN: r279813
2019-10-02ifcvt: improve cost estimation (PR 87047)Alexander Monakov1-2/+2
PR rtl-optimization/87047 * ifcvt.c (average_cost): New static function. Use it... (noce_process_if_block): ... here. testsuite/ * gcc.dg/pr87047.c: New test. From-SVN: r276466
2019-01-01Update copyright years.Jakub Jelinek1-1/+1
From-SVN: r267494
2018-01-03Update copyright years.Jakub Jelinek1-1/+1
From-SVN: r256169
2017-04-04re PR tree-optimization/79390 (10% performance drop in SciMark2 LU after ↵Jakub Jelinek1-0/+70
r242550) PR tree-optimization/79390 * target.h (struct noce_if_info): Declare. * targhooks.h (default_noce_conversion_profitable_p): Declare. * target.def (noce_conversion_profitable_p): New target hook. * ifcvt.h (struct noce_if_info): New type, moved from ... * ifcvt.c (struct noce_if_info): ... here. (noce_conversion_profitable_p): Renamed to ... (default_noce_conversion_profitable_p): ... this. No longer static nor inline. (noce_try_store_flag_constants, noce_try_addcc, noce_try_store_flag_mask, noce_try_cmove, noce_try_cmove_arith, noce_convert_multiple_sets): Use targetm.noce_conversion_profitable_p instead of noce_conversion_profitable_p. * config/i386/i386.c: Include ifcvt.h. (ix86_option_override_internal): Don't override PARAM_MAX_RTL_IF_CONVERSION_INSNS default. (ix86_noce_conversion_profitable_p): New function. (TARGET_NOCE_CONVERSION_PROFITABLE_P): Redefine. * config/i386/x86-tune.def (X86_TUNE_ONE_IF_CONV_INSN): Adjust comment. * doc/tm.texi.in (TARGET_NOCE_CONVERSION_PROFITABLE_P): Add. * doc/tm.texi: Regenerated. * gcc.target/i386/pr79390.c: New test. * gcc.dg/ifcvt-4.c: Use -mtune-ctrl=^one_if_conv_insn for i?86/x86_64. From-SVN: r246686
2017-01-01Update copyright years.Jakub Jelinek1-1/+1
From-SVN: r243994
2016-01-04Update copyright years.Jakub Jelinek1-1/+1
From-SVN: r232055
2015-01-05Update copyright years.Jakub Jelinek1-1/+1
From-SVN: r219188
2014-10-22cfgbuild.h: New.Andrew MacLeod1-0/+43
2014-10-22 Andrew MacLeod <amacleod@redhat.com> * cfgbuild.h: New. Add prototypes for cfgbuild.c. * cfgcleanup.h: New. Add prototypes for cfgcleanup.c. * cfgloopmanip.h: New. Add prototypes for cfgloopmanip.c. * dominance.h: New. Add prototypes for dominance.c. * cfgloop.h: Move some prototypes/enum to cfgloopmanip.h and include it. * cfghooks.h: (struct profile_record) Relocate here. Relocate 2 prototypes from basic-block.h. * basic-block.h: Move prototypes and struct to new header files. Include cfgbuild.h, cfgcleanup.h, and dominance.h. * rtl.h: Move a few prototypes to new header files. * cfgcleanup.c (merge_memattrs): Make static. * genopinit.c (main): Add predict.h to list of includes. * predict.h: Update prototype list to match predict.c. * predict.c (maybe_hot_count_p): Export. (cgraph_edge::maybe_hot_p): Move to cgraph.c. (cgraph_node::optimize_for_size_p): Move to cgraph.h. * cgraph.h (cgraph_node::optimize_for_size_p): Relocate here. * cgraph.c (cgraph_edge::maybe_hot_p): Relocate here. * profile.h: Adjust prototypes. * ifcvt.h: New. Relocate struct ce_if_block here. * ifcvt.c: Include ifcvt.h. * config/frv/frv.c: Include ifcvt.h. * config/frv/frv-protos.h: Add 'struct' to ce_if_block * parameters. From-SVN: r216559