在llvm ir中将布尔向量转换为整数 [英] Conversion of vector of bool's to integer in llvm ir

查看:106
本文介绍了在llvm ir中将布尔向量转换为整数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在编写一个涉及向量运算的llvm-ir代码.我用'icmp'指令进行了整数向量比较,结果得到一个向量为< 8 x i1>的布尔向量,我的问题是我想将这8位转换为对应的整数值而无需遍历向量(向量),我尝试了将bitcast< 8 x i1>转换为i8",这似乎将向量的第一位转换为i8,如果不正确,请更正我.有人可以建议我这样做吗.

I am writing a llvm-ir code which involves vector operations. I did a integer vector comparison with 'icmp' instruction which resulted in a vector of bools say <8 x i1>, my problem is I want to convert this 8 bits to its corresponding integer value with out traversing the vector(extracting elements from vector), I tried 'bitcast <8 x i1> to i8' which seems converting first bit of the vector to i8, correct me if am wrong. Can someone suggest me a way to do this.

define i8 @main() #0 {
   entry:
     %A = alloca [8 x i32], align 16
     %B = alloca [8 x i32], align 16
     %arrayidx = getelementptr inbounds [8 x i32], [8 x i32]* %A, i64 0, i64 0
     store i32 90, i32* %arrayidx, align 4
     %arrayidx1 = getelementptr inbounds [8 x i32], [8 x i32]* %A, i64 0, i64 1
     store i32 91, i32* %arrayidx1, align 4
     %arrayidx2 = getelementptr inbounds [8 x i32], [8 x i32]* %A, i64 0, i64 2
     store i32 92, i32* %arrayidx2, align 8
     %arrayidx3 = getelementptr inbounds [8 x i32], [8 x i32]* %A, i64 0, i64 3
     store i32 93, i32* %arrayidx3, align 4

     %arrayidx4 = getelementptr inbounds [8 x i32], [8 x i32]* %B, i64 0, i64 0
     store i32 90, i32* %arrayidx4, align 4
     %arrayidx5 = getelementptr inbounds [8 x i32], [8 x i32]* %B, i64 0, i64 1
     store i32 1, i32* %arrayidx5, align 4
     %arrayidx6 = getelementptr inbounds [8 x i32], [8 x i32]* %B, i64 0, i64 2
     store i32 92, i32* %arrayidx6, align 8
     %arrayidx7 = getelementptr inbounds [8 x i32], [8 x i32]* %B, i64 0, i64 3
     store i32 93, i32* %arrayidx7, align 4
     br label %vector.body
  vector.body:

     %0 = bitcast [8 x i32]* %A to <8 x i32>*
     %1 = bitcast [8 x i32]* %B to <8 x i32>*

     %2 = load <8 x i32>, <8 x i32>* %0
     %3 = load <8 x i32>, <8 x i32>* %1

     %4 = icmp eq <8 x i32> %2, %3

     %5 = bitcast <8 x i1> %4 to i8

     ret i8 %5;

}

am使用'lli'来运行此代码而没有任何标志.预计输出为11,但得到1或0提前非常感谢您.

am using 'lli' for running this code with out any flags. Output is expected to be 11 but am getting 1 or 0 Thank you so much in advance.

推荐答案

我发现这种工作方式.

define i8 @main() #0 {
entry:
  %0 = icmp eq <8 x i32> <i32 90,i32 91,i32 92,i32 93, i32 94,i32 95,i32 96,i32 97>, <i32 90,i32 91,i32 92,i32 93, i32 94,i32 95,i32 96,i32 97>
  %1 = bitcast <8 x i1> %0 to <1 x i8>
  %2 = extractelement <1 x i8> %1, i32 0
  ret i8 %2
}

这与我在问题中张贴的代码类似,我用"echo $?"检查了结果.正在获得预期的结果.

This is similar code as I posted in the question, I checked the result with "echo $?" am getting the result as expected.

这篇关于在llvm ir中将布尔向量转换为整数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆