Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
dotNET Platform
runtime
提交
028c4330
R
runtime
项目概览
dotNET Platform
/
runtime
12 个月 前同步成功
通知
1
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
runtime
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
028c4330
编写于
11月 21, 2019
作者:
S
Sergey Andreenko
提交者:
GitHub
11月 21, 2019
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Propagate assertions through Exception handlers. (#160)
* propogate assertions through Exception handlers. * Add comments.
上级
64928927
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
40 addition
and
12 deletion
+40
-12
src/coreclr/src/jit/assertionprop.cpp
src/coreclr/src/jit/assertionprop.cpp
+18
-12
src/coreclr/src/jit/dataflow.h
src/coreclr/src/jit/dataflow.h
+6
-0
src/coreclr/src/jit/optcse.cpp
src/coreclr/src/jit/optcse.cpp
+16
-0
未找到文件。
src/coreclr/src/jit/assertionprop.cpp
浏览文件 @
028c4330
...
...
@@ -4526,6 +4526,23 @@ public:
BitVecOps
::
IntersectionD
(
apTraits
,
block
->
bbAssertionIn
,
pAssertionOut
);
}
//------------------------------------------------------------------------
// MergeHandler: Merge assertions into the first exception handler/filter block.
//
// Arguments:
// block - the block that is the start of a handler or filter;
// firstTryBlock - the first block of the try for "block" handler;
// lastTryBlock - the last block of the try for "block" handler;.
//
// Notes:
// We can jump to the handler from any instruction in the try region.
// It means we can propagate only assertions that are valid for the whole try region.
void
MergeHandler
(
BasicBlock
*
block
,
BasicBlock
*
firstTryBlock
,
BasicBlock
*
lastTryBlock
)
{
BitVecOps
::
IntersectionD
(
apTraits
,
block
->
bbAssertionIn
,
firstTryBlock
->
bbAssertionIn
);
BitVecOps
::
IntersectionD
(
apTraits
,
block
->
bbAssertionIn
,
lastTryBlock
->
bbAssertionOut
);
}
// At the end of the merge store results of the dataflow equations, in a postmerge state.
bool
EndMerge
(
BasicBlock
*
block
)
{
...
...
@@ -4677,20 +4694,9 @@ ASSERT_TP* Compiler::optInitAssertionDataflowFlags()
// Initially estimate the OUT sets to everything except killed expressions
// Also set the IN sets to 1, so that we can perform the intersection.
// Also, zero-out the flags for handler blocks, as we could be in the
// handler due to an exception bypassing the regular program flow which
// actually generates assertions along the bbAssertionOut/jumpDestOut
// edges.
for
(
BasicBlock
*
block
=
fgFirstBB
;
block
;
block
=
block
->
bbNext
)
{
if
(
bbIsHandlerBeg
(
block
))
{
block
->
bbAssertionIn
=
BitVecOps
::
MakeEmpty
(
apTraits
);
}
else
{
block
->
bbAssertionIn
=
BitVecOps
::
MakeCopy
(
apTraits
,
apValidFull
);
}
block
->
bbAssertionIn
=
BitVecOps
::
MakeCopy
(
apTraits
,
apValidFull
);
block
->
bbAssertionGen
=
BitVecOps
::
MakeEmpty
(
apTraits
);
block
->
bbAssertionOut
=
BitVecOps
::
MakeCopy
(
apTraits
,
apValidFull
);
jumpDestOut
[
block
->
bbNum
]
=
BitVecOps
::
MakeCopy
(
apTraits
,
apValidFull
);
...
...
src/coreclr/src/jit/dataflow.h
浏览文件 @
028c4330
...
...
@@ -52,6 +52,12 @@ void DataFlow::ForwardAnalysis(TCallback& callback)
worklist
.
erase
(
worklist
.
begin
());
callback
.
StartMerge
(
block
);
if
(
m_pCompiler
->
bbIsHandlerBeg
(
block
))
{
EHblkDsc
*
ehDsc
=
m_pCompiler
->
ehGetBlockHndDsc
(
block
);
callback
.
MergeHandler
(
block
,
ehDsc
->
ebdTryBeg
,
ehDsc
->
ebdTryLast
);
}
else
{
flowList
*
preds
=
m_pCompiler
->
BlockPredsWithEH
(
block
);
for
(
flowList
*
pred
=
preds
;
pred
;
pred
=
pred
->
flNext
)
...
...
src/coreclr/src/jit/optcse.cpp
浏览文件 @
028c4330
...
...
@@ -1034,6 +1034,22 @@ public:
#endif // DEBUG
}
//------------------------------------------------------------------------
// MergeHandler: Merge CSE values into the first exception handler/filter block.
//
// Arguments:
// block - the block that is the start of a handler or filter;
// firstTryBlock - the first block of the try for "block" handler;
// lastTryBlock - the last block of the try for "block" handler;.
//
// Notes:
// We can jump to the handler from any instruction in the try region.
// It means we can propagate only CSE that are valid for the whole try region.
void
MergeHandler
(
BasicBlock
*
block
,
BasicBlock
*
firstTryBlock
,
BasicBlock
*
lastTryBlock
)
{
// TODO CQ: add CSE for handler blocks, CSE_INTO_HANDLERS should be defined.
}
// At the end of the merge store results of the dataflow equations, in a postmerge state.
// We also handle the case where calls conditionally kill CSE availabilty.
//
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录