[OpenACC] Enable 'attach' clause for combined constructs
[llvm-project.git] / llvm / test / CodeGen / NVPTX / packed-aggr.ll
blob6fefefd3a7206d196422051b8e575686b5708be5
1 ; RUN: not --crash llc < %s -march=nvptx -mcpu=sm_20 -mattr=+ptx70 2>&1 | \
2 ; RUN:   FileCheck %s --check-prefix=ERROR
4 ; RUN: llc < %s -march=nvptx -mcpu=sm_20 -mattr=+ptx71 | \
5 ; RUN:   FileCheck %s --check-prefixes=CHECK,CHECK32
6 ; RUN: llc < %s -march=nvptx64 -mcpu=sm_20 -mattr=+ptx71 | \
7 ; RUN:   FileCheck %s --check-prefixes=CHECK,CHECK64
8 ; RUN: %if ptxas-11.1 && !ptxas-12.0%{ llc < %s -march=nvptx -mcpu=sm_20 -mattr=+ptx71 | %ptxas-verify %}
9 ; RUN: %if ptxas-11.1 %{ llc < %s -march=nvptx64 -mcpu=sm_20 -mattr=+ptx71 | %ptxas-verify %}
11 ;; Test that packed structs with symbol references are represented using the
12 ;; mask() operator.
14 declare void @func()
15 @p = addrspace(1) global i8 0
16 ; CHECK: .extern .func func
17 ; CHECK: .u8 p;
19 %t1 = type <{ i16, ptr, i8, ptr, ptr, i32 }>
20 @s1 = addrspace(1) global %t1 <{
21 ; ERROR: initialized packed aggregate with pointers 's1' requires at least PTX ISA version 7.1
22 ; CHECK32: .global .align 1 .u8 s1[19] = {
23 ; CHECK64: .global .align 1 .u8 s1[31] = {
24     i16 12,
25 ; CHECK-SAME:   12, 0,
26     ptr addrspacecast (ptr addrspace(1) @p to ptr),
27 ; CHECK-SAME:   0xFF(generic(p)), 0xFF00(generic(p)), 0xFF0000(generic(p)), 0xFF000000(generic(p)),
28 ; CHECK64-SAME: 0xFF00000000(generic(p)), 0xFF0000000000(generic(p)), 0xFF000000000000(generic(p)), 0xFF00000000000000(generic(p)),
29     i8 34,
30 ; CHECK-SAME:   34
31     ptr @func,
32 ; CHECK-SAME:   0xFF(func), 0xFF00(func), 0xFF0000(func), 0xFF000000(func),
33 ; CHECK64-SAME: 0xFF00000000(func), 0xFF0000000000(func), 0xFF000000000000(func), 0xFF00000000000000(func),
34     ptr addrspacecast (ptr addrspace(1) getelementptr (i8, ptr addrspace(1) @p, i32 3) to ptr),
35 ; CHECK-SAME:   0xFF(generic(p)+3), 0xFF00(generic(p)+3), 0xFF0000(generic(p)+3), 0xFF000000(generic(p)+3),
36 ; CHECK64-SAME: 0xFF00000000(generic(p)+3), 0xFF0000000000(generic(p)+3), 0xFF000000000000(generic(p)+3), 0xFF00000000000000(generic(p)+3),
37     i32 56 }>, align 1
38 ; CHECK-SAME:   56, 0, 0, 0};
40 ;; Test a case than an unaligned pointer is in a nested struct.
42 %t2i = type <{ ptr }>
43 %t2o = type { i8, %t2i, i32 }
44 @s2 = addrspace(1) global %t2o {
45 ; CHECK32: .global .align 8 .u8 s2[12] = {
46 ; CHECK64: .global .align 8 .u8 s2[16] = {
47     i8 12,
48 ; CHECK-SAME:   12,
49     %t2i <{ ptr @func }>,
50 ; CHECK-SAME:   0xFF(func), 0xFF00(func), 0xFF0000(func), 0xFF000000(func),
51 ; CHECK64-SAME: 0xFF00000000(func), 0xFF0000000000(func), 0xFF000000000000(func), 0xFF00000000000000(func),
52     i32 34}
53 ; CHECK-SAME:   0, 0, 0,
54 ; CHECK-SAME:   34, 0, 0, 0};
56 ;; Test that a packed struct which size is not multiple of the pointer size
57 ;; is printed in bytes and uses the mask() operator for pointers even though
58 ;; the pointers are aligned.
60 %t3 = type <{ ptr, i8 }>
61 @s3 = addrspace(1) global %t3 <{
62 ; CHECK32: .global .align 1 .u8 s3[5] = {
63 ; CHECK64: .global .align 1 .u8 s3[9] = {
64     ptr @func,
65 ; CHECK-SAME:   0xFF(func), 0xFF00(func), 0xFF0000(func), 0xFF000000(func),
66 ; CHECK64-SAME: 0xFF00000000(func), 0xFF0000000000(func), 0xFF000000000000(func), 0xFF00000000000000(func),
67     i8 56 }>, align 1
68 ; CHECK-SAME:   56};
70 ;; Test that a packed struct with aligned pointers is printed in words.
72 %t4 = type <{ ptr, i64 }>
73 @s4 = addrspace(1) global %t4 <{
74 ; CHECK32: .global .align 1 .u32 s4[3] = {
75 ; CHECK64: .global .align 1 .u64 s4[2] = {
76     ptr @func,
77 ; CHECK-SAME:   func,
78     i64 15}>, align 1
79 ; CHECK32-SAME: 15, 0};
80 ; CHECK64-SAME: 15};
82 ;; Test that a packed struct with unaligned pointers inside an array is handled.
84 %t5 = type <{ ptr, i16 }>
85 @a5 = addrspace(1) global [2 x %t5] [%t5 <{ ptr @func, i16 5 }>, %t5 <{ ptr @func, i16 9 }> ]
86 ; CHECK32: .global .align 8 .u8 a5[12] = {
87 ; CHECK32-SAME: 0xFF(func), 0xFF00(func), 0xFF0000(func), 0xFF000000(func), 5, 0,
88 ; CHECK32-SAME: 0xFF(func), 0xFF00(func), 0xFF0000(func), 0xFF000000(func), 9, 0};
89 ; CHECK64: .global .align 8 .u8 a5[20] = {
90 ; CHECK64-SAME: 0xFF(func), 0xFF00(func), 0xFF0000(func), 0xFF000000(func),
91 ; CHECK64-SAME: 0xFF00000000(func), 0xFF0000000000(func), 0xFF000000000000(func), 0xFF00000000000000(func),
92 ; CHECK64-SAME: 5, 0,
93 ; CHECK64-SAME: 0xFF(func), 0xFF00(func), 0xFF0000(func), 0xFF000000(func),
94 ; CHECK64-SAME: 0xFF00000000(func), 0xFF0000000000(func), 0xFF000000000000(func), 0xFF00000000000000(func),
95 ; CHECK64-SAME: 9, 0};