On 11/14/14 12:19, Segher Boessenkool wrote:
With this new field in place, we can have LOG_LINKS for insns that set
more than one register and distribute them properly in distribute_links.
This then allows many more PARALLELs to be combined.

Also split off new functions can_combine_{def,use}_p from the
create_log_links function.


2014-11-14  Segher Boessenkool  <seg...@kernel.crashing.org>

gcc/
        * combine.c (struct insn_link): New field `regno'.
        (alloc_insn_link): New parameter `regno'.  Use it.
        (find_single_use): Check the new field.
        (can_combine_def_p, can_combine_use_p): New functions.  Split
        off from ...
        (create_log_links): ... here.  Correct data type of `regno'.
        Adjust call to alloc_insn_link.
        (adjust_for_new_dest): Find regno, use it in call to
        alloc_insn_link.
        (try_combine): Adjust call to alloc_insn_link.
        (distribute_links): Check the new field.
Didn't you lose the check that avoids duplicated LOG_LINKs? Or is the claim that the check is no longer needed because there are no duplicates now that we include the register associated with the link?


+
+  rtx set = single_set (insn);
+  gcc_assert (set);
+
+  rtx reg = SET_DEST (set);
+
+  while (GET_CODE (reg) == ZERO_EXTRACT
+        || GET_CODE (reg) == STRICT_LOW_PART
+        || GET_CODE (reg) == SUBREG)
+    reg = XEXP (reg, 0);
+  gcc_assert (REG_P (reg));
Can REG ever be a hard reg here? If so, then the SUBREG case needs to simplify the hard reg rather than just strip off the SUBREG.


Might be OK, depends on answers to questions above -- holding final approval pending those answers.

Jeff

Reply via email to