【发布时间】:2016-07-13 07:52:42
【问题描述】:
我正在编写一个涉及向量操作的 llvm-ir 代码。我与'icmp'指令进行了整数向量比较,结果是一个布尔向量说,我的问题是我想将这8位转换为其相应的整数值而不遍历向量(从向量中提取元素),我尝试了'bitcast to i8',这似乎将向量的第一位转换为i8,如果错了,请纠正我。有人可以建议我这样做的方法。
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;
}
我使用 'lli' 来运行此代码而没有任何标志。输出预计为 11,但我得到 1 或 0 非常感谢您。
【问题讨论】:
-
bitcast 应该做你想做的事:llvm.org/docs/LangRef.html#bitcast-to-instruction
-
正如我所说,它正在投射 向量的第一个 i1。我得到向量的零或一非整数等价物。我也尝试了其他示例。
-
您能提供一个完整的工作示例和生成的程序集吗?对我来说它看起来像一个错误
-
我已经在问题中添加了代码。谢谢
-
添加了一个答案。希望对您有所帮助。
标签: llvm vectorization llvm-ir llvm-c++-api