[LLVMdev] Load value and broadcast in LLVM

Shahid, Asghar-ahmad Asghar-ahmad.Shahid at amd.com
Mon May 4 02:12:31 PDT 2015


Hi Zhi,

If I get your question correctly, Yes, you can do it by using the IRBuilder’s CreateVectorSplat() API.

  /// \brief Return a vector value that contains \arg V broadcasted to \p
  /// NumElts elements.
  Value *CreateVectorSplat(unsigned NumElts, Value *V, const Twine &Name = "")

For your case, here the Value V will be your loaded value %0 and NumElts will be 2.

So after %0 = load double* %x, align 4, !tbaa !0
you will get a sequence of LLVM-IR

%1= insertelement <2 x double > %0, …
%2= shufflevector <2 x double > %1, …

%2 will be your desired  value.

Regards,
Shahid

From: llvmdev-bounces at cs.uiuc.edu [mailto:llvmdev-bounces at cs.uiuc.edu] On Behalf Of zhi chen
Sent: Monday, May 04, 2015 1:29 PM
To: LLVM Dev
Subject: [LLVMdev] Load value and broadcast in LLVM

Is it possible to load a value into a vector register and broadcast it in LLVM?

For example, for the following address %x

 %x = getelementptr inbounds %struct._Ray* %ray, i32 0, i32 0, i32 0

instead of loading the value at %x into a scalar register %0:
%0 = load double* %x, align 4, !tbaa !0

I want to load it into a <2 x double> vector register %1 and make both of the two elements in %1 be the value at %x.

I guess one way to do this is to make getelementptr return a <2 x i32>* address, where the two addresses in <2 X 32> are the same. But I don't know if it is possible to do this in LLVM.

Any help would be appreciated.

Best,
Zhi

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150504/d337a813/attachment.html>


More information about the llvm-dev mailing list