10.2代码调度的约束 10.2.2发现内存访问中的相关性 发现数据相关需要不同形式的分析 数组元素间的别名分析 A和A是否互为别名 指针别名分析 若p和g相等,则p和*q、p->next和g->next、 p->data和g->data等分别互为别名 过程间分析 引用调用场合:形参和形参之间、形参和全局变 量之间因实参而引起互为别名
10.2 代码调度的约束 10.2.2 发现内存访问中的相关性 • 发现数据相关需要不同形式的分析 – 数组元素间的别名分析 A[i]和A[j]是否互为别名 – 指针别名分析 若p和q相等,则p和q、p->next和q->next、 p->data和q->data等都分别互为别名 – 过程间分析 引用调用场合:形参和形参之间、形参和全局变 量之间因实参而引起互为别名
10.2代码调度的约束 10.2.3寄存器使用和并行执行之间的折衷 例:(a+b)+c+(d+e) 若瞄准极小化寄存器 LD R1,a 的使用个数,则只需 LD R2,b 使用3个寄存器 ADD R1,R1,R2 LD R2,c ADD R1,R1,R2 LD R2,d LD R3,e ADD R2.R2.R3 ADD R1,R1,R2
10.2 代码调度的约束 10.2.3 寄存器使用和并行执行之间的折衷 例:(a + b) + c + (d + e) LD R1, a LD R2, b ADD R1, R1, R2 LD R2, c ADD R1, R1, R2 LD R2, d LD R3, e ADD R2, R2, R3 ADD R1, R1, R2 + e + c + a b + d 若瞄准极小化寄存器 的使用个数,则只需 使用3个寄存器
10.2代码调度的约束 10.2.3寄存器使用和并行执行之间的折衷 例:(a+b)+c+(d+e) 完成整个计算需要7步 LD R1,a LD R2,b ADD R1,R1,R2 LD R2,c ADD R1,R1,R2 LD R2,d LD R3,e ADD R2.R2.R3 ADD R1,R1,R2
10.2 代码调度的约束 10.2.3 寄存器使用和并行执行之间的折衷 例:(a + b) + c + (d + e) LD R1, a LD R2, b ADD R1, R1, R2 LD R2, c ADD R1, R1, R2 LD R2, d LD R3, e ADD R2, R2, R3 ADD R1, R1, R2 + e + c + a b + d 完成整个计算需要7步
10.2代码调度的约束 10.2.3寄存器使用和并行执行之间的折衷 例:(a+b)+c+(d+e) 如果对每个中间结果 使用不同寄存器,则 完成计算只需要4步 R1= R2 b R3=c R4=d R5=e R6=R1+R2 R7=R4+R5 R8=R6+R3 R9 =R8+R7
10.2 代码调度的约束 10.2.3 寄存器使用和并行执行之间的折衷 例:(a + b) + c + (d + e) + e + c + a b + d 如果对每个中间结果 使用不同寄存器,则 完成计算只需要4步 R1 = a R6 = R1+R2 R8 = R6+R3 R9 = R8+R7 R2 = b R7 = R4+R5 R3 = c R4 = d R5 = e
10.2代码调度的约束 10.2.4寄存器分配和代码调度的次序安排 先寄存器分配 结果代码中会有很多存储相关 非数值应用本质上没有多少并行,采用这种方式 先代码调度 导致寄存器溢出,抵消指令级并行的优点 -适用于有许多大表达式的数值应用 在假定伪寄存器就是物理寄存器情况下,先调度 指令,然后寄存器分配,把处理寄存器溢出的代 码附加在必要的地方,并再次进行代码调度
10.2 代码调度的约束 10.2.4 寄存器分配和代码调度的次序安排 • 先寄存器分配 – 结果代码中会有很多存储相关 – 非数值应用本质上没有多少并行,采用这种方式 • 先代码调度 – 导致寄存器溢出,抵消指令级并行的优点 – 适用于有许多大表达式的数值应用 – 在假定伪寄存器就是物理寄存器情况下,先调度 指令,然后寄存器分配,把处理寄存器溢出的代 码附加在必要的地方,并再次进行代码调度