Skip to content

[DirectX] GEPs to multi-dimensional arrays are incorrectly flattened #142836

@Icohedron

Description

@Icohedron

The DXIL Flatten Arrays pass is incorrectly transforming getelementptr instructions operating on mutli-dimensional arrays.

The DXIL Flatten Arrays pass needs to be modified to maintain correctness when transforming GEPs on multi-dimensional arrays.

https://godbolt.org/z/evPPPWEfT

IR dump before flatten arrays (-mllvm -stop-before=dxil-flatten-arrays):

@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:

@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 (such as %2 becoming unused) and out-of-bounds (because g.1dim is only one array, so i32 1 is OOB).

A similar case can be seen for local arrays: https://godbolt.org/z/M7xaxGhMa

Metadata

Metadata

Assignees

Type

Projects

Status

Closed

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions