Llvm 测量表达式的熵/可逆性

Llvm 测量表达式的熵/可逆性,llvm,entropy,Llvm,Entropy,我不确定这是否是我正在寻找的房产的正确名称,我希望有一些(甚至很多)关于它的研究,但没有找到任何东西 我试图测量一个表达式的“熵”或“可逆性”(编码在中,但这不是重点)。这有点模糊,但主要是关于我可以通过一个函数传递多少信息并从中获取。更准确地说,如果我将真随机值作为输入,那么作为输出,我将得到多接近真随机值的值 上限是查看总输入位宽度和总输出位宽度,并取最小位宽度。更严格的上界是在数据流图中采用最小切割(总比特宽度)。但我想知道是否有一种通用的方法可以更好地逼近这个数字。也许是已知位分析的一种

我不确定这是否是我正在寻找的房产的正确名称,我希望有一些(甚至很多)关于它的研究,但没有找到任何东西

我试图测量一个表达式的“熵”或“可逆性”(编码在中,但这不是重点)。这有点模糊,但主要是关于我可以通过一个函数传递多少信息并从中获取。更准确地说,如果我将真随机值作为输入,那么作为输出,我将得到多接近真随机值的值

上限是查看总输入位宽度和总输出位宽度,并取最小位宽度。更严格的上界是在数据流图中采用最小切割(总比特宽度)。但我想知道是否有一种通用的方法可以更好地逼近这个数字。也许是已知位分析的一种广义形式

例如:

; entropy = 64bit (fully reversible)
define i64 @test_a(i32 %x, i32 %y) {
    %x0 = zext i32 %x to i64
    %y0 = zext i32 %y to i64
    %z0 = shl i64 %x, 32
    %z = or i64 %z0, %y0
    ret i64 %z
}

; entropy < 64bit (it is not possible to distinguish permutation of the arguments,
;                  nor their respective prime decomposition)
define i64 @test_b(i32 %x, i32 %y) {
    %x0 = sext i32 %x to i64
    %y0 = sext i32 %y to i64
    %z = mult i64 %x0, %y0
    ret i64 %z
}

; entropy = 32bit (min-cut is on %z0 and is 32bit, the LSB of %z is %x xor %y)
define i64 @test_c(i32 %x, i32 %y) {
    %z0 = xor i32 %x, i32 %y
    %z1 = sext i32 %z0 to i64
    %z2 = shl i64 %z1, 32
    %z = xor i64 %z2, %z1
    ret i64 %z
}
;熵=64位(完全可逆)
定义测试时的i64(i32%x,i32%y){
%x0=zext i32%x至i64
%y0=zext i32%y至i64
%z0=shl i64%x,32
%z=或i64%z0,%y0
ret i64%z
}
; 熵<64位(不可能区分参数的排列,
;也不是它们各自的素分解)
定义测试时的i64(i32%x,i32%y){
%x0=从i32%x到i64的六分之一
%y0=从i32%到i64的六分之一
%z=多个i64%x0,%y0
ret i64%z
}
; 熵=32位(最小切割位于%z0上,为32位,%z的LSB为%x或%y)
定义测试时的i64(i32%x,i32%y){
%z0=异或i32%x,i32%y
%z1=sext i32%z0至i64
%z2=shl i64%z1,32
%z=xor i64%z2,%z1
ret i64%z
}
有没有办法得到熵的估计值?也许如果我在参数中加入随机值,并对结果进行熵分析,这会给我一个好主意


我对这个值感兴趣,因为它感觉与为该表达式生成电路的预期复杂性有关。例如,如果该表达式用于从地址计算中提取一个bank,则如果bank计算是低熵的,则crossbar稀疏的可能性更大。

符号执行可以给出一个将输入值与输出值关联的公式。使用它,您可以枚举输出的所有可能值。LLVM IR有一个名为KLEE的符号解释器。是的,我想得越多,我就越不认为它以一种聪明的方式是可行的。如果这很容易,我可以解决表达式等价性问题(通过对两个表达式进行异或测试)。