一种消除冗余的内存访问操作的编译优化方法
【专利摘要】本发明公开了一种消除冗余的内存访问操作的编译优化方法,用于别名信息不精确且访存采用Load/Store架构的系统中,是基于轻量的数据流分析方法,在代码生成阶段,通过特定的存储-加载指令序列特点,判断其中的加载指令是否冗余,对于冗余的Load指令,依据前继指令的特点,可以对其进行删除,或转换为代价较小的拷贝指令或者是比特位提取指令。本发明能够消除冗余的访存指令,大大减少程序的访存时间,提高程序性能,同时暴露了更多的程序优化机会,提高了程序性能。
【专利说明】一种消除冗余的内存访问操作的编译优化方法
【技术领域】
[0001]本发明涉及计算机【技术领域】,一种消除冗余的内存访问操作的编译优化方法。
【背景技术】
[0002]计算机访存指令将存放在内存中的数据加载到物理寄存器中,它的执行时间往往是一条普通指令的十几至几十倍。编译器在为程序生成二进制代码时,总是尽量产生最少的访存指令,这会减少程序的访存时间,提升程序的执行效率。但随着别名和指针在现代程序语言中的广泛使用,编译器在执行访存优化时,往往缺乏足够的别名信息。为了保证二进制代码的正确性,编译器往往会基于保守的别名分析,产生较多的访存指令,这严重增加了程序的访存时间,降低了程序的性能。
【发明内容】
[0003]本发明所要解决的技术问题是提出一种消除冗余的内存访问操作的编译优化方法,利用该编译优化方法,可消除冗余的访存指令,减少程序的访存时间,从而提高程序的执行性能。
[0004]为解决上述技术问题,本发明所采取的技术方案是:一种消除冗余的内存访问操作的编译优化方法,该方法用于别名信息不精确且访存采用Load/Store架构的系统中,包括以下步骤:
(1).以基本块为单位对程序进行简单的数据流分析,得到数据访问的使用-定义链;
(2).以基本块为单位对指令链进行前向遍历,如果检测到内存加载Load指令,那么访问使用-定义链找到它的定义指令,如果该指令和当前指令的访存地址具有别名关系,那么进入步骤⑶;如果该指令和当前指令的访存地址具有包含关系,那么进入步骤⑷;如果该指令和当前指令的访存地址相同,那么进入步骤(5);否则进入步骤(6);
⑶.记录定义指令为opl,继续访问该指令的前继定义指令op2,根据别名信息,分别比较三条指令的基址寄存器、偏移量寄存器内容关系,并将当前的加载指令转换为相应形式的拷贝指令,然后进入步骤(6);
⑷.如果前继定义指令为内存存储Store指令,将加载指令转化为相应的比特提取指令,然后进入步骤(6);
(5).删除加载指令,并插入拷贝指令,然后进入步骤(6);
(6).执行步骤⑵,直到程序所有的基本块处理完毕。
[0005]本发明采用上述技术方案所设计的一种消除冗余的内存访问操作的编译优化方法,是基于轻量的数据流分析方法,在代码生成阶段,通过特定的存储-加载指令序列特点,判断其中的加载指令是否冗余,对于冗余的Load指令,依据前继指令的特点,可以对其进行删除,或转换为代价较小的拷贝指令或者是比特位提取指令。本发明能够消除冗余的访存指令,大大减少程序的访存时间,提高程序性能,同时暴露了更多的程序优化机会,提高了程序性能。【专利附图】
【附图说明】
[0006]图1表示本发明一种消除冗余的内存访问操作的编译优化方法的流程图。
【具体实施方式】
[0007]下面结合附图和【具体实施方式】对本发明一种消除冗余的内存访问操作的编译优化方法进行详细的说明。
[0008]本发明一种消除冗余的内存访问操作的编译优化方法,参见图1,该方法用于别名信息不精确且访存采用Load/Store架构的系统中,是一种可以消除多余的加载指令的优化方法,该方法包括以下步骤:
(1).以基本块为单位对程序进行简单的数据流分析,得到数据访问的使用-定义链,即U-D 链;
⑵.以基本块为单位对指令链进行前向遍历,如果检测到内存加载Load指令,那么访问使用-定义链找到它的定义指令,如果该指令和当前指令的访存地址具有别名关系,且具有干涉关系,那么进入步骤⑶;如果该指令和当前指令的访存地址具有包含关系,那么进入步骤⑷;如果该指令和当前指令的访存地址相同,并且不会修改额外的机器状态位,那么进入步骤(5);否则进入步骤(6);
(3).记录干涉指令opl,继续访问该指令的前继定义指令op2 (不限于内存存储或加载指令)。如果有精确的别名信息,则判断当前指令使用的是干涉指令opl结果还是前继定义指令op2结果,转化当前的加载指令为相应的拷贝指令;如果没有精确的别名信息,那么分别比较这三条指令的基址寄存器、偏移量寄存器的关系:如果相同,那么使用结果相同的寄存器号,并转化当前的加载指令为相应的拷贝指令;然后进入步骤(6);
⑷.如果前继定义指令为内存存储Store指令,那么计算访存地址的偏移值,并将加载指令转化为相应的比特位提取指令,然后进入步骤(6);
(5).删除加载指令,并插入拷贝指令,将定义指令的目标寄存器作为源寄存器,加载指令的目标寄存器作为目标寄存器,然后进入步骤(6).(6).执行步骤⑵,直到程序所有的基本块处理完毕。
[0009]本发明一种消除冗余的内存访问操作的编译优化方法,是基于轻量的数据流分析方法,在代码生成阶段,通过特定的存储-加载指令序列特点,判断其中的加载指令是否冗余,对于冗余的Load指令,依据前继指令的特点,可以对其进行删除,或转换为代价较小的拷贝指令或者是比特位提取指令。
[0010]以上实施例仅用于说明本发明的技术方案而非限制,尽管参照实施例对本发明进行了详细说明,本领域的普通技术人员应当理解,对本发明的技术方案进行修改或者等同替换,在不脱离本发明技术方案的精神和范围的情况下,其均应涵盖在本发明的保护范围当中。
【权利要求】
1.一种消除冗余的内存访问操作的编译优化方法,该方法用于别名信息不精确且访存采用Load/Store架构的系统中,其特征在于包括以下步骤: (1).以基本块为单位对程序进行简单的数据流分析,得到数据访问的使用-定义链; (2).以基本块为单位对指令链进行前向遍历,如果检测到内存加载Load指令,那么访问使用-定义链找到它的定义指令,如果该指令和当前指令的访存地址具有别名关系,那么进入步骤⑶;如果该指令和当前指令的访存地址具有包含关系,那么进入步骤⑷;如果该指令和当前指令的访存地址相同,那么进入步骤(5);否则进入步骤(6); ⑶.记录定义指令为opl,继续访问该指令的前继定义指令op2,根据别名信息,分别比较三条指令的基址寄存器、偏移量寄存器内容关系,并将当前的加载指令转换为相应形式的拷贝指令,然后进入步骤(6); ⑷.如果前继定义指令为内存存储Store指令,将加载指令转化为相应的比特提取指令,然后进入步骤(6); (5).删除加载指令,并插入拷贝指令,然后进入步骤(6); (6).执行步骤⑵,直到程序所有的基本块处理完毕。
【文档编号】G06F9/45GK103942082SQ201410129958
【公开日】2014年7月23日 申请日期:2014年4月2日 优先权日:2014年4月2日
【发明者】杨磊, 王萍, 肖东岳, 韩峰, 胡可 申请人:南阳理工学院