; RUN: llc -O0 -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s --check-prefix=CHECK-SPIRV ; ModuleID = 'RelationalOperators.cl' source_filename = "RelationalOperators.cl" target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024" target triple = "spirv32-unknown-unknown" ; CHECK-SPIRV: %[[bool:[0-9]+]] = OpTypeBool ; CHECK-SPIRV: %[[bool2:[0-9]+]] = OpTypeVector %[[bool]] 2 ; CHECK-SPIRV: OpFunction ; CHECK-SPIRV-NEXT: %[[A:[0-9]+]] = OpFunctionParameter %{{[0-9]+}} ; CHECK-SPIRV-NEXT: %[[B:[0-9]+]] = OpFunctionParameter %{{[0-9]+}} ; CHECK-SPIRV: %{{[0-9]+}} = OpUGreaterThan %[[bool2]] %[[A]] %[[B]] ; CHECK-SPIRV: OpFunctionEnd ; kernel void testUGreaterThan(uint2 a, uint2 b, global int2 *res) { ; res[0] = a > b; ; } ; Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn writeonly define dso_local spir_kernel void @testUGreaterThan(<2 x i32> noundef %a, <2 x i32> noundef %b, <2 x i32> addrspace(1)* nocapture noundef writeonly %res) local_unnamed_addr #0 !kernel_arg_addr_space !3 !kernel_arg_access_qual !4 !kernel_arg_type !5 !kernel_arg_base_type !6 !kernel_arg_type_qual !7 { entry: %cmp = icmp ugt <2 x i32> %a, %b %sext = sext <2 x i1> %cmp to <2 x i32> store <2 x i32> %sext, <2 x i32> addrspace(1)* %res, align 8, !tbaa !8 ret void } ; CHECK-SPIRV: OpFunction ; CHECK-SPIRV-NEXT: %[[A:[0-9]+]] = OpFunctionParameter %{{[0-9]+}} ; CHECK-SPIRV-NEXT: %[[B:[0-9]+]] = OpFunctionParameter %{{[0-9]+}} ; CHECK-SPIRV: %{{[0-9]+}} = OpSGreaterThan %[[bool2]] %[[A]] %[[B]] ; CHECK-SPIRV: OpFunctionEnd ; kernel void testSGreaterThan(int2 a, int2 b, global int2 *res) { ; res[0] = a > b; ; } ; Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn writeonly define dso_local spir_kernel void @testSGreaterThan(<2 x i32> noundef %a, <2 x i32> noundef %b, <2 x i32> addrspace(1)* nocapture noundef writeonly %res) local_unnamed_addr #0 !kernel_arg_addr_space !3 !kernel_arg_access_qual !4 !kernel_arg_type !11 !kernel_arg_base_type !12 !kernel_arg_type_qual !7 { entry: %cmp = icmp sgt <2 x i32> %a, %b %sext = sext <2 x i1> %cmp to <2 x i32> store <2 x i32> %sext, <2 x i32> addrspace(1)* %res, align 8, !tbaa !8 ret void } ; CHECK-SPIRV: OpFunction ; CHECK-SPIRV-NEXT: %[[A:[0-9]+]] = OpFunctionParameter %{{[0-9]+}} ; CHECK-SPIRV-NEXT: %[[B:[0-9]+]] = OpFunctionParameter %{{[0-9]+}} ; CHECK-SPIRV: %{{[0-9]+}} = OpUGreaterThanEqual %[[bool2]] %[[A]] %[[B]] ; CHECK-SPIRV: OpFunctionEnd ; kernel void testUGreaterThanEqual(uint2 a, uint2 b, global int2 *res) { ; res[0] = a >= b; ; } ; Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn writeonly define dso_local spir_kernel void @testUGreaterThanEqual(<2 x i32> noundef %a, <2 x i32> noundef %b, <2 x i32> addrspace(1)* nocapture noundef writeonly %res) local_unnamed_addr #0 !kernel_arg_addr_space !3 !kernel_arg_access_qual !4 !kernel_arg_type !5 !kernel_arg_base_type !6 !kernel_arg_type_qual !7 { entry: %cmp = icmp uge <2 x i32> %a, %b %sext = sext <2 x i1> %cmp to <2 x i32> store <2 x i32> %sext, <2 x i32> addrspace(1)* %res, align 8, !tbaa !8 ret void } ; CHECK-SPIRV: OpFunction ; CHECK-SPIRV-NEXT: %[[A:[0-9]+]] = OpFunctionParameter %{{[0-9]+}} ; CHECK-SPIRV-NEXT: %[[B:[0-9]+]] = OpFunctionParameter %{{[0-9]+}} ; CHECK-SPIRV: %{{[0-9]+}} = OpSGreaterThanEqual %[[bool2]] %[[A]] %[[B]] ; CHECK-SPIRV: OpFunctionEnd ; kernel void testSGreaterThanEqual(int2 a, int2 b, global int2 *res) { ; res[0] = a >= b; ; } ; Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn writeonly define dso_local spir_kernel void @testSGreaterThanEqual(<2 x i32> noundef %a, <2 x i32> noundef %b, <2 x i32> addrspace(1)* nocapture noundef writeonly %res) local_unnamed_addr #0 !kernel_arg_addr_space !3 !kernel_arg_access_qual !4 !kernel_arg_type !11 !kernel_arg_base_type !12 !kernel_arg_type_qual !7 { entry: %cmp = icmp sge <2 x i32> %a, %b %sext = sext <2 x i1> %cmp to <2 x i32> store <2 x i32> %sext, <2 x i32> addrspace(1)* %res, align 8, !tbaa !8 ret void } ; CHECK-SPIRV: OpFunction ; CHECK-SPIRV-NEXT: %[[A:[0-9]+]] = OpFunctionParameter %{{[0-9]+}} ; CHECK-SPIRV-NEXT: %[[B:[0-9]+]] = OpFunctionParameter %{{[0-9]+}} ; CHECK-SPIRV: %{{[0-9]+}} = OpULessThan %[[bool2]] %[[A]] %[[B]] ; CHECK-SPIRV: OpFunctionEnd ; kernel void testULessThan(uint2 a, uint2 b, global int2 *res) { ; res[0] = a < b; ; } ; Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn writeonly define dso_local spir_kernel void @testULessThan(<2 x i32> noundef %a, <2 x i32> noundef %b, <2 x i32> addrspace(1)* nocapture noundef writeonly %res) local_unnamed_addr #0 !kernel_arg_addr_space !3 !kernel_arg_access_qual !4 !kernel_arg_type !5 !kernel_arg_base_type !6 !kernel_arg_type_qual !7 { entry: %cmp = icmp ult <2 x i32> %a, %b %sext = sext <2 x i1> %cmp to <2 x i32> store <2 x i32> %sext, <2 x i32> addrspace(1)* %res, align 8, !tbaa !8 ret void } ; CHECK-SPIRV: OpFunction ; CHECK-SPIRV-NEXT: %[[A:[0-9]+]] = OpFunctionParameter %{{[0-9]+}} ; CHECK-SPIRV-NEXT: %[[B:[0-9]+]] = OpFunctionParameter %{{[0-9]+}} ; CHECK-SPIRV: %{{[0-9]+}} = OpSLessThan %[[bool2]] %[[A]] %[[B]] ; CHECK-SPIRV: OpFunctionEnd ; kernel void testSLessThan(int2 a, int2 b, global int2 *res) { ; res[0] = a < b; ; } ; Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn writeonly define dso_local spir_kernel void @testSLessThan(<2 x i32> noundef %a, <2 x i32> noundef %b, <2 x i32> addrspace(1)* nocapture noundef writeonly %res) local_unnamed_addr #0 !kernel_arg_addr_space !3 !kernel_arg_access_qual !4 !kernel_arg_type !11 !kernel_arg_base_type !12 !kernel_arg_type_qual !7 { entry: %cmp = icmp slt <2 x i32> %a, %b %sext = sext <2 x i1> %cmp to <2 x i32> store <2 x i32> %sext, <2 x i32> addrspace(1)* %res, align 8, !tbaa !8 ret void } ; CHECK-SPIRV: OpFunction ; CHECK-SPIRV-NEXT: %[[A:[0-9]+]] = OpFunctionParameter %{{[0-9]+}} ; CHECK-SPIRV-NEXT: %[[B:[0-9]+]] = OpFunctionParameter %{{[0-9]+}} ; CHECK-SPIRV: %{{[0-9]+}} = OpULessThanEqual %[[bool2]] %[[A]] %[[B]] ; CHECK-SPIRV: OpFunctionEnd ; kernel void testULessThanEqual(uint2 a, uint2 b, global int2 *res) { ; res[0] = a <= b; ; } ; Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn writeonly define dso_local spir_kernel void @testULessThanEqual(<2 x i32> noundef %a, <2 x i32> noundef %b, <2 x i32> addrspace(1)* nocapture noundef writeonly %res) local_unnamed_addr #0 !kernel_arg_addr_space !3 !kernel_arg_access_qual !4 !kernel_arg_type !5 !kernel_arg_base_type !6 !kernel_arg_type_qual !7 { entry: %cmp = icmp ule <2 x i32> %a, %b %sext = sext <2 x i1> %cmp to <2 x i32> store <2 x i32> %sext, <2 x i32> addrspace(1)* %res, align 8, !tbaa !8 ret void } ; CHECK-SPIRV: OpFunction ; CHECK-SPIRV-NEXT: %[[A:[0-9]+]] = OpFunctionParameter %{{[0-9]+}} ; CHECK-SPIRV-NEXT: %[[B:[0-9]+]] = OpFunctionParameter %{{[0-9]+}} ; CHECK-SPIRV: %{{[0-9]+}} = OpSLessThanEqual %[[bool2]] %[[A]] %[[B]] ; CHECK-SPIRV: OpFunctionEnd ; kernel void testSLessThanEqual(int2 a, int2 b, global int2 *res) { ; res[0] = a <= b; ; } ; Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn writeonly define dso_local spir_kernel void @testSLessThanEqual(<2 x i32> noundef %a, <2 x i32> noundef %b, <2 x i32> addrspace(1)* nocapture noundef writeonly %res) local_unnamed_addr #0 !kernel_arg_addr_space !3 !kernel_arg_access_qual !4 !kernel_arg_type !11 !kernel_arg_base_type !12 !kernel_arg_type_qual !7 { entry: %cmp = icmp sle <2 x i32> %a, %b %sext = sext <2 x i1> %cmp to <2 x i32> store <2 x i32> %sext, <2 x i32> addrspace(1)* %res, align 8, !tbaa !8 ret void } ; CHECK-SPIRV: OpFunction ; CHECK-SPIRV-NEXT: %[[A:[0-9]+]] = OpFunctionParameter %{{[0-9]+}} ; CHECK-SPIRV-NEXT: %[[B:[0-9]+]] = OpFunctionParameter %{{[0-9]+}} ; CHECK-SPIRV: %{{[0-9]+}} = OpFOrdEqual %[[bool2]] %[[A]] %[[B]] ; CHECK-SPIRV: OpFunctionEnd ; kernel void testFOrdEqual(float2 a, float2 b, global int2 *res) { ; res[0] = a == b; ; } ; Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn writeonly define dso_local spir_kernel void @testFOrdEqual(<2 x float> noundef %a, <2 x float> noundef %b, <2 x i32> addrspace(1)* nocapture noundef writeonly %res) local_unnamed_addr #0 !kernel_arg_addr_space !3 !kernel_arg_access_qual !4 !kernel_arg_type !13 !kernel_arg_base_type !14 !kernel_arg_type_qual !7 { entry: %cmp = fcmp oeq <2 x float> %a, %b %sext = sext <2 x i1> %cmp to <2 x i32> store <2 x i32> %sext, <2 x i32> addrspace(1)* %res, align 8, !tbaa !8 ret void } ; CHECK-SPIRV: OpFunction ; CHECK-SPIRV-NEXT: %[[A:[0-9]+]] = OpFunctionParameter %{{[0-9]+}} ; CHECK-SPIRV-NEXT: %[[B:[0-9]+]] = OpFunctionParameter %{{[0-9]+}} ; CHECK-SPIRV: %{{[0-9]+}} = OpFUnordNotEqual %[[bool2]] %[[A]] %[[B]] ; CHECK-SPIRV: OpFunctionEnd ; kernel void testFUnordNotEqual(float2 a, float2 b, global int2 *res) { ; res[0] = a != b; ; } ; Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn writeonly define dso_local spir_kernel void @testFUnordNotEqual(<2 x float> noundef %a, <2 x float> noundef %b, <2 x i32> addrspace(1)* nocapture noundef writeonly %res) local_unnamed_addr #0 !kernel_arg_addr_space !3 !kernel_arg_access_qual !4 !kernel_arg_type !13 !kernel_arg_base_type !14 !kernel_arg_type_qual !7 { entry: %cmp = fcmp une <2 x float> %a, %b %sext = sext <2 x i1> %cmp to <2 x i32> store <2 x i32> %sext, <2 x i32> addrspace(1)* %res, align 8, !tbaa !8 ret void } ; CHECK-SPIRV: OpFunction ; CHECK-SPIRV-NEXT: %[[A:[0-9]+]] = OpFunctionParameter %{{[0-9]+}} ; CHECK-SPIRV-NEXT: %[[B:[0-9]+]] = OpFunctionParameter %{{[0-9]+}} ; CHECK-SPIRV: %{{[0-9]+}} = OpFOrdGreaterThan %[[bool2]] %[[A]] %[[B]] ; CHECK-SPIRV: OpFunctionEnd ; kernel void testFOrdGreaterThan(float2 a, float2 b, global int2 *res) { ; res[0] = a > b; ; } ; Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn writeonly define dso_local spir_kernel void @testFOrdGreaterThan(<2 x float> noundef %a, <2 x float> noundef %b, <2 x i32> addrspace(1)* nocapture noundef writeonly %res) local_unnamed_addr #0 !kernel_arg_addr_space !3 !kernel_arg_access_qual !4 !kernel_arg_type !13 !kernel_arg_base_type !14 !kernel_arg_type_qual !7 { entry: %cmp = fcmp ogt <2 x float> %a, %b %sext = sext <2 x i1> %cmp to <2 x i32> store <2 x i32> %sext, <2 x i32> addrspace(1)* %res, align 8, !tbaa !8 ret void } ; CHECK-SPIRV: OpFunction ; CHECK-SPIRV-NEXT: %[[A:[0-9]+]] = OpFunctionParameter %{{[0-9]+}} ; CHECK-SPIRV-NEXT: %[[B:[0-9]+]] = OpFunctionParameter %{{[0-9]+}} ; CHECK-SPIRV: %{{[0-9]+}} = OpFOrdGreaterThanEqual %[[bool2]] %[[A]] %[[B]] ; CHECK-SPIRV: OpFunctionEnd ; kernel void testFOrdGreaterThanEqual(float2 a, float2 b, global int2 *res) { ; res[0] = a >= b; ; } ; Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn writeonly define dso_local spir_kernel void @testFOrdGreaterThanEqual(<2 x float> noundef %a, <2 x float> noundef %b, <2 x i32> addrspace(1)* nocapture noundef writeonly %res) local_unnamed_addr #0 !kernel_arg_addr_space !3 !kernel_arg_access_qual !4 !kernel_arg_type !13 !kernel_arg_base_type !14 !kernel_arg_type_qual !7 { entry: %cmp = fcmp oge <2 x float> %a, %b %sext = sext <2 x i1> %cmp to <2 x i32> store <2 x i32> %sext, <2 x i32> addrspace(1)* %res, align 8, !tbaa !8 ret void } ; CHECK-SPIRV: OpFunction ; CHECK-SPIRV-NEXT: %[[A:[0-9]+]] = OpFunctionParameter %{{[0-9]+}} ; CHECK-SPIRV-NEXT: %[[B:[0-9]+]] = OpFunctionParameter %{{[0-9]+}} ; CHECK-SPIRV: %{{[0-9]+}} = OpFOrdLessThan %[[bool2]] %[[A]] %[[B]] ; CHECK-SPIRV: OpFunctionEnd ; kernel void testFOrdLessThan(float2 a, float2 b, global int2 *res) { ; res[0] = a < b; ; } ; Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn writeonly define dso_local spir_kernel void @testFOrdLessThan(<2 x float> noundef %a, <2 x float> noundef %b, <2 x i32> addrspace(1)* nocapture noundef writeonly %res) local_unnamed_addr #0 !kernel_arg_addr_space !3 !kernel_arg_access_qual !4 !kernel_arg_type !13 !kernel_arg_base_type !14 !kernel_arg_type_qual !7 { entry: %cmp = fcmp olt <2 x float> %a, %b %sext = sext <2 x i1> %cmp to <2 x i32> store <2 x i32> %sext, <2 x i32> addrspace(1)* %res, align 8, !tbaa !8 ret void } ; CHECK-SPIRV: OpFunction ; CHECK-SPIRV-NEXT: %[[A:[0-9]+]] = OpFunctionParameter %{{[0-9]+}} ; CHECK-SPIRV-NEXT: %[[B:[0-9]+]] = OpFunctionParameter %{{[0-9]+}} ; CHECK-SPIRV: %{{[0-9]+}} = OpFOrdLessThanEqual %[[bool2]] %[[A]] %[[B]] ; CHECK-SPIRV: OpFunctionEnd ; kernel void testFOrdLessThanEqual(float2 a, float2 b, global int2 *res) { ; res[0] = a <= b; ; } ; Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn writeonly define dso_local spir_kernel void @testFOrdLessThanEqual(<2 x float> noundef %a, <2 x float> noundef %b, <2 x i32> addrspace(1)* nocapture noundef writeonly %res) local_unnamed_addr #0 !kernel_arg_addr_space !3 !kernel_arg_access_qual !4 !kernel_arg_type !13 !kernel_arg_base_type !14 !kernel_arg_type_qual !7 { entry: %cmp = fcmp ole <2 x float> %a, %b %sext = sext <2 x i1> %cmp to <2 x i32> store <2 x i32> %sext, <2 x i32> addrspace(1)* %res, align 8, !tbaa !8 ret void } attributes #0 = { mustprogress nofree norecurse nosync nounwind willreturn writeonly "frame-pointer"="none" "min-legal-vector-width"="64" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "uniform-work-group-size"="false" } !llvm.module.flags = !{!0} !opencl.ocl.version = !{!1} !opencl.spir.version = !{!1} !llvm.ident = !{!2} !0 = !{i32 1, !"wchar_size", i32 4} !1 = !{i32 2, i32 0} !2 = !{!"clang version 14.0.0 (https://github.com/llvm/llvm-project.git 881b6a009fb6e2dd5fb924524cd6eacd14148a08)"} !3 = !{i32 0, i32 0, i32 1} !4 = !{!"none", !"none", !"none"} !5 = !{!"uint2", !"uint2", !"int2*"} !6 = !{!"uint __attribute__((ext_vector_type(2)))", !"uint __attribute__((ext_vector_type(2)))", !"int __attribute__((ext_vector_type(2)))*"} !7 = !{!"", !"", !""} !8 = !{!9, !9, i64 0} !9 = !{!"omnipotent char", !10, i64 0} !10 = !{!"Simple C/C++ TBAA"} !11 = !{!"int2", !"int2", !"int2*"} !12 = !{!"int __attribute__((ext_vector_type(2)))", !"int __attribute__((ext_vector_type(2)))", !"int __attribute__((ext_vector_type(2)))*"} !13 = !{!"float2", !"float2", !"int2*"} !14 = !{!"float __attribute__((ext_vector_type(2)))", !"float __attribute__((ext_vector_type(2)))", !"int __attribute__((ext_vector_type(2)))*"}