Thanks for not cc:ing me on any of this.
On Wed, Mar 15, 2017 at 04:00:21PM +0100, Bernd Schmidt wrote:
> +/* Set up a set of registers used in an insn. Called through note_uses,
> + arguments as described for that function. */
> +
> +static void
> +record_used_regs (rtx *xptr, void *data)
> +{
> + bitmap set = (bitmap)data;
Space after cast, throughout.
> + int i, j;
> + enum rtx_code code;
> + const char *fmt;
> + rtx x = *xptr;
> +
> + /* repeat is used to turn tail-recursion into iteration since GCC
> + can't do it when there's no return value. */
> + repeat:
This comment is incorrect.
> + /* If we are about to do the last recursive call
> + needed at this level, change it into iteration.
> + This function is called enough to be worth it. */
This function is called enough that it should not be called at all.
> + /* For combinations that may result in two insns, we have to gather
> + some extra information about registers used, so that we can
> + update all relevant LOG_LINKS later. */
Please just refuse to do the combination in such cases instead.
> + /* See comments above where we calculate the bitmap. */
> + EXECUTE_IF_SET_IN_BITMAP ((bitmap)new_regs_in_i2,
> + LAST_VIRTUAL_REGISTER, i, iter)
Why do you need a cast here at all?
> + {
> + rtx reg = regno_reg_rtx[i];
> + rtx_insn *other;
> + for (other = NEXT_INSN (i2); other != i3; other = NEXT_INSN (other))
> + if (NONDEBUG_INSN_P (other)
> + && (reg_overlap_mentioned_p (reg, PATTERN (other))
> + || (CALL_P (other) && find_reg_fusage (other, USE, reg))))
> + {
> + if (dump_file)
> + fprintf (dump_file,
> + "found extra use of reg %d at insn %d\n", i,
> + INSN_UID (other));
> + insn_link **plink;
> + for (plink = &LOG_LINKS (other);
> + *plink;
> + plink = &(*plink)->next)
> + {
> + insn_link *link = *plink;
> + if (link->regno == i)
> + {
> + *plink = link->next;
> + link->next = i3links;
> + i3links = link;
> + break;
> + }
> + }
> + break;
> + }
> + }
This should be a separate function.
So, no, I'm not okay with this. It is very expensive, it is doing open
heart surgery on combine's internal structures (in a way that may or may
not work), and all that to combine some insns in a case that should not
exist anyway.
Segher