JIT: Allow sharing call temps within statements (#79574)
authorJakob Botsch Nielsen <Jakob.botsch.nielsen@gmail.com>
Thu, 5 Jan 2023 10:06:52 +0000 (11:06 +0100)
committerGitHub <noreply@github.com>
Thu, 5 Jan 2023 10:06:52 +0000 (11:06 +0100)
commitda54237402bdcf756ee4b4f6d23baf3393f0759b
tree76acaa603399582e7d1fcf4ca0b48fbbeb8a5b6d
parent83ce1253cf71348776fec4464e3fad1277fac7f0
JIT: Allow sharing call temps within statements (#79574)

fgMakeOutgoingArgCopy has a hashset of shared temps that it uses before
creating a new temp. However, this hash set is reset only at new
statements which can cause regressions when forward sub moves several
calls into the same statement.

This adds support to allow the temps to be shared also within the same
statement. To do this we must take care not to share temps that have
overlapping lifetimes.

Also remove the FOREACH_HBV_BIT_SET macro in favor of a callback-based
function. The macro expands to 4 nested loops, so "break;" in it would not
do what is expected, and we had a bug due to that. The callback-based
iteration is harder to misuse. I initially tried creating an iterator for it, but
that was much more complicated.
src/coreclr/jit/compiler.h
src/coreclr/jit/fgbasic.cpp
src/coreclr/jit/hashbv.cpp
src/coreclr/jit/hashbv.h
src/coreclr/jit/morph.cpp