xref: /llvm-project/llvm/test/CodeGen/DirectX/any.ll (revision 81ee38551f2c9d1677471ab59bdc800e667b9616)
1; RUN: opt -S -passes=dxil-intrinsic-expansion,dxil-op-lower -mtriple=dxil-pc-shadermodel6.0-library < %s | FileCheck %s
2
3; Make sure dxil operation function calls for any are generated for float and half.
4
5; CHECK-LABEL: any_bool
6; CHECK: icmp ne i1 %{{.*}}, false
7define noundef i1 @any_bool(i1 noundef %p0) {
8entry:
9  %p0.addr = alloca i8, align 1
10  %frombool = zext i1 %p0 to i8
11  store i8 %frombool, ptr %p0.addr, align 1
12  %0 = load i8, ptr %p0.addr, align 1
13  %tobool = trunc i8 %0 to i1
14  %dx.any = call i1 @llvm.dx.any.i1(i1 %tobool)
15  ret i1 %dx.any
16}
17
18; CHECK-LABEL: any_int64_t
19; CHECK: icmp ne i64 %{{.*}}, 0
20define noundef i1 @any_int64_t(i64 noundef %p0) {
21entry:
22  %p0.addr = alloca i64, align 8
23  store i64 %p0, ptr %p0.addr, align 8
24  %0 = load i64, ptr %p0.addr, align 8
25  %dx.any = call i1 @llvm.dx.any.i64(i64 %0)
26  ret i1 %dx.any
27}
28
29; CHECK-LABEL: any_int
30; CHECK: icmp ne i32 %{{.*}}, 0
31define noundef i1 @any_int(i32 noundef %p0) {
32entry:
33  %p0.addr = alloca i32, align 4
34  store i32 %p0, ptr %p0.addr, align 4
35  %0 = load i32, ptr %p0.addr, align 4
36  %dx.any = call i1 @llvm.dx.any.i32(i32 %0)
37  ret i1 %dx.any
38}
39
40; CHECK-LABEL: any_int16_t
41; CHECK: icmp ne i16 %{{.*}}, 0
42define noundef i1 @any_int16_t(i16 noundef %p0) {
43entry:
44  %p0.addr = alloca i16, align 2
45  store i16 %p0, ptr %p0.addr, align 2
46  %0 = load i16, ptr %p0.addr, align 2
47  %dx.any = call i1 @llvm.dx.any.i16(i16 %0)
48  ret i1 %dx.any
49}
50
51; CHECK-LABEL: any_double
52; CHECK: fcmp une double %{{.*}}, 0.000000e+00
53define noundef i1 @any_double(double noundef %p0) {
54entry:
55  %p0.addr = alloca double, align 8
56  store double %p0, ptr %p0.addr, align 8
57  %0 = load double, ptr %p0.addr, align 8
58  %dx.any = call i1 @llvm.dx.any.f64(double %0)
59  ret i1 %dx.any
60}
61
62; CHECK-LABEL: any_float
63; CHECK: fcmp une float %{{.*}}, 0.000000e+00
64define noundef i1 @any_float(float noundef %p0) {
65entry:
66  %p0.addr = alloca float, align 4
67  store float %p0, ptr %p0.addr, align 4
68  %0 = load float, ptr %p0.addr, align 4
69  %dx.any = call i1 @llvm.dx.any.f32(float %0)
70  ret i1 %dx.any
71}
72
73; CHECK-LABEL: any_half
74; CHECK: fcmp une half %{{.*}}, 0xH0000
75define noundef i1 @any_half(half noundef %p0) {
76entry:
77  %p0.addr = alloca half, align 2
78  store half %p0, ptr %p0.addr, align 2
79  %0 = load half, ptr %p0.addr, align 2
80  %dx.any = call i1 @llvm.dx.any.f16(half %0)
81  ret i1 %dx.any
82}
83
84; CHECK-LABEL: any_bool4
85; CHECK: icmp ne <4 x i1> %extractvec, zeroinitialize
86; CHECK: extractelement <4 x i1> %{{.*}}, i64 0
87; CHECK: extractelement <4 x i1> %{{.*}}, i64 1
88; CHECK: or i1  %{{.*}}, %{{.*}}
89; CHECK: extractelement <4 x i1> %{{.*}}, i64 2
90; CHECK: or i1  %{{.*}}, %{{.*}}
91; CHECK: extractelement <4 x i1> %{{.*}}, i64 3
92; CHECK: or i1  %{{.*}}, %{{.*}}
93define noundef i1 @any_bool4(<4 x i1> noundef %p0) {
94entry:
95  %p0.addr = alloca i8, align 1
96  %insertvec = shufflevector <4 x i1> %p0, <4 x i1> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>
97  %0 = bitcast <8 x i1> %insertvec to i8
98  store i8 %0, ptr %p0.addr, align 1
99  %load_bits = load i8, ptr %p0.addr, align 1
100  %1 = bitcast i8 %load_bits to <8 x i1>
101  %extractvec = shufflevector <8 x i1> %1, <8 x i1> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
102  %dx.any = call i1 @llvm.dx.any.v4i1(<4 x i1> %extractvec)
103  ret i1 %dx.any
104}
105
106declare i1 @llvm.dx.any.v4i1(<4 x i1>)
107declare i1 @llvm.dx.any.i1(i1)
108declare i1 @llvm.dx.any.i16(i16)
109declare i1 @llvm.dx.any.i32(i32)
110declare i1 @llvm.dx.any.i64(i64)
111declare i1 @llvm.dx.any.f16(half)
112declare i1 @llvm.dx.any.f32(float)
113declare i1 @llvm.dx.any.f64(double)
114