我正在尝试使用 LLVM 分析通道对程序执行合并分析。
基本上,我需要查看数组访问并确定内存访问是否可以合并,即访问表达式是否相对于归纳变量是单调的。
我面临以下问题。数组访问用 LLVM IR 中的 getelementptr 指令表示。我怎样才能从那里重建表达式?
如果无法使用静态分析,我也愿意执行动态分析。
如果有帮助,我正在尝试实现以下算法:
procedure getCoalescingFactor(f, warpSize, reqLineSize)
x ← the variable that corresponds to the x grid coordinate
fw ← f where all variables are fixed except x grid coordinate
mono ← monotonicity(fw , x)
if mono is unknown then
culprits ← variables in fw which do not have a sign
fw ← fw where each variable in culprits is assumed positive
mono ← monotonicity(fw , x)
end if
if mono is monotonic then
if mono is increasing then
size ← f (x + warpSize) − f (x)
else
size ← f (x) − f (x + warpSize)
end if
return reqLineSize
else
offsets ← [fw (x), fw (x + 1), . . . , fw (x + warpSize)]
uniqOffsets ← removeDuplicates(offsets)
return size(uniqOffsets)
end if
end procedure