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