1 // RUN
: %clang_cc1 -triple spir-unknown-unknown -cl-std
=CL2.0 -emit-llvm %s -O0 -o - | FileCheck %s
3 typedef __attribute__
(( ext_vector_type
(2) )) int int2
;
4 typedef __attribute__
(( ext_vector_type
(4) )) int int4
;
6 // CHECK
: %struct.StrucTy
= type
{ i32
, i32
, i32
}
8 // CHECK
: @GA
={{.
*}} addrspace
(1) global
[6 x
[6 x float
]] {{[[][[]}}6 x float
] [float
1.000000e+00, float
2.000000e+00, float
0.000000e+00, float
0.000000e+00, float
0.000000e+00, float
0.000000e+00],
9 // CHECK
: [6 x float
] zeroinitializer
, [6 x float
] zeroinitializer
, [6 x float
] zeroinitializer
, [6 x float
] zeroinitializer
, [6 x float
] zeroinitializer
], align
4
10 float GA
[6][6] = {1.0f
, 2.0f
};
18 // CHECK
: @GS
={{.
*}} addrspace
(1) global %struct.StrucTy
{ i32
1, i32
2, i32
0 }, align
4
21 // CHECK
: @GV1
={{.
*}} addrspace
(1) global
<4 x i32
> <i32
1, i32
2, i32
3, i32
4>, align
16
22 int4 GV1
= (int4)((int2)(1,2),3,4);
24 // CHECK
: @GV2
={{.
*}} addrspace
(1) global
<4 x i32
> <i32
1, i32
1, i32
1, i32
1>, align
16
27 // CHECK
: @__const.f.S
= private unnamed_addr addrspace
(2) constant %struct.StrucTy
{ i32
1, i32
2, i32
0 }, align
4
29 // CHECK-LABEL
: define
{{.
*}} spir_func void
@f
()
31 // CHECK
: %
[[A
:.
*]] = alloca
[6 x
[6 x float
]], align
4
32 // CHECK
: %
[[S
:.
*]] = alloca %struct.StrucTy
, align
4
33 // CHECK
: %
[[V1
:.
*]] = alloca
<4 x i32
>, align
16
34 // CHECK
: %
[[compoundliteral
:.
*]] = alloca
<4 x i32
>, align
16
35 // CHECK
: %
[[compoundliteral1
:.
*]] = alloca
<2 x i32
>, align
8
36 // CHECK
: %
[[V2
:.
*]] = alloca
<4 x i32
>, align
16
38 // CHECK
: call void
@llvm.memset.p0.i32
(ptr align
4 %A
, i8
0, i32
144, i1 false
)
39 // CHECK
: %
[[v2
:.
*]] = getelementptr inbounds
[6 x
[6 x float
]], ptr %A
, i32
0, i32
0
40 // CHECK
: %
[[v3
:.
*]] = getelementptr inbounds
[6 x float
], ptr %
[[v2]], i32 0, i32 0
41 // CHECK: store float 1.000000e+00, ptr %[[v3]], align 4
42 // CHECK: %[[v4:.*]] = getelementptr inbounds [6 x float], ptr %[[v2]], i32
0, i32
1
43 // CHECK
: store float
2.000000e+00, ptr %
[[v4]], align 4
44 float A[6][6] = {1.0f, 2.0f};
46 // CHECK: call void @llvm.memcpy.p0.p2.i32(ptr align 4 %S, ptr addrspace(2) align 4 @__const.f.S, i32 12, i1 false)
49 // CHECK: store <2 x i32> <i32 1, i32 2>, ptr %[[compoundliteral1]], align 8
50 // CHECK: %[[v6:.*]] = load <2 x i32>, ptr %[[compoundliteral1]], align 8
51 // CHECK: %[[vext:.*]] = shufflevector <2 x i32> %[[v6]], <2 x i32> poison, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
52 // CHECK: %[[vecinit:.*]] = shufflevector <4 x i32> %[[vext]], <4 x i32> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
53 // CHECK: %[[vecinit2:.*]] = insertelement <4 x i32> %[[vecinit]], i32 3, i32 2
54 // CHECK: %[[vecinit3:.*]] = insertelement <4 x i32> %[[vecinit2]], i32 4, i32 3
55 // CHECK: store <4 x i32> %[[vecinit3]], ptr %[[compoundliteral]], align 16
56 // CHECK: %[[v7:.*]] = load <4 x i32>, ptr %[[compoundliteral]], align 16
57 // CHECK: store <4 x i32> %[[v7]], ptr %[[V1]], align 16
58 int4 V1 = (int4)((int2)(1,2),3,4);
60 // CHECK: store <4 x i32> <i32 1, i32 1, i32 1, i32 1>, ptr %[[V2]], align 16