Skip to content

Commit 3575617

Browse files
committed
codegen test
1 parent 24bea86 commit 3575617

File tree

1 file changed

+87
-0
lines changed

1 file changed

+87
-0
lines changed
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
// RUN: %clang_cc1 -finclude-default-header -triple dxil-pc-shadermodel6.3-library -x hlsl -emit-llvm -disable-llvm-passes -o - %s | FileCheck %s
2+
3+
// array splat
4+
// CHECK-LABEL: define void {{.*}}call4
5+
// CHECK: [[B:%.*]] = alloca [2 x i32], align 4
6+
// CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[B]], ptr align 4 {{.*}}, i32 8, i1 false)
7+
// CHECK-NEXT: [[G1:%.*]] = getelementptr inbounds [2 x i32], ptr [[B]], i32 0
8+
// CHECK-NEXT: [[G2:%.*]] = getelementptr inbounds [2 x i32], ptr [[B]], i32 1
9+
// CHECK-NEXT: store i32 3, ptr [[G1]], align 4
10+
// CHECK-NEXT: store i32 3, ptr [[G2]], align 4
11+
export void call4() {
12+
int B[2] = {1,2};
13+
B = (int[2])3;
14+
}
15+
16+
// splat from vector of length 1
17+
// CHECK-LABEL: define void {{.*}}call8
18+
// CHECK: [[A:%.*]] = alloca <1 x i32>, align 4
19+
// CHECK-NEXT: [[B:%.*]] = alloca [2 x i32], align 4
20+
// CHECK-NEXT: store <1 x i32> splat (i32 1), ptr [[A]], align 4
21+
// CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[B]], ptr align 4 {{.*}}, i32 8, i1 false)
22+
// CHECK-NEXT: [[L:%.*]] = load <1 x i32>, ptr [[A]], align 4
23+
// CHECK-NEXT: [[G1:%.*]] = getelementptr inbounds [2 x i32], ptr [[B]], i32 0
24+
// CHECK-NEXT: [[G2:%.*]] = getelementptr inbounds [2 x i32], ptr [[B]], i32 1
25+
// CHECK-NEXT: [[VL:%.*]] = extractelement <1 x i32> [[L]], i64 0
26+
// CHECK-NEXT: store i32 [[VL]], ptr [[G1]], align 4
27+
// CHECK-NEXT: store i32 [[VL]], ptr [[G2]], align 4
28+
export void call8() {
29+
int1 A = {1};
30+
int B[2] = {1,2};
31+
B = (int[2])A;
32+
}
33+
34+
// vector splat from vector of length 1
35+
// CHECK-LABEL: define void {{.*}}call1
36+
// CHECK: [[B:%.*]] = alloca <1 x float>, align 4
37+
// CHECK-NEXT: [[A:%.*]] = alloca <4 x i32>, align 16
38+
// CHECK-NEXT: store <1 x float> splat (float 1.000000e+00), ptr [[B]], align 4
39+
// CHECK-NEXT: [[L:%.*]] = load <1 x float>, ptr [[B]], align 4
40+
// CHECK-NEXT: [[VL:%.*]] = extractelement <1 x float> [[L]], i64 0
41+
// CHECK-NEXT: [[C:%.*]] = fptosi float [[VL]] to i32
42+
// CHECK-NEXT: [[SI:%.*]] = insertelement <4 x i32> poison, i32 [[C]], i64 0
43+
// CHECK-NEXT: [[S:%.*]] = shufflevector <4 x i32> [[SI]], <4 x i32> poison, <4 x i32> zeroinitializer
44+
// CHECK-NEXT: store <4 x i32> [[S]], ptr [[A]], align 16
45+
export void call1() {
46+
float1 B = {1.0};
47+
int4 A = (int4)B;
48+
}
49+
50+
struct S {
51+
int X;
52+
float Y;
53+
};
54+
55+
// struct splats?
56+
// CHECK-LABEL: define void {{.*}}call3
57+
// CHECK: [[A:%.*]] = alloca <1 x i32>, align 4
58+
// CHECK: [[s:%.*]] = alloca %struct.S, align 4
59+
// CHECK-NEXT: store <1 x i32> splat (i32 1), ptr [[A]], align 4
60+
// CHECK-NEXT: [[L:%.*]] = load <1 x i32>, ptr [[A]], align 4
61+
// CHECK-NEXT: [[G1:%.*]] = getelementptr inbounds %struct.S, ptr [[s]], i32 0
62+
// CHECK-NEXT: [[G2:%.*]] = getelementptr inbounds %struct.S, ptr [[s]], i32 1
63+
// CHECK-NEXT: [[VL:%.*]] = extractelement <1 x i32> [[L]], i64 0
64+
// CHECK-NEXT: store i32 [[VL]], ptr [[G1]], align 4
65+
// CHECK-NEXT: [[C:%.*]] = sitofp i32 [[VL]] to float
66+
// CHECK-NEXT: store float [[C]], ptr [[G2]], align 4
67+
export void call3() {
68+
int1 A = {1};
69+
S s = (S)A;
70+
}
71+
72+
// struct splat from vector of length 1
73+
// CHECK-LABEL: define void {{.*}}call5
74+
// CHECK: [[A:%.*]] = alloca <1 x i32>, align 4
75+
// CHECK-NEXT: [[s:%.*]] = alloca %struct.S, align 4
76+
// CHECK-NEXT: store <1 x i32> splat (i32 1), ptr [[A]], align 4
77+
// CHECK-NEXT: [[L:%.*]] = load <1 x i32>, ptr [[A]], align 4
78+
// CHECK-NEXT: [[G1:%.*]] = getelementptr inbounds %struct.S, ptr [[s]], i32 0
79+
// CHECK-NEXT: [[G2:%.*]] = getelementptr inbounds %struct.S, ptr [[s]], i32 1
80+
// CHECK-NEXT: [[VL:%.*]] = extractelement <1 x i32> [[L]], i64 0
81+
// CHECK-NEXT: store i32 [[VL]], ptr [[G1]], align 4
82+
// CHECK-NEXT: [[C:%.*]] = sitofp i32 [[VL]] to float
83+
// CHECK-NEXT: store float [[C]], ptr [[G2]], align 4
84+
export void call5() {
85+
int1 A = {1};
86+
S s = (S)A;
87+
}

0 commit comments

Comments
 (0)