CN103617049A - 基于互补谓词的代码移动方法 - Google Patents
基于互补谓词的代码移动方法 Download PDFInfo
- Publication number
- CN103617049A CN103617049A CN201310704227.XA CN201310704227A CN103617049A CN 103617049 A CN103617049 A CN 103617049A CN 201310704227 A CN201310704227 A CN 201310704227A CN 103617049 A CN103617049 A CN 103617049A
- Authority
- CN
- China
- Prior art keywords
- node
- instruction
- code
- predicate
- destination node
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Landscapes
- Devices For Executing Special Programs (AREA)
Abstract
本发明涉及一种基于互补谓词的代码移动方法,该方法包括:判断当前节点的指令到目标节点的谓词条件是否成立;目标节点是前驱节点或后继节点,节点是汇编文件的代码片段且彼此无回路;在谓词条件成立的情况下,根据谓词条件修改当前节点的推断寄存器;将当前节点内确定被移动的指令复制到控制流图中其各目标节点内并且删除当前节点内的指令;修补数据依赖图。本发明结合谓词互补谓词结构,在代码移动过程中修改指令的推断寄存器来抑制代码复制,无需进行代码补偿,并且代码移动方法实施代价低,实现简单,具有较高的工程实现价值。
Description
技术领域
本发明涉及代码移动技术,具体涉及一种基于互补谓词的代码移动方法。
背景技术
全局代码移动分为有环调度和无环调度。有环调度是沿着控制流图中的导致环路的回边(Back Edge),跨越基本块移动可调度的指令,而移动的区域通常只发生在循环片段内,如M Tokoro等人提出的模调度算法(ModularScheduling)。无环调度只处理控制流图中无回路的子路径片段或循环子片段。
现有技术方案一般是针对调度算法提出,其中较具代表性的算法有迹调度算法、渗透调度算法、全局调度算法、波沿调度算法。其中:
迹调度算法(Trace Scheduling)是J Knoop等人针对控制流图(ControlFlow Graph,CFG)中有向路径片段提出的,它依赖分支概率优先处理高概率执行的路径,代码移动过程必须为低概率的分支进行代码补偿,它尽管实现简单,但带来的代码膨胀率却不能忽视。
渗透调度算法(Percolation Scheduling)是Nicolau、Kernal等人基于并行程序图(Parallel Program Graph,PPG)提出的,它不同于TraceScheduling对分支概率的依赖,只分析PPG中的路径,但为了保证算法是可终止的,它只考虑向后继节点进行的代码下移,这导致了代码复制和不充分移动。
全局调度算法(Global Scheduling)是Bernstein基于PDG实现的,它通过分析节点之间支配与被支配关系,抑制了移动过程中的代码复制,但它并不适用于功能部件较多的超长指令字(Very Long Instruction Word,VLIW)体系结构。
波沿调度算法(Wavefront Scheduling)是Bharadwaj等人提出的,它十分灵活,它通过消除JS边或critical edge,并插入接口块(InterfaceBlock)高效的完成了代码补偿,但它的实现过程却非常复杂,目前仅被ecc编译器采用。
现有技术是面向编译器后端寄存器尚未分配时的中间语言级的应用,它们并未结合VLIW体系结构中的推断执行技术实现代码移动。
发明内容
本发明的目的是针对现有技术存在的上述问题,提供了一种实施代价低的代码移动方法。
为实现上述目的,本发明提供了一种基于互补谓词的全局代码移动方法,该方法包括以下步骤:
判断当前节点的指令到目标节点的谓词条件是否成立;目标节点是前驱节点或后继节点,节点是汇编文件的代码片段且彼此无回路;
在谓词条件成立的情况下,根据谓词条件修改当前节点的推断寄存器;
将当前节点内确定被移动的指令复制到控制流图中其各目标节点内并且删除当前节点内的指令;
修补数据依赖图。
优选地,在每个节点的出度或入度大于1的情况下,计算从控制流图中入口到各目标节点的分支概率,向执行概率高的前驱、后继节点中移动指令。
优选地,控制流图中每个节点的出度不超过2。
优选地,当当前节点的出度为2时,如果进行代码下移,在谓词条件成立的情况下,根据谓词条件修改当前节点的推断寄存器包括,将两个后继节点中的一个后继节点指令中的推断寄存器修改为分支出口指令的推断寄存器,将另一个后继节点中的推断寄存器修改为互补推断寄存器;
将当前节点内确定被移动的指令复制到两个后继节点内并且删除当前节点内的指令。
优选地,从入口到出口完整路径上的其它指令选择位于并行度低的方向上的节点作为目标节点。
优选地,判断当前节点的指令到目标节点的谓词条件是否成立还包括如果指令与目标节点的其它指令存在数据依赖,而目标节点的其它指令不能被移动,那么指令也不能被移动。
优选地,优先移动推断寄存器为第一推断寄存器的指令;
优选地,推断寄存器其它指令在移动时需检测是否存在谓词冲突。
优选地,判断当前节点的指令到目标节点的谓词条件是否成立包括,在存在多个目标节点的情况下,根据控制流图中各节点之间的控制依赖关系对各目标节点进行拓扑排序。
本发明结合谓词互补谓词结构,在代码移动过程中通过修改指令的推断寄存器来抑制代码复制,无需进行代码补偿,而且代码移动方法实施代价低,实现简单,具有较高的工程实现价值。
附图说明
图1为本发明实施例代码上移流程图;
图2为本发明实施例代码下移流程图;
图3为本发明实施例汇编代码片段和该代码片段对应的控制流图;
图4为本发明实施例汇编级基本块{Root,A,B,C}对应的数据依赖图;
图5为本发明实施例代码移动轨迹图。
具体实施方式
下面通过附图和实施例,对本发明的技术方案做进一步的详细描述。
图1和2是本发明一实施例一种基于互补谓词的全局代码移动方法流程图,其中,图1是代码上移流程图,其代码上移过程具体包括以下步骤:
步骤101、判断当前节点到其各前驱节点的谓词条件是否成立。
优选地,优先将汇编级基本块中的入口指令向上移动,从入口到出口完整路径上的其它指令优先向并行度低的方向移动。
步骤102、根据谓词条件修改推断寄存器。
优选地,优先移动推断寄存器为第一指令的指令,其它指令在移动时需检测是否存在谓词冲突,第一指令为使用推断寄存器在硬件结构上仅可读的指令。
步骤103、将当前节点内被移动的指令复制到控制流图中其各前驱节点内并且删除当前节点内的指令。
在步骤103之前还包括:根据控制流图中各节点之间的控制依赖关系对各节点进行拓扑排序。在每个节点的出度或入度大于1的情况下,通过计算控制流图中入口节点到达目标节点的分支概率,优先向执行概率高的前驱节点中移动代码。
步骤104、代码上移操作完成后修补数据依赖图。
如图2所示是代码下移流程图,代码下移过程具体包括以下步骤:
步骤201、判断当前节点到其各后继节点的谓词条件是否成立。
代码下移操作步骤包括:优先将汇编级基本块中的出口指令向下移动,从入口到出口完整路径上的其它指令优先向并行度低的方向移动。
步骤202、根据谓词条件修改推断寄存器,谓词条件修改推断寄存器步骤包括:
优先移动推断寄存器为第一指令的指令,其它指令在移动时需检测是否存在谓词冲突,第一指令为使用推断寄存器在硬件结构上仅可读的指令。
步骤203、将当前节点内被移动的指令复制到控制流图中其各后继节点内。
在步骤203之前还包括:根据控制流图中各节点之间的控制依赖关系对各节点进行拓扑排序。在每个节点的出度或入度大于1的情况下,通过计算控制流图中入口节点到达目标节点的分支概率,优先向执行概率高的后继节点中移动代码。并且控制流图中每个节点的出度不超过2,或后继节点的个数不超过2,当控制流图中的节点的出度为0时,则不进行代码下移;当控制流图中的节点的出度值为1时,则删除节点中与分支出口指令相关的指令,并将目标节点的代码直接复制到节点中分支出口指令位置;当控制流图中的节点的出度为2,则在进行代码下移时,两个后继节点中的一个后继节点指令中的推断寄存器被修改为分支出口指令的推断寄存器,另一个后继节点中的推断寄存器则被修改为互补推断寄存器;如果待移动的指令与当前节点的其它前驱内指令存在数据依赖,则不进行代码移动操作。
步骤204、代码下移操作完成后修补数据依赖图。
在一个实施例中,如图3(a)为本发明实施例中由{Root,A,B,C}四个汇编级基本块组成的汇编代码片段,如图3(b)所示为本发明实施例中该代码片段对应的CFG(控制流图),如图4所示为{Root,A,B,C}四个汇编级基本块对应的DDG(数据依赖图),如图5所示为代码移动轨迹图,表1为本发明Algorithm1.基于互补谓词的代码移动算法。下面将结合图3、图4和图5来说明表1中的代码移动方法,其中Algorithm1中的7—9是代码上移算法,10—13是代码下移算法。
描述了判断当前节点到其各前驱节点的谓词条件是否成立,如果成立,根据谓词条件来进行代码上移,根据谓词条件修改推断寄存器,将当前节点内被移动的指令复制到控制流图中其各前驱节点内,代码上移操作完成后修补数据依赖图。
具体地,Root是A的唯一前驱,当推断寄存器Pr5的值为0时路径Root→A成立。指令A:1是A的数据依赖图(Data Dependence Graph,DDG)中的入口指令,它的推断寄存器为Pr0,因此指令A:1被执行的谓词条件为Pr0&&!Pr5(化简后即为!Pr5),而条件判断指令Root:1使Pr5,Pr6这两个推断寄存器的值互补,因此,指令A:1可以向上移动到汇编级基本块Root中,并将它使用的推断寄存器修改为Pr6。指令Root:1对推断寄存器Pr6存在写操作,因此,指令A:1向上移动的位置应当介于指令Root:1与指令Root:2之间;B存在两个直接前驱Root和A,当推断寄存器Pr5的值为1时路径Root→B成立,而指令B:1与B:3是B的DDG中的两个入口,同理可知它们在Root→B下谓词执行条件为Pr5且不与Root中的其它指令存在数据依赖关系,因此可将它们推断寄存器修改为Pr0后放入Root:2之前的任意位置。然而,A也是B的一个前驱,如果只将指令移动到Root势必导致路径A→B的执行错误。路径A→B下指令B:1与B:3谓词条件为!Pr2,即需找出Pr2在该路径中互补推断寄存器Prx(实际上SuperV DSP配套编译器产生的汇编代码总是将条件判断指令与分支跳转指令放在一个一个汇编基本块内,Prx总是可以找到的),那么B:1只能放在指令A:2与A:4之间,B:3可放到指令A:4之前。
代码下移:Algorithm1中“Exits←/*DDG的出口指令序列*/;whileExits≠;successors←/*获取前驱集合*/;if/*出口指令可被移动*/;/*修改推断寄存器并移动*/”。
描述了判断当前节点到其各后继节点的谓词条件是否成立,如果成立,根据谓词条件来进行代码下移,根据谓词条件修改推断寄存器,将当前节点内被移动的指令复制到控制流图中其各后继节点内,代码下移操作完成后修补数据依赖图。
具体地,C是B的唯一后继,当推断寄存器Pr2的值为0时子路径B→C成立。指令B:2是除了分支出口指令B:4以外,在DDG中唯一以不存在后续节点的指令,它的谓词条件为Pr2=0,因此可被直接移动到C中,由于B:2与指令C:1存在数据依赖关系,因此,它只能被放在指令C:1之前,但是路径A→C成立的条件是Pr2=1,即指令B:2如果被移动到C后将在路径A→C中被执行从而导致执行错误,因此,指令B:2不能被移动;B与C是A的两个后继节点,A中的指令向B或C任意一方移动代码时需对另一方进行代码复制,且不能影响B或C的其它前驱节点的逻辑语义,指令A:3是A中独立于分支出口指令A:4外的唯一出口,将它的推断寄存器修改为Pr2后可分别移动至B与C,B的前驱Root中不修改Pr2的值,因此向B的移动是有效的且位置在指令B:4之前即可,同理可知向C的移动也是有效的且位置在C:3之前。从这个过程中可以看出,代码下移需考虑节点之间的关系相比与进行代码上移时更加复杂,诸如渗透调度[93][94]等算法为了确保调度是可被终止的就不采用代码下移。
除了入口指令进行的代码上移以及出口指令进行的代码下移,目标汇编级基本块的DDG中的其它节点也可以移动,但它们移动方向却受到数据相关性的制约。例如DDG中从入口节点In到出口节点Out存在一条完整的路径In→Node1→…→Noden→Out,那么子路径片段In→Node1→…→Nodei中全部节点的移动方向必须与In一致,而子路径片段Nodei+1→…→Out中全部节点的移动方向必须与Out一致,其余的操作与入口指令进行代码上移和出口指令进行代码下移一致。
表1
其中,本发明在进行代码移动时制定的规则可归纳为如下几点:
(1)移动过程中只进行代码复制,不进行代码补偿,代码上移时需将当前节点内被移动的指令复制到CFG中其它前驱内,代码下移时则需将当前节点内被移动的指令复制到CFG中其它后继内。
(2)移动时不分析完整路径的谓词条件,只判断前驱节点i到后继节点j的谓词成立条件condition,代码移动过程中根据condition修改推断寄存器。
(3)CFG中每个节点的出度不超过2,当节点Node的出度为0时不进行代码下移;当节点Node的出度值为1时删除Node中与分支出口指令相关的指令,并将目标节点的代码直接复制到Node中分支出口指令位置;当节点Node的出度为2,进行代码上移时,两个后继节点内的指令一个直接修改推断寄存器为Node的分支出口指令的推断寄存器,另一个则修改为互补推断寄存器,移动是否成功还取决于待移动的指令与当前节点的其它前驱内指令是否存在数据依赖。
(4)优先移动推断寄存器为Pr0的指令,其它指令在移动时需检测是否存在谓词冲突,如规则3。
(5)优先将汇编级基本块DDG中的入口指令向上移动,出口指令向下移动,从入口到出口完整路径上的其它指令优先向并行度低的方向移动。
(6)代码移动完成后修补DDG。
(7)根据CFG中节点之间的控制依赖关系对节点进行拓扑排序,如图1中的例子,Root是CFG中的入口,它的优先级最高,C是出口优先级最低,B控制依赖于A,因此A的优先级高于B,所以分析顺序依次为Root,A,B,C。
(8)代码移动过程可支持投机机制,计算从CFG中入口到达目标节点的分支概率,优先向执行概率高的前驱、后继节点中移动有利代码。
上述为本发明基于互补谓词结构的分析方法,该方法结合谓词互补谓词结构,在代码移动过程中修改指令的推断寄存器来抑制代码复制,无需进行代码补偿,并且代码移动方法实施代价低,实现简单,具有较高的工程实现价值。
以上所述的具体实施方式,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施方式而已,并不用于限定本发明的保护范围,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (9)
1.一种基于互补谓词的代码移动方法,其特征在于,所述方法包括:
判断当前节点的指令到目标节点的谓词条件是否成立;所述目标节点是前驱节点或后继节点,节点是汇编文件的代码片段且彼此无回路;
在谓词条件成立的情况下,根据所述谓词条件修改所述当前节点的推断寄存器;
将所述当前节点内确定被移动的指令复制到控制流图中其各目标节点内并且删除所述当前节点内的指令;
修补数据依赖图。
2.根据权利要求1所述的方法,其特征在于,在所述代码下移操作中,所述控制流图中每个节点的出度不超过2。
3.根据权利要求3所述的方法,其特征在于,
当所述当前节点的出度为2时,如果进行所述代码下移,所述在谓词条件成立的情况下,根据所述谓词条件修改所述当前节点的推断寄存器包括,将两个后继节点中的一个后继节点指令中的推断寄存器修改为分支出口指令的推断寄存器,将另一个后继节点中的推断寄存器修改为互补推断寄存器;
所述将当前节点内确定被移动的指令复制到控制流图中其各目标节点内并且删除当前节点内的指令包括,将所述当前节点内确定被移动的指令复制到两个后继节点内并且删除所述当前节点内的指令。
4.根据权利要求1所述的方法,其特征在于,所述方法包括:
从入口到出口完整路径上的其它指令选择位于并行度低的方向上的节点作为目标节点。
5.根据权利要求1-6之一所述的方法,其特征在于,
所述判断当前节点的指令到目标节点的谓词条件是否成立还包括,如果所述当前节点指令与所述目标节点的其它指令存在数据依赖,而所述目标节点的其它指令不能被移动,那么所述指令也不能被移动。
6.根据权利要求1所述的方法,其特征在于,所述方法包括:
优先移动推断寄存器为第一推断寄存器的指令。
7.根据权利要求7所述的方法,其特征在于,所述方法包括:
所述推断寄存器其它指令在移动时需检测是否存在谓词冲突。
8.根据权利要求1所述的方法,其特征在于,所述判断当前节点的指令到目标节点的谓词条件是否成立包括,在存在多个目标节点的情况下,根据所述控制流图中各节点之间的控制依赖关系对各目标节点进行拓扑排序。
9.根据权利要求1所述的方法,其特征在于,所述判断所述当前节点的指令到所述目标节点的谓词条件是否成立包括,在每个节点的出度或入度大于1的情况下,可计算从控制流图中入口到各目标节点的分支概率,向执行概率高的前驱、后继节点中移动指令。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310704227.XA CN103617049B (zh) | 2013-12-19 | 2013-12-19 | 基于互补谓词的代码移动方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310704227.XA CN103617049B (zh) | 2013-12-19 | 2013-12-19 | 基于互补谓词的代码移动方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103617049A true CN103617049A (zh) | 2014-03-05 |
CN103617049B CN103617049B (zh) | 2017-03-29 |
Family
ID=50167752
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201310704227.XA Expired - Fee Related CN103617049B (zh) | 2013-12-19 | 2013-12-19 | 基于互补谓词的代码移动方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103617049B (zh) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107239260A (zh) * | 2017-05-11 | 2017-10-10 | 中国电子科技集团公司第三十八研究所 | 一种面向数字信号处理器的多谓词控制及编译优化方法 |
CN109240701A (zh) * | 2018-08-13 | 2019-01-18 | 湖南科技大学 | 一种面向谓词执行高性能dsp的指令依赖关系分析方法 |
CN117251171A (zh) * | 2023-11-20 | 2023-12-19 | 常熟理工学院 | 一种控制流图中谓词基本块检测方法及设备 |
CN117407876A (zh) * | 2023-12-11 | 2024-01-16 | 常熟理工学院 | 恶意软件中的不透明谓词检测方法、系统及存储介质 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20060200811A1 (en) * | 2005-03-07 | 2006-09-07 | Cheng Stephen M | Method of generating optimised stack code |
CN1900910A (zh) * | 2005-07-22 | 2007-01-24 | 中国科学院计算技术研究所 | 二进制翻译中经由跳转表的多目标分支语句的识别方法 |
CN101944064A (zh) * | 2010-10-12 | 2011-01-12 | 中国人民解放军国防科学技术大学 | 一种基于重构控制流图的控制流错误检测优化方法 |
-
2013
- 2013-12-19 CN CN201310704227.XA patent/CN103617049B/zh not_active Expired - Fee Related
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20060200811A1 (en) * | 2005-03-07 | 2006-09-07 | Cheng Stephen M | Method of generating optimised stack code |
CN1900910A (zh) * | 2005-07-22 | 2007-01-24 | 中国科学院计算技术研究所 | 二进制翻译中经由跳转表的多目标分支语句的识别方法 |
CN101944064A (zh) * | 2010-10-12 | 2011-01-12 | 中国人民解放军国防科学技术大学 | 一种基于重构控制流图的控制流错误检测优化方法 |
Non-Patent Citations (1)
Title |
---|
胡定磊: "基于互补谓词的编译优化", 《电子学报》 * |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107239260A (zh) * | 2017-05-11 | 2017-10-10 | 中国电子科技集团公司第三十八研究所 | 一种面向数字信号处理器的多谓词控制及编译优化方法 |
CN107239260B (zh) * | 2017-05-11 | 2020-07-24 | 中国电子科技集团公司第三十八研究所 | 一种面向数字信号处理器的多谓词控制及编译优化方法 |
CN109240701A (zh) * | 2018-08-13 | 2019-01-18 | 湖南科技大学 | 一种面向谓词执行高性能dsp的指令依赖关系分析方法 |
CN109240701B (zh) * | 2018-08-13 | 2022-06-28 | 湖南科技大学 | 一种面向谓词执行高性能dsp的指令依赖关系分析方法 |
CN117251171A (zh) * | 2023-11-20 | 2023-12-19 | 常熟理工学院 | 一种控制流图中谓词基本块检测方法及设备 |
CN117251171B (zh) * | 2023-11-20 | 2024-04-12 | 常熟理工学院 | 一种控制流图中谓词基本块检测方法及设备 |
CN117407876A (zh) * | 2023-12-11 | 2024-01-16 | 常熟理工学院 | 恶意软件中的不透明谓词检测方法、系统及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN103617049B (zh) | 2017-03-29 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CA2288614C (en) | Loop allocation for optimizing compilers | |
US8291197B2 (en) | Aggressive loop parallelization using speculative execution mechanisms | |
CN102200924B (zh) | 基于模调度实现循环指令调度的编译方法及装置 | |
US7458065B2 (en) | Selection of spawning pairs for a speculative multithreaded processor | |
CN103617049A (zh) | 基于互补谓词的代码移动方法 | |
JP2003280919A (ja) | コンパイル方法、コンパイル装置、及びコンパイル用プログラム | |
CN103377035A (zh) | 针对粗颗粒度流应用的流水并行化方法 | |
Baghsorkhi et al. | FlexVec: Auto-vectorization for irregular loops | |
CN111177733A (zh) | 一种基于数据流分析的软件补丁检测方法及装置 | |
CN104375875A (zh) | 用于应用程序的编译优化的方法以及编译器 | |
CN103645930A (zh) | 汇编级跨文件调度框架的构建方法 | |
US20090019431A1 (en) | Optimised compilation method during conditional branching | |
CN105843660A (zh) | 一种编译器的代码优化调度方法 | |
Lakshminarayana et al. | Incorporating speculative execution into scheduling of control-flow-intensive designs | |
US20080028383A1 (en) | Architecture Cloning For Power PC Processors | |
CN107209662A (zh) | 指令的相依性预测 | |
KR100834676B1 (ko) | 소프트웨어 프로젝트 빌드 방법 | |
CN108334756A (zh) | 一种对递归下降式分析器反编译的干扰方法及装置 | |
CN112313626A (zh) | 异步处理器架构上的死锁检测及同步感知优化的方法 | |
CN105138309B (zh) | 基于cmp的推测多线程机制下的多推测路径线程划分方法 | |
CN112445520B (zh) | 针对循环内条件转移指令的转移预测优化方法 | |
CN102902532B (zh) | 一种集成开发环境中工具链转换扩展方法 | |
Shobaki et al. | Optimal trace scheduling using enumeration | |
CN104317572A (zh) | 一种实时系统的循环边界内向分析方法 | |
CN113642763B (zh) | 基于预算约束的高端装备研制资源配置与优化调度方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20170329 Termination date: 20191219 |