[llvm] r340343 - [AMDGPU] Consider loads from flat addrspace to be potentially divergent

Scott Linder via llvm-commits llvm-commits at lists.llvm.org
Tue Aug 21 14:24:31 PDT 2018


Author: scott.linder
Date: Tue Aug 21 14:24:31 2018
New Revision: 340343

URL: http://llvm.org/viewvc/llvm-project?rev=340343&view=rev
Log:
[AMDGPU] Consider loads from flat addrspace to be potentially divergent

In general we can't assume flat loads are uniform, and cases where we can prove
they are should be handled through infer-address-spaces.

Differential Revision: https://reviews.llvm.org/D50991


Added:
    llvm/trunk/test/Analysis/DivergenceAnalysis/AMDGPU/loads.ll
Modified:
    llvm/trunk/lib/Target/AMDGPU/AMDGPUTargetTransformInfo.cpp

Modified: llvm/trunk/lib/Target/AMDGPU/AMDGPUTargetTransformInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AMDGPU/AMDGPUTargetTransformInfo.cpp?rev=340343&r1=340342&r2=340343&view=diff
==============================================================================
--- llvm/trunk/lib/Target/AMDGPU/AMDGPUTargetTransformInfo.cpp (original)
+++ llvm/trunk/lib/Target/AMDGPU/AMDGPUTargetTransformInfo.cpp Tue Aug 21 14:24:31 2018
@@ -545,14 +545,16 @@ bool GCNTTIImpl::isSourceOfDivergence(co
   if (const Argument *A = dyn_cast<Argument>(V))
     return !isArgPassedInSGPR(A);
 
-  // Loads from the private address space are divergent, because threads
-  // can execute the load instruction with the same inputs and get different
-  // results.
+  // Loads from the private and flat address spaces are divergent, because
+  // threads can execute the load instruction with the same inputs and get
+  // different results.
   //
   // All other loads are not divergent, because if threads issue loads with the
   // same arguments, they will always get the same result.
   if (const LoadInst *Load = dyn_cast<LoadInst>(V))
-    return Load->getPointerAddressSpace() == ST->getAMDGPUAS().PRIVATE_ADDRESS;
+    return Load->getPointerAddressSpace() ==
+               ST->getAMDGPUAS().PRIVATE_ADDRESS ||
+           Load->getPointerAddressSpace() == ST->getAMDGPUAS().FLAT_ADDRESS;
 
   // Atomics are divergent because they are executed sequentially: when an
   // atomic operation refers to the same address in each thread, then each

Added: llvm/trunk/test/Analysis/DivergenceAnalysis/AMDGPU/loads.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/DivergenceAnalysis/AMDGPU/loads.ll?rev=340343&view=auto
==============================================================================
--- llvm/trunk/test/Analysis/DivergenceAnalysis/AMDGPU/loads.ll (added)
+++ llvm/trunk/test/Analysis/DivergenceAnalysis/AMDGPU/loads.ll Tue Aug 21 14:24:31 2018
@@ -0,0 +1,15 @@
+; RUN: opt -mtriple=amdgcn-- -analyze -divergence %s | FileCheck %s
+
+; Test that we consider loads from flat and private addrspaces to be divergent.
+
+; CHECK: DIVERGENT: %val = load i32, i32* %flat, align 4
+define amdgpu_kernel void @flat_load(i32* %flat) {
+  %val = load i32, i32* %flat, align 4
+  ret void
+}
+
+; CHECK: DIVERGENT: %val = load i32, i32 addrspace(5)* %priv, align 4
+define amdgpu_kernel void @private_load(i32 addrspace(5)* %priv) {
+  %val = load i32, i32 addrspace(5)* %priv, align 4
+  ret void
+}




More information about the llvm-commits mailing list