[PATCH] D51306: [NVPTX] Implement isLegalToVectorizeLoadChain

Benjamin Kramer via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Aug 27 07:53:20 PDT 2018


bkramer created this revision.
bkramer added a reviewer: jlebar.
Herald added subscribers: dexonsmith, inglorion, jholewinski.

This lets LSV nicely split up underaligned chains.


Repository:
  rL LLVM

https://reviews.llvm.org/D51306

Files:
  lib/Target/NVPTX/NVPTXTargetTransformInfo.h
  test/CodeGen/NVPTX/vectorize-misaligned.ll


Index: test/CodeGen/NVPTX/vectorize-misaligned.ll
===================================================================
--- /dev/null
+++ test/CodeGen/NVPTX/vectorize-misaligned.ll
@@ -0,0 +1,29 @@
+; RUN: llc < %s | FileCheck %s
+target triple = "nvptx64-nvidia-cuda"
+
+; CHECK-LABEL: test1
+; CHECK: ld.global.v2.f32
+; CHECK: ld.global.v2.f32
+; CHECK: st.global.v2.f32
+; CHECK: st.global.v2.f32
+define void @test1(float addrspace(1)* noalias align 8 %in, float addrspace(1)* noalias align 8 %out) {
+  %in.1 = getelementptr float, float addrspace(1)* %in, i32 1
+  %in.2 = getelementptr float, float addrspace(1)* %in, i32 2
+  %in.3 = getelementptr float, float addrspace(1)* %in, i32 3
+  %v0 = load float, float addrspace(1)* %in, align 8
+  %v1 = load float, float addrspace(1)* %in.1, align 4
+  %v2 = load float, float addrspace(1)* %in.2, align 8
+  %v3 = load float, float addrspace(1)* %in.3, align 4
+  %sum0 = fadd float %v0, %v1
+  %sum1 = fadd float %v1, %v2
+  %sum2 = fadd float %v3, %v1
+  %sum3 = fadd float %v2, %v3
+  %out.1 = getelementptr float, float addrspace(1)* %out, i32 1
+  %out.2 = getelementptr float, float addrspace(1)* %out, i32 2
+  %out.3 = getelementptr float, float addrspace(1)* %out, i32 3
+  store float %sum0, float addrspace(1)* %out, align 8
+  store float %sum1, float addrspace(1)* %out.1, align 4
+  store float %sum2, float addrspace(1)* %out.2, align 8
+  store float %sum3, float addrspace(1)* %out.3, align 4
+  ret void
+}
Index: lib/Target/NVPTX/NVPTXTargetTransformInfo.h
===================================================================
--- lib/Target/NVPTX/NVPTXTargetTransformInfo.h
+++ lib/Target/NVPTX/NVPTXTargetTransformInfo.h
@@ -49,6 +49,19 @@
     return AddressSpace::ADDRESS_SPACE_GENERIC;
   }
 
+  // Loads and stores can be vectorized if the alignment is at least as big as
+  // the load/store we want to vectorize.
+  bool isLegalToVectorizeLoadChain(unsigned ChainSizeInBytes,
+                                   unsigned Alignment,
+                                   unsigned AddrSpace) const {
+    return Alignment >= ChainSizeInBytes;
+  }
+  bool isLegalToVectorizeStoreChain(unsigned ChainSizeInBytes,
+                                    unsigned Alignment,
+                                    unsigned AddrSpace) const {
+    return isLegalToVectorizeLoadChain(ChainSizeInBytes, Alignment, AddrSpace);
+  }
+
   // NVPTX has infinite registers of all kinds, but the actual machine doesn't.
   // We conservatively return 1 here which is just enough to enable the
   // vectorizers but disables heuristics based on the number of registers.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D51306.162678.patch
Type: text/x-patch
Size: 2627 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180827/2762db1e/attachment.bin>


More information about the llvm-commits mailing list