Commit 596e61c3 authored by hsmahesha's avatar hsmahesha
Browse files

[AMDGPU] Ignore call graph node which does not have function info.

While collecting reachable callees (from kernels), ignore call graph node which
does not have associated function or associated function is not a definition.

Reviewed By: rampitec

Differential Revision: https://reviews.llvm.org/D107329
parent df4e0bea
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -68,6 +68,11 @@ class CollectReachableCallees {
      if (!VisitedCGNodes.insert(CGN).second)
        continue;

      // Ignore call graph node which does not have associated function or
      // associated function is not a definition.
      if (!CGN->getFunction() || CGN->getFunction()->isDeclaration())
        continue;

      for (auto GI = CGN->begin(), GE = CGN->end(); GI != GE; ++GI) {
        auto *RCB = cast<CallBase>(GI->first.getValue());
        auto *RCGN = GI->second;
+38 −0
Original line number Diff line number Diff line
; RUN: opt -S -mtriple=amdgcn--  -amdgpu-replace-lds-use-with-pointer -amdgpu-enable-lds-replace-with-pointer=true < %s | FileCheck %s

; DESCRIPTION:
;
; The kernel 'kern' makes a call to declared only function `foo`, hence `foo`
; is not considered as reachable callee, and is ignored. The function `goo`
; which uses LDS is not called from kernel 'kern', hence it is also ignored.
;

; Original LDS should exist.
; CHECK: @lds = internal local_unnamed_addr addrspace(3) global i32 undef, align 4
@lds = internal local_unnamed_addr addrspace(3) global i32 undef, align 4

; Pointer should not be created.
; CHECK-NOT: @lds.ptr = internal unnamed_addr addrspace(3) global i16 undef, align 2

; CHECK: declare i32 @foo()
declare i32 @foo()

; No change
define internal void @goo() {
; CHECK-LABEL: entry:
; CHECK:   store i32 undef, i32 addrspace(3)* @lds, align 4
; CHECK:   ret void
entry:
  store i32 undef, i32 addrspace(3)* @lds, align 4
  ret void
}

; No change
define weak amdgpu_kernel void @kern() {
; CHECK-LABEL: entry:
; CHECK-LABEL:   %nt = call i32 @foo()
; CHECK-LABEL:   ret void
entry:
  %nt = call i32 @foo()
  ret void
}