zhi chen via llvm-dev
2017-May-05 23:41 UTC
[llvm-dev] load instruction to gather intrinsics
The frontend would generate the load in the IR. I am using IRBuilder to generate gather. I know it is mainly for discontinuous memory locations. It's a long story why I want to use this. I want to gather some memory locations. Suppose there are an array A, I manually duplicated it somewhere with an offset x. Now, we have two arrays A and A', where A'[i] - A[i] offset. I want to gather the two values at A+i and A+i whenever there was a load instruction to get a value from A+i. It is easy to do this if the code was not vectorized, but it become tricky when they are vectorized. If there is a load %1 = load <2 x i64>* %Ai, align 8, which loads two consecutive values at Ai, I need to gather the values from A'i as well. So I think I need to use gather to get values from A+i, A+i+1, A'+i, A'+i+1. On Fri, May 5, 2017 at 4:10 PM, 陳韋任 <chenwj.cs97g at g2.nctu.edu.tw> wrote:> > > 2017-05-06 5:42 GMT+08:00 zhi chen via llvm-dev <llvm-dev at lists.llvm.org>: > >> Hi All, >> >> Can I change a vector load to gather intrinsic? If so, how can I do it? >> For example, I want to change the following IR code >> >> %1 = load <2 x i64>* %arrayidx1, align 8 >> >> to >> >> %1 = call <2 x i64> @llvm.masked.gather.v2i64(<2 x i64*> %arrayidx1, i32 8, <2 x i1> <i1 true, i1 true>, <2 x i64> undef) >> >> > How those IR would be generated? By frontend or your IRBuilder? And why > you want to use gather intrinsic? From the LangRef [1], seems it is mainly > for discontinuous memory locations. > > > >> Basically, I am not sure how to get two consecutive addresses started >> from arrayidx1. Thanks for your time and help in advance. >> > > Maybe `getelementptr` is what you need to calculate consecutive > addresses. > > [1] http://llvm.org/docs/LangRef.html#llvm-masked-gather-intrinsics > > HTH, > chenwj > > -- > Wei-Ren Chen (陳韋任) > Homepage: https://people.cs.nctu.edu.tw/~chenwj >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170505/522e9413/attachment.html>
2017-05-06 7:41 GMT+08:00 zhi chen <zchenhn at gmail.com>:> The frontend would generate the load in the IR. I am using IRBuilder to > generate gather. I know it is mainly for discontinuous memory locations. > It's a long story why I want to use this. I want to gather some memory > locations. Suppose there are an array A, I manually duplicated it somewhere > with an offset x. Now, we have two arrays A and A', where A'[i] - A[i] > offset. I want to gather the two values at A+i and A+i whenever there was a > load instruction to get a value from A+i. > > It is easy to do this if the code was not vectorized, but it become tricky > when they are vectorized. If there is a load %1 = load <2 x i64>* %Ai, > align 8, which loads two consecutive values at Ai, I need to gather the > values from A'i as well. So I think I need to use gather to get values from > A+i, A+i+1, A'+i, A'+i+1. > I think you can use `getelementptr` to calculate the address needed by the gather intrinsic, though I don't know if there is better way to achieve your goal. -- Wei-Ren Chen (陳韋任) Homepage: https://people.cs.nctu.edu.tw/~chenwj -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170506/5a729d0d/attachment.html>
zhi chen via llvm-dev
2017-May-06 00:42 UTC
[llvm-dev] load instruction to gather intrinsics
But I think I still need to get A+i and A+i+1 from %1 = load <2 x i64>* %Ai, align 8 even if I want to use getelementptr, is that correct? On Fri, May 5, 2017 at 4:56 PM, 陳韋任 <chenwj.cs97g at g2.nctu.edu.tw> wrote:> > > 2017-05-06 7:41 GMT+08:00 zhi chen <zchenhn at gmail.com>: > >> The frontend would generate the load in the IR. I am using IRBuilder to >> generate gather. I know it is mainly for discontinuous memory locations. >> It's a long story why I want to use this. I want to gather some memory >> locations. Suppose there are an array A, I manually duplicated it somewhere >> with an offset x. Now, we have two arrays A and A', where A'[i] - A[i] >> offset. I want to gather the two values at A+i and A+i whenever there was a >> load instruction to get a value from A+i. >> >> It is easy to do this if the code was not vectorized, but it become >> tricky when they are vectorized. If there is a load %1 = load <2 x i64>* >> %Ai, align 8, which loads two consecutive values at Ai, I need to gather >> the values from A'i as well. So I think I need to use gather to get values >> from A+i, A+i+1, A'+i, A'+i+1. >> > > I think you can use `getelementptr` to calculate the address needed by > the gather intrinsic, though I don't know > if there is better way to achieve your goal. > > -- > Wei-Ren Chen (陳韋任) > Homepage: https://people.cs.nctu.edu.tw/~chenwj >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170505/bea42d3c/attachment.html>