[llvm] [DirectX] Fix bug where Flatten arrays was only using last index (PR #144146)
Deric C. via llvm-commits
llvm-commits at lists.llvm.org
Fri Jun 13 13:58:02 PDT 2025
================
@@ -187,5 +187,75 @@ define void @global_gep_store() {
ret void
}
+ at g = local_unnamed_addr addrspace(3) global [2 x [2 x float]] zeroinitializer, align 4
+define void @two_index_gep() {
+ ; CHECK-LABEL: define void @two_index_gep(
+ ; CHECK: [[THREAD_ID:%.*]] = tail call i32 @llvm.dx.thread.id(i32 0)
+ ; CHECK-NEXT: [[MUL:%.*]] = mul i32 [[THREAD_ID]], 2
+ ; CHECK-NEXT: [[ADD:%.*]] = add i32 1, [[MUL]]
+ ; CHECK-NEXT: [[GEP_PTR:%.*]] = getelementptr inbounds nuw [4 x float], ptr addrspace(3) @g.1dim, i32 0, i32 [[ADD]]
+ ; CHECK-NEXT: load float, ptr addrspace(3) [[GEP_PTR]], align 4
+ ; CHECK-NEXT: ret void
+ %1 = tail call i32 @llvm.dx.thread.id(i32 0)
+ %2 = getelementptr inbounds nuw [2 x [2 x float]], ptr addrspace(3) @g, i32 0, i32 %1, i32 1
+ %3 = load float, ptr addrspace(3) %2, align 4
+ ret void
+}
+
+define void @two_index_gep_const() {
+ ; CHECK-LABEL: define void @two_index_gep_const(
+ ; CHECK-NEXT: [[GEP_PTR:%.*]] = getelementptr inbounds nuw [4 x float], ptr addrspace(3) @g.1dim, i32 0, i32 3
+ ; CHECK-NEXT: load float, ptr addrspace(3) [[GEP_PTR]], align 4
+ ; CHECK-NEXT: ret void
+ %1 = getelementptr inbounds nuw [2 x [2 x float]], ptr addrspace(3) @g, i32 0, i32 1, i32 1
+ %3 = load float, ptr addrspace(3) %1, align 4
+ ret void
+}
+
+define void @gep_4d_index_test() {
+ ; CHECK-LABEL: gep_4d_index_test
+ ; CHECK: [[a:%.*]] = alloca [16 x i32], align 4
+ ; CHECK-NEXT: getelementptr inbounds [16 x i32], ptr %.1dim, i32 0, i32 1
+ ; CHECK-NEXT: getelementptr inbounds [16 x i32], ptr %.1dim, i32 0, i32 3
+ ; CHECK-NEXT: getelementptr inbounds [16 x i32], ptr %.1dim, i32 0, i32 7
+ ; CHECK-NEXT: getelementptr inbounds [16 x i32], ptr %.1dim, i32 0, i32 15
+ ; CHECK-NEXT: ret void
+ %1 = alloca [2x[2 x[2 x [2 x i32]]]], align 4
+ %2 = getelementptr inbounds [2x[2 x[2 x [2 x i32]]]], [2x[2 x[2 x [2 x i32]]]]* %1, i32 0, i32 0, i32 0, i32 0, i32 1
+ %3 = getelementptr inbounds [2x[2 x[2 x [2 x i32]]]], [2x[2 x[2 x [2 x i32]]]]* %1, i32 0, i32 0, i32 0, i32 1, i32 1
+ %4 = getelementptr inbounds [2x[2 x[2 x [2 x i32]]]], [2x[2 x[2 x [2 x i32]]]]* %1, i32 0, i32 0, i32 1, i32 1, i32 1
+ %5 = getelementptr inbounds [2x[2 x[2 x [2 x i32]]]], [2x[2 x[2 x [2 x i32]]]]* %1, i32 0, i32 1, i32 1, i32 1, i32 1
----------------
Icohedron wrote:
nit: inconsistent spacing in the array type specifiers in this test and more below in the same file
```suggestion
%1 = alloca [2 x [2 x [2 x [2 x i32]]]], align 4
%2 = getelementptr inbounds [2 x [2 x [2 x [2 x i32]]]], [2 x [2 x [2 x [2 x i32]]]]* %1, i32 0, i32 0, i32 0, i32 0, i32 1
%3 = getelementptr inbounds [2 x [2 x [2 x [2 x i32]]]], [2 x [2 x [2 x [2 x i32]]]]* %1, i32 0, i32 0, i32 0, i32 1, i32 1
%4 = getelementptr inbounds [2 x [2 x [2 x [2 x i32]]]], [2 x [2 x[2 x [2 x i32]]]]* %1, i32 0, i32 0, i32 1, i32 1, i32 1
%5 = getelementptr inbounds [2 x [2 x [2 x [2 x i32]]]], [2 x [2 x [2 x [2 x i32]]]]* %1, i32 0, i32 1, i32 1, i32 1, i32 1
```
https://github.com/llvm/llvm-project/pull/144146
More information about the llvm-commits
mailing list