xref: /llvm-project/llvm/test/CodeGen/SPIRV/logical-struct-access.ll (revision 59e5cb7b83fbbce2423e0c024861f83c0390670f)
1c01b5bbbSNathan Gauër; RUN: llc -O0 -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s
2c01b5bbbSNathan Gauër
3*59e5cb7bSMichal Paszkowski; CHECK-DAG: [[uint:%[0-9]+]] = OpTypeInt 32 0
4c01b5bbbSNathan Gauër
5c01b5bbbSNathan Gauër%A = type {
6c01b5bbbSNathan Gauër  i32,
7c01b5bbbSNathan Gauër  i32
8c01b5bbbSNathan Gauër}
9*59e5cb7bSMichal Paszkowski; CHECK-DAG:    [[A:%[0-9]+]] = OpTypeStruct [[uint]] [[uint]]
10c01b5bbbSNathan Gauër
11c01b5bbbSNathan Gauër%B = type {
12c01b5bbbSNathan Gauër  %A,
13c01b5bbbSNathan Gauër  i32,
14c01b5bbbSNathan Gauër  %A
15c01b5bbbSNathan Gauër}
16*59e5cb7bSMichal Paszkowski; CHECK-DAG:    [[B:%[0-9]+]] = OpTypeStruct [[A]] [[uint]] [[A]]
17c01b5bbbSNathan Gauër
18*59e5cb7bSMichal Paszkowski; CHECK-DAG: [[uint_0:%[0-9]+]] = OpConstant [[uint]] 0
19*59e5cb7bSMichal Paszkowski; CHECK-DAG: [[uint_1:%[0-9]+]] = OpConstant [[uint]] 1
20*59e5cb7bSMichal Paszkowski; CHECK-DAG: [[uint_2:%[0-9]+]] = OpConstant [[uint]] 2
21c01b5bbbSNathan Gauër
22*59e5cb7bSMichal Paszkowski; CHECK-DAG: [[ptr_uint:%[0-9]+]] = OpTypePointer Function [[uint]]
23*59e5cb7bSMichal Paszkowski; CHECK-DAG:    [[ptr_A:%[0-9]+]] = OpTypePointer Function [[A]]
24*59e5cb7bSMichal Paszkowski; CHECK-DAG:    [[ptr_B:%[0-9]+]] = OpTypePointer Function [[B]]
25c01b5bbbSNathan Gauër
26c01b5bbbSNathan Gauërdefine void @main() #1 {
27c01b5bbbSNathan Gauërentry:
28c01b5bbbSNathan Gauër  %0 = alloca %B, align 4
29c01b5bbbSNathan Gauër; CHECK: [[tmp:%[0-9]+]] = OpVariable [[ptr_B]] Function
30c01b5bbbSNathan Gauër
31c01b5bbbSNathan Gauër  %1 = getelementptr %B, ptr %0, i32 0, i32 0
32c01b5bbbSNathan Gauër; CHECK: {{%[0-9]+}} = OpAccessChain [[ptr_A]] [[tmp]] [[uint_0]]
33c01b5bbbSNathan Gauër  %2 = getelementptr inbounds %B, ptr %0, i32 0, i32 0
34c01b5bbbSNathan Gauër; CHECK: {{%[0-9]+}} = OpInBoundsAccessChain [[ptr_A]] [[tmp]] [[uint_0]]
35c01b5bbbSNathan Gauër
36c01b5bbbSNathan Gauër  %3 = getelementptr %B, ptr %0, i32 0, i32 1
37c01b5bbbSNathan Gauër; CHECK: {{%[0-9]+}} = OpAccessChain [[ptr_uint]] [[tmp]] [[uint_1]]
38c01b5bbbSNathan Gauër  %4 = getelementptr inbounds %B, ptr %0, i32 0, i32 1
39c01b5bbbSNathan Gauër; CHECK: {{%[0-9]+}} = OpInBoundsAccessChain [[ptr_uint]] [[tmp]] [[uint_1]]
40c01b5bbbSNathan Gauër
41c01b5bbbSNathan Gauër  %5 = getelementptr %B, ptr %0, i32 0, i32 2
42c01b5bbbSNathan Gauër; CHECK: {{%[0-9]+}} = OpAccessChain [[ptr_A]] [[tmp]] [[uint_2]]
43c01b5bbbSNathan Gauër  %6 = getelementptr inbounds %B, ptr %0, i32 0, i32 2
44c01b5bbbSNathan Gauër; CHECK: {{%[0-9]+}} = OpInBoundsAccessChain [[ptr_A]] [[tmp]] [[uint_2]]
45c01b5bbbSNathan Gauër
46c01b5bbbSNathan Gauër  %7 = getelementptr %B, ptr %0, i32 0, i32 2, i32 1
47c01b5bbbSNathan Gauër; CHECK: {{%[0-9]+}} = OpAccessChain [[ptr_uint]] [[tmp]] [[uint_2]] [[uint_1]]
48c01b5bbbSNathan Gauër  %8 = getelementptr inbounds %B, ptr %0, i32 0, i32 2, i32 1
49c01b5bbbSNathan Gauër; CHECK: {{%[0-9]+}} = OpInBoundsAccessChain [[ptr_uint]] [[tmp]] [[uint_2]] [[uint_1]]
50c01b5bbbSNathan Gauër
51c01b5bbbSNathan Gauër  %9 = getelementptr %B, ptr %0, i32 0, i32 2
52c01b5bbbSNathan Gauër  %10 = getelementptr %A, ptr %9, i32 0, i32 1
53c01b5bbbSNathan Gauër; CHECK: [[x:%[0-9]+]] = OpAccessChain [[ptr_A]] [[tmp]] [[uint_2]]
54c01b5bbbSNathan Gauër; CHECK:   {{%[0-9]+}} = OpAccessChain [[ptr_uint]] [[x]] [[uint_1]]
55c01b5bbbSNathan Gauër
56c01b5bbbSNathan Gauër  ret void
57c01b5bbbSNathan Gauër}
58c01b5bbbSNathan Gauër
59c01b5bbbSNathan Gauërattributes #1 = { "hlsl.numthreads"="4,8,16" "hlsl.shader"="compute" }
60