Description
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