mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-30 15:10:33 +00:00
AMDGPU: mark atomic instructions as sources of divergence
Summary: As explained by the comment, threads will typically see different values returned by atomic instructions even if the arguments are equal. Reviewers: arsenm, tstellarAMD Subscribers: arsenm, llvm-commits Differential Revision: http://reviews.llvm.org/D18156 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@263719 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
96ac27b20b
commit
d3939c80f8
@ -186,6 +186,13 @@ bool AMDGPUTTIImpl::isSourceOfDivergence(const Value *V) const {
|
||||
if (const LoadInst *Load = dyn_cast<LoadInst>(V))
|
||||
return Load->getPointerAddressSpace() == AMDGPUAS::PRIVATE_ADDRESS;
|
||||
|
||||
// Atomics are divergent because they are executed sequentially: when an
|
||||
// atomic operation refers to the same address in each thread, then each
|
||||
// thread after the first sees the value written by the previous thread as
|
||||
// original value.
|
||||
if (isa<AtomicRMWInst>(V) || isa<AtomicCmpXchgInst>(V))
|
||||
return true;
|
||||
|
||||
if (const IntrinsicInst *Intrinsic = dyn_cast<IntrinsicInst>(V)) {
|
||||
const TargetMachine &TM = getTLI()->getTargetMachine();
|
||||
return isIntrinsicSourceOfDivergence(TM.getIntrinsicInfo(), Intrinsic);
|
||||
|
15
test/Analysis/DivergenceAnalysis/AMDGPU/atomics.ll
Normal file
15
test/Analysis/DivergenceAnalysis/AMDGPU/atomics.ll
Normal file
@ -0,0 +1,15 @@
|
||||
; RUN: opt -mtriple=amdgcn-- -analyze -divergence %s | FileCheck %s
|
||||
|
||||
; CHECK: DIVERGENT: %orig = atomicrmw xchg i32* %ptr, i32 %val seq_cst
|
||||
define i32 @test1(i32* %ptr, i32 %val) #0 {
|
||||
%orig = atomicrmw xchg i32* %ptr, i32 %val seq_cst
|
||||
ret i32 %orig
|
||||
}
|
||||
|
||||
; CHECK: DIVERGENT: %orig = cmpxchg i32* %ptr, i32 %cmp, i32 %new seq_cst seq_cst
|
||||
define {i32, i1} @test2(i32* %ptr, i32 %cmp, i32 %new) {
|
||||
%orig = cmpxchg i32* %ptr, i32 %cmp, i32 %new seq_cst seq_cst
|
||||
ret {i32, i1} %orig
|
||||
}
|
||||
|
||||
attributes #0 = { "ShaderType"="0" }
|
Loading…
Reference in New Issue
Block a user