summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorPat Gavlin <pagavlin@microsoft.com>2016-09-20 16:44:53 -0700
committerPat Gavlin <pagavlin@microsoft.com>2016-09-21 18:19:05 -0700
commitbfadb4bf808f23af05a39e38208985ab009d117b (patch)
tree57e39eabe990e40ddd52ce8b0af21bcab24a2630 /tests
parent96f474c67e83b178c3a27afc1540953948610c73 (diff)
downloadcoreclr-bfadb4bf808f23af05a39e38208985ab009d117b.tar.gz
coreclr-bfadb4bf808f23af05a39e38208985ab009d117b.tar.bz2
coreclr-bfadb4bf808f23af05a39e38208985ab009d117b.zip
Implement `st.lclFld` decomposition and fix #6778.
The problem that was blocking both of these issues was an issue in liveness when analyzing `st.lclFld` nodes that store to an unpromoted long-typed local variable or any long-typed field. The latter case--a `st.lclFld` node that targets a long-typed field--is easy to handle. Such stores are decomposed from: ``` /--* t0 int +--* t1 int t2 = * gt_long long /--* t2 * st.lclFld long V00 ``` To: ``` /--* t0 * st.lclFld int V00 [+0] /--* t1 * st.lclFld int V00 [+4] ``` The two `st.lclFld` nodes that this transformation generates are marked with `GTF_VAR_USEASG` to indicate that they are partial (rather than complete) defs. This is necessary in order to correctly calculate liveness. Before this change, stores to unpromoted long-typed local variables were also decomposed in the above fashion. These local vars can arise in a number of situations: - vars that are used to store multi-reg args or return values - vars that represent long-typed fields of promoted struct-typed vars - long-typed vars that are marked as unenregisterable before decomp Unfortunately, the decomposition given above differs in its liveness semantics when compared to the original IR: in the original IR, the `st.lclVar` is considered a plain def of its destination, while in the decomposed IR, each `st.lclFld` is considered both a partial def and a use of its destination. This difference--namely, that in the first case the destination is not used at the def and in the second case it is--causes problems for any analysis that needs to take into account whether or not a variable is used at a def (e.g. dead store removal, live-in sets, etc.). In order to retain the original semantics without complicating the IR, stores to unpromoted, long-typed local variables are not decomposed. These stores are instead handled during code generation.
Diffstat (limited to 'tests')
-rw-r--r--tests/issues.targets6
1 files changed, 0 insertions, 6 deletions
diff --git a/tests/issues.targets b/tests/issues.targets
index 41be913202..45cb5a98b4 100644
--- a/tests/issues.targets
+++ b/tests/issues.targets
@@ -239,12 +239,6 @@
<!-- The following x86 failures only occur with RyuJIT/x86 -->
<ItemGroup Condition="'$(XunitTestBinBase)' != '' and '$(BuildArch)' == 'x86'">
- <ExcludeList Include="$(XunitTestBinBase)\JIT\jit64\eh\basics\loopEH\loopEH.cmd">
- <Issue>6778</Issue>
- </ExcludeList>
- <ExcludeList Include="$(XunitTestBinBase)\JIT\Methodical\int64\superlong\_il_relsuperlong\_il_relsuperlong.cmd">
- <Issue>6778</Issue>
- </ExcludeList>
<ExcludeList Include="$(XunitTestBinBase)\GC\Scenarios\DoublinkList\dlstack\*">
<Issue>6553</Issue>
</ExcludeList>