Hi, In relation to the patch I put up for review a few weeks ago to teach RTL if-convert to handle multiple sets in a basic block [1], I was asking about a sensible cost model to use. There was some consensus at Cauldron that what should be done in this situation is to introduce a target hook that delegates answering the question to the target.
This patch series introduces that new target hook to provide cost decisions for the RTL ifcvt pass. The idea is to give the target full visibility of the proposed transformation, and allow it to respond as to whether if-conversion in that way is profitable. In order to preserve current behaviour across targets, we will need the default implementation to keep to the strategy of simply comparing branch cost against a magic number. Patch 1/3 performs this refactoring, which is a bit hairy in some corner cases. Patch 2/3 is a simple code move, pulling the definition of the if_info structure used by RTL if-convert in to ifcvt.h where it can be included by targets. Patch 3/3 then introduces the new target hook, with the same default behaviour as was previously in noce_is_profitable_p. The series has been bootstrapped on ARM, AArch64 and x86_64 targets, and I've verified with Spec2000 and Spec2006 runs that there are no code generation differences for any of these three targets after the patch. I also gave ultrasparc3 a quick go, from what I could see, I changed the register allocation for the floating-point condition code registers. Presumably this is a side effect of first constructing RTXen that I then discard. I didn't see anything which looked like more frequent reloads or substantial code generation changes, though I'm not familiar with the intricacies of the Sparc condition registers :). I've included a patch 4/3, to give an example of what a target might want to do with this hook. It needs work for tuning and deciding how the function should actually behave, but works if it is thought of as more of a strawman/prototype than a patch submission. Are parts 1, 2 and 3 OK? Thanks, James [1]: https://gcc.gnu.org/ml/gcc-patches/2015-09/msg00781.html --- [Patch ifcvt 1/3] Factor out cost calculations from noce cases 2015-09-26 James Greenhalgh <james.greenha...@arm.com> * ifcvt.c (noce_if_info): Add a magic_number field :-(. (noce_is_profitable_p): New. (noce_try_store_flag_constants): Move cost calculation to after sequence generation, factor it out to noce_is_profitable_p. (noce_try_addcc): Likewise. (noce_try_store_flag_mask): Likewise. (noce_try_cmove): Likewise. (noce_try_cmove_arith): Likewise. (noce_try_sign_mask): Add comment regarding cost calculations. [Patch ifcvt 2/3] Move noce_if_info in to ifcvt.h 2015-09-26 James Greenhalgh <james.greenha...@arm.com> * ifcvt.c (noce_if_info): Move to... * ifcvt.h (noce_if_info): ...Here. [Patch ifcvt 3/3] Create a new target hook for deciding profitability of noce if-conversion 2015-09-26 James Greenhalgh <james.greenha...@arm.com> * target.def (costs): New hook vector. (ifcvt_noce_profitable_p): New hook. * doc/tm.texi.in: Document it. * doc/tm.texi: Regenerate. * targhooks.h (default_ifcvt_noce_profitable_p): New. * targhooks.c (default_ifcvt_noce_profitable_p): New. * ifcvt.c (noce_profitable_p): Use new target hook. [Patch Prototype AArch64 ifcvt 4/3] Wire up the new if-convert costs hook for AArch64 2015-09-26 James Greenhalgh <james.greenha...@arm.com> * config/aarch64/aarch64.c (aarch64_additional_branch_cost_for_probability): New. (aarch64_ifcvt_noce_profitable_p): Likewise. (TARGET_COSTS_IFCVT_NOCE_PROFITABLE_P): Likewise.