Skip to content

Commit

Permalink
[AMDGPU] Fix DynLDS causing crash when LowerLDS is run at fullLTO pip…
Browse files Browse the repository at this point in the history
…eline (#96038)

Direct mapped dynamic LDS is not lowered in the LowerLDSModule pass.
Hence it is not marked with an absolute symbol. When the LowerLDS pass is
rerun in LTO, compilation fails with an assert "cannot mix abs and non-abs LDVs".
This patch adds an additional check for direct mapped dynLDS to skip the assert.

Fixes SWDEV-454281
  • Loading branch information
VigneshwarJ committed Jun 29, 2024
1 parent bf52884 commit d2c817d
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 1 deletion.
7 changes: 6 additions & 1 deletion llvm/lib/Target/AMDGPU/Utils/AMDGPUMemoryUtils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -207,14 +207,19 @@ LDSUsesInfoTy getTransitiveUsesOfLDS(const CallGraph &CG, Module &M) {
}

// Verify that we fall into one of 2 cases:
// - All variables are absolute: this is a re-run of the pass
// - All variables are either absolute
// or direct mapped dynamic LDS that is not lowered.
// this is a re-run of the pass
// so we don't have anything to do.
// - No variables are absolute.
std::optional<bool> HasAbsoluteGVs;
for (auto &Map : {DirectMapKernel, IndirectMapKernel}) {
for (auto &[Fn, GVs] : Map) {
for (auto *GV : GVs) {
bool IsAbsolute = GV->isAbsoluteSymbolRef();
bool IsDirectMapDynLDSGV = AMDGPU::isDynamicLDS(*GV) && DirectMapKernel.contains(Fn);
if (IsDirectMapDynLDSGV)
continue;
if (HasAbsoluteGVs.has_value()) {
if (*HasAbsoluteGVs != IsAbsolute) {
report_fatal_error(
Expand Down
25 changes: 25 additions & 0 deletions llvm/test/CodeGen/AMDGPU/lds-mixed-absolute-dynlds.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
; RUN: opt -S -mtriple=amdgcn-- -amdgpu-lower-module-lds < %s 2>&1 | FileCheck %s
; RUN: opt -S -mtriple=amdgcn-- -passes=amdgpu-lower-module-lds < %s 2>&1 | FileCheck %s

; Dynamic LDS that are direct mapped are not lowered in LowerModuleLDS pass.
; In such cases, LowerModuleLDS is free to leave it in and ignore it, and we want to make sure
; LowerModuleLDS doesn't crash if it re-runs on such modules.

@loweredlds = addrspace(3) global i32 poison, !absolute_symbol !0
@dynlds = external addrspace(3) global [0 x i32]

define amdgpu_kernel void @kern(i32 %val0) {
; CHECK-LABEL: define amdgpu_kernel void @kern(
; CHECK-SAME: i32 [[VAL0:%.*]]) {
; CHECK-NEXT: store i32 0, ptr addrspace(3) @loweredlds, align 4
; CHECK-NEXT: store i32 1, ptr addrspace(3) @dynlds, align 4
; CHECK-NEXT: ret void
;
store i32 0, ptr addrspace(3) @loweredlds
store i32 1, ptr addrspace(3) @dynlds
ret void
}


!0 = !{i32 0, i32 1}
2 changes: 2 additions & 0 deletions llvm/test/CodeGen/AMDGPU/lds-run-twice.ll
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,12 @@
; Check AMDGPULowerModuleLDS can run more than once on the same module, and that
; the second run is a no-op.

@dynlds = external addrspace(3) global [0 x i32], align 4
@lds = internal unnamed_addr addrspace(3) global i32 undef, align 4

define amdgpu_kernel void @test() {
entry:
store i32 0, ptr addrspace(3) @dynlds
store i32 1, ptr addrspace(3) @lds
ret void
}

0 comments on commit d2c817d

Please sign in to comment.