On 10/15/2015 11:40 AM, Kyrill Tkachov wrote:
The code that analyzes the offsets of the loads/stores doesn't try to handle load/store-multiple insns. These appear rather frequently in memory streaming workloads on aarch64 in the form of load-pair/store-pair instructions i.e. ldp/stp. In RTL, they are created by the sched_fusion pass + a subsequent peephole and during sched2 they appear as PARALLEL rtxes of multiple SETs to/from memory.
* sched-int.h (struct autopref_multipass_data_): Remove offset field. Add min_offset, max_offset, multi_mem_insn_p fields. * haifa-sched.c (analyze_set_insn_for_autopref): New function. (autopref_multipass_init): Use it. Handle PARALLEL sets. (autopref_rank_data): New function. (autopref_rank_for_schedule): Use it. (autopref_multipass_dfa_lookahead_guard_1): Likewise.
Looks pretty reasonable to me. Ok to commit with a few changes next Wednesday unless you hear from Vlad in the meantime (I just want to give him time to look at it).
+/* Helper for autopref_multipass_init. Given a SET insn in PAT and whether + we're expecting a memory WRITE or not, check that the insn is relevant to + the autoprefetcher modelling code. Return true iff that is the case. + If it is relevant record the base register of the memory op in BASE and + the offset in OFFSET. */
Comma before "record". I think I'd just use "SET" rather than "SET insn", because in my mind an insn is always more than just a (part of a) pattern.
+static bool +analyze_set_insn_for_autopref (rtx pat, int write, rtx *base, int *offset)
bool write?
+ /* This insn is relevant for auto-prefetcher.
"the auto-prefetcher".
if (data2->status == AUTOPREF_MULTIPASS_DATA_IRRELEVANT) return 0; - if (rtx_equal_p (data1->base, data2->base) - && data1->offset > data2->offset) + bool delay_p = rtx_equal_p (data1->base, data2->base) + && autopref_rank_data (data1, data2) > 0; + if (delay_p)
If you want to do this you still need parentheses around the multi-line expression. I'd just keep it inside the if condition.
+ /* Is this a load/store-multiple instruction. */ + bool multi_mem_insn_p;
Maybe write "True if this is a ..." Bernd