On 08/02/2017 12:34 PM, Richard Earnshaw wrote: > I'm not sure if that's a good or a bad thing. Currently the mid-end > depends on some rtx constructs having sensible costs even if there's no > rtl pattern to match them (IIRC plus:QI is one such construct - RISC > type machines usually lack such an instruction).
I hadn't considered this... but there are several possible workarounds. The simplest of which is to fall back to using rtx_cost if the insn_cost hook returns a failure indication, e.g. -1. > Also, costs tend to be > micro-architecture specific so attaching costs directly to patterns > would be extremely painful, adding support would require touching the > entirety of the MD files. The best bet would be a level of indirection > from the patterns to cost tables, much like scheduler attributes. I was never thinking of adding costs directly to the md files, but rather structuring the insn_cost hook like if (recog_memoized (insn) < 0) return -1; switch (get_attr_type (insn)) { case TYPE_iadd: case TYPE_ilog: case TYPE_mvi: return COSTS_N_INSNS (1); case TYPE_fadd: return cost_data->fp_add; } etc. This would be especially important when it comes costing for simd-type insns. Matching many of those any other way would be fraught with peril. > But that still leaves the issue of what to do with the cost of MEM vs > REG operands - in a pattern they may both be matched by general_operand > but the cost of each is quite distinct and the normal attributes system > probably won't (maybe can't) disambiguate the sub-types until after > register allocation. Pre-reload we'll probably have a pseudo and assume a register operand, or have an unambiguous memory. I don't think that's really a problem. We're producing a cost estimate based on what we are given at that moment. It does make x86 more complex than more RISC-ier targets, but still not impossible. There is at least a "memory" attribute with which one could adjust the base cost selected by the "type" attribute. One could also walk the pattern to count the number of mems, at least for a given subset of insn types. r~