AMDGPU: Fix converting unanalyzable global loads to SMRD

Not all memory dependence queries succeed, so this needs to
be conservative if it fails.

llvm-svn: 307861
This commit is contained in:
Matt Arsenault 2017-07-12 23:06:18 +00:00
parent 3f164318e7
commit ce34ac588e
2 changed files with 25 additions and 4 deletions

View File

@ -108,10 +108,11 @@ bool AMDGPUAnnotateUniformValues::isClobberedInFunction(LoadInst * Load) {
DFS(Start, Checklist);
for (auto &BB : Checklist) {
BasicBlock::iterator StartIt = (!L && (BB == Load->getParent())) ?
BasicBlock::iterator(Load) : BB->end();
if (MDR->getPointerDependencyFrom(MemoryLocation(Ptr),
true, StartIt, BB, Load).isClobber())
return true;
BasicBlock::iterator(Load) : BB->end();
auto Q = MDR->getPointerDependencyFrom(MemoryLocation(Ptr), true,
StartIt, BB, Load);
if (Q.isClobber() || Q.isUnknown())
return true;
}
return false;
}

View File

@ -0,0 +1,20 @@
; RUN: llc -mtriple=amdgcn--amdhsa -mcpu=fiji -memdep-block-scan-limit=1 -amdgpu-scalarize-global-loads -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefix=GCN %s
; GCN-LABEL: {{^}}unknown_memdep_analysis:
; GCN: flat_load_dword
; GCN: flat_load_dword
; GCN: flat_store_dword
define amdgpu_kernel void @unknown_memdep_analysis(float addrspace(1)* nocapture readonly %arg) #0 {
bb:
%tmp53 = load float, float addrspace(1)* undef, align 4
%tmp54 = getelementptr inbounds float, float addrspace(1)* %arg, i32 31
%tmp55 = load float, float addrspace(1)* %tmp54, align 4
%tmp56 = tail call float @llvm.fmuladd.f32(float undef, float %tmp53, float %tmp55)
store float %tmp56, float addrspace(1)* undef, align 4
ret void
}
declare float @llvm.fmuladd.f32(float, float, float) #1
attributes #0 = { nounwind }
attributes #1 = { nounwind readnone speculatable }