Issue 142836
Summary [DirectX] GEPs to multi-dimensional TGSM arrays are incorrectly flattened
Labels new issue
Assignees
Reporter Icohedron
    The DXIL Flatten Arrays pass is incorrectly transforming `getelementptr` instructions operating on mutli-dimensional global groupshared memory arrays.

https://godbolt.org/z/evPPPWEfT

IR dump before flatten arrays (`-mllvm -stop-before=dxil-flatten-arrays`):
```llvm
@g = local_unnamed_addr addrspace(3) global [2 x [2 x float]] zeroinitializer, align 4, !dbg !0
...
  %2 = tail call i32 @llvm.dx.thread.id(i32 0)
  %3 = getelementptr inbounds nuw [2 x [2 x float]], ptr addrspace(3) @g, i32 0, i32 %2, i32 1, !dbg !91
  %4 = load float, ptr addrspace(3) %3, align 4, !dbg !91, !tbaa !92
```

IR dump after flatten arrays:
```llvm
@g.1dim = local_unnamed_addr addrspace(3) global [4 x float] zeroinitializer, align 4
...
  %2 = tail call i32 @llvm.dx.thread.id(i32 0)
  %3 = getelementptr inbounds [4 x float], ptr addrspace(3) @g.1dim, i32 1
  %4 = load float, ptr addrspace(3) %3, align 4, !dbg !91
```

As can be seen, the GEP after flatten arrays is incorrect and out-of-bounds.
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to