On Sun, Nov 6, 2011 at 7:53 PM, Aldy Hernandez <al...@redhat.com> wrote: > [rth, more comments for you below] > > On 11/04/11 04:14, Richard Guenther wrote: > >>> new_version = cgraph_create_node (new_decl); >>> >>> - new_version->analyzed = true; >>> + new_version->analyzed = old_version->analyzed; >> >> Hm? analyzed means "with body", sure you have a body if you clone. >> >>> new_version->local = old_version->local; >>> new_version->local.externally_visible = false; >>> new_version->local.local = true; >>> @@ -2294,6 +2294,7 @@ cgraph_copy_node_for_versioning (struct >>> new_version->rtl = old_version->rtl; >>> new_version->reachable = true; >>> new_version->count = old_version->count; >>> + new_version->lowered = true; >> >> OTOH this isn't necessary true. cgraph exists before lowering. > > I don't understand what you want me to do on either of these two comments. > Could you elaborate?
Do not push new_version->lowered setting into the core routine but keep it at the callers. >>> + /* TM pure functions should not get inlined if the outer function is >>> + a TM safe function. */ >>> + else if (flag_tm >> >> Please move flag checks into the respective prediates. Any reason >> why the is_tm_pure () predicate wouldn't already do the correct thing >> with !flag_tm? > > Done. > >>> + /* Map gimple stmt to tree label (or list of labels) for transaction >>> + restart and abort. */ >>> + htab_t GTY ((param_is (struct tm_restart_node))) tm_restart; >>> + >> >> As this maps 'gimple' to tree shouldn't this go to fn->gimple_df instead? >> That way you avoid growing generic struct function. Or in to eh_status, >> if that looks like a better fit. > > Done. > >>> + /* Mark all calls that can have a transaction restart. */ >> >> Why isn't this done when we expand the call? This walking of the >> RTL sequence looks like a hack (an easy one, albeit). >> >>> + if (cfun->tm_restart&& is_gimple_call (stmt)) >>> + { >>> + struct tm_restart_node dummy; >>> + void **slot; >>> + >>> + dummy.stmt = stmt; >>> + slot = htab_find_slot (cfun->tm_restart,&dummy, NO_INSERT); >>> + if (slot) >>> + { >>> + struct tm_restart_node *n = (struct tm_restart_node *) *slot; >>> + tree list = n->label_or_list; >>> + rtx insn; >>> + >>> + for (insn = next_real_insn (last); !CALL_P (insn); >>> + insn = next_real_insn (insn)) >>> + continue; >>> + >>> + if (TREE_CODE (list) == LABEL_DECL) >>> + add_reg_note (insn, REG_TM, label_rtx (list)); >>> + else >>> + for (; list ; list = TREE_CHAIN (list)) >>> + add_reg_note (insn, REG_TM, label_rtx (TREE_VALUE (list))); >>> + } >>> + } > > I can certainly move this to expand_call_stmt() if you prefer. Do you have > an objection to the RTL walk? This isn't my code, but I'm open to > suggestions on an alternative to implement. It just catched my eye... moving it to expand_call_stmt would be nice indeed, but I was suggesting to add that note where we produce the CALL rtx, not sure if that's reasonably straight-forward (I suppose there was a reason to go with the hack above ...). Richard.