1*67d3ef74SVyacheslav Levytskyy; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv32-unknown-unknown --spirv-ext=+SPV_INTEL_function_pointers %s -o - | FileCheck %s 2*67d3ef74SVyacheslav Levytskyy; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv32-unknown-unknown %s -o - -filetype=obj | spirv-val %} 3540d2551SVyacheslav Levytskyy 4*67d3ef74SVyacheslav Levytskyy; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv64-unknown-unknown --spirv-ext=+SPV_INTEL_function_pointers %s -o - | FileCheck %s 5*67d3ef74SVyacheslav Levytskyy; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown %s -o - -filetype=obj | spirv-val %} 6540d2551SVyacheslav Levytskyy 7540d2551SVyacheslav Levytskyy; CHECK-DAG: %[[Char:.*]] = OpTypeInt 8 0 8540d2551SVyacheslav Levytskyy; CHECK-DAG: %[[CharVec2:.*]] = OpTypeVector %[[Char]] 2 9540d2551SVyacheslav Levytskyy; CHECK-DAG: %[[CharVec3:.*]] = OpTypeVector %[[Char]] 3 10540d2551SVyacheslav Levytskyy 11540d2551SVyacheslav Levytskyy; CHECK-DAG: %[[Short:.*]] = OpTypeInt 16 0 12540d2551SVyacheslav Levytskyy; CHECK-DAG: %[[ShortVec2:.*]] = OpTypeVector %[[Short]] 2 13540d2551SVyacheslav Levytskyy; CHECK-DAG: %[[ShortVec3:.*]] = OpTypeVector %[[Short]] 3 14540d2551SVyacheslav Levytskyy 15540d2551SVyacheslav Levytskyy; CHECK-DAG: %[[Int:.*]] = OpTypeInt 32 0 16540d2551SVyacheslav Levytskyy; CHECK-DAG: %[[IntVec2:.*]] = OpTypeVector %[[Int]] 2 17540d2551SVyacheslav Levytskyy; CHECK-DAG: %[[IntVec3:.*]] = OpTypeVector %[[Int]] 3 18540d2551SVyacheslav Levytskyy 19540d2551SVyacheslav Levytskyy; CHECK-DAG: %[[Long:.*]] = OpTypeInt 64 0 20540d2551SVyacheslav Levytskyy; CHECK-DAG: %[[LongVec2:.*]] = OpTypeVector %[[Long]] 2 21540d2551SVyacheslav Levytskyy; CHECK-DAG: %[[LongVec3:.*]] = OpTypeVector %[[Long]] 3 22540d2551SVyacheslav Levytskyy 23540d2551SVyacheslav Levytskyy; CHECK: OpFunction 24540d2551SVyacheslav Levytskyy; CHECK: %[[Shuffle1:.*]] = OpVectorShuffle %[[CharVec2]] %[[#]] %[[#]] 1 -1 25540d2551SVyacheslav Levytskyy; CHECK: %[[Added1:.*]] = OpBitwiseAnd %[[CharVec2]] %[[#]] %[[#]] 26540d2551SVyacheslav Levytskyy; CHECK: %[[Vec2CharR:.*]] = OpCompositeExtract %[[Char]] %[[Added1]] 0 27540d2551SVyacheslav Levytskyy; CHECK: OpReturnValue %[[Vec2CharR]] 28540d2551SVyacheslav Levytskyy; CHECK: OpFunctionEnd 29540d2551SVyacheslav Levytskyy 30540d2551SVyacheslav Levytskyy; CHECK: OpFunction 31540d2551SVyacheslav Levytskyy; CHECK: %[[ParamVec3Char:.*]] = OpFunctionParameter %[[CharVec3]] 32540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3CharItem0:.*]] = OpCompositeExtract %[[Char]] %[[ParamVec3Char]] 0 33540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3CharItem1:.*]] = OpCompositeExtract %[[Char]] %[[ParamVec3Char]] 1 34540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3CharItem2:.*]] = OpCompositeExtract %[[Char]] %[[ParamVec3Char]] 2 35540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3CharR1:.*]] = OpBitwiseAnd %[[Char]] %[[Vec3CharItem0]] %[[Vec3CharItem1]] 36540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3CharR2:.*]] = OpBitwiseAnd %[[Char]] %[[Vec3CharR1]] %[[Vec3CharItem2]] 37540d2551SVyacheslav Levytskyy; CHECK: OpReturnValue %[[Vec3CharR2]] 38540d2551SVyacheslav Levytskyy; CHECK: OpFunctionEnd 39540d2551SVyacheslav Levytskyy 40540d2551SVyacheslav Levytskyy; CHECK: OpFunction 41540d2551SVyacheslav Levytskyy; CHECK: %[[Shuffle1:.*]] = OpVectorShuffle %[[ShortVec2]] %[[#]] %[[#]] 1 -1 42540d2551SVyacheslav Levytskyy; CHECK: %[[Added1:.*]] = OpBitwiseAnd %[[ShortVec2]] %[[#]] %[[#]] 43540d2551SVyacheslav Levytskyy; CHECK: %[[Vec2ShortR:.*]] = OpCompositeExtract %[[Short]] %[[Added1]] 0 44540d2551SVyacheslav Levytskyy; CHECK: OpReturnValue %[[Vec2ShortR]] 45540d2551SVyacheslav Levytskyy; CHECK: OpFunctionEnd 46540d2551SVyacheslav Levytskyy 47540d2551SVyacheslav Levytskyy; CHECK: OpFunction 48540d2551SVyacheslav Levytskyy; CHECK: %[[ParamVec3Short:.*]] = OpFunctionParameter %[[ShortVec3]] 49540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3ShortItem0:.*]] = OpCompositeExtract %[[Short]] %[[ParamVec3Short]] 0 50540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3ShortItem1:.*]] = OpCompositeExtract %[[Short]] %[[ParamVec3Short]] 1 51540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3ShortItem2:.*]] = OpCompositeExtract %[[Short]] %[[ParamVec3Short]] 2 52540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3ShortR1:.*]] = OpBitwiseAnd %[[Short]] %[[Vec3ShortItem0]] %[[Vec3ShortItem1]] 53540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3ShortR2:.*]] = OpBitwiseAnd %[[Short]] %[[Vec3ShortR1]] %[[Vec3ShortItem2]] 54540d2551SVyacheslav Levytskyy; CHECK: OpReturnValue %[[Vec3ShortR2]] 55540d2551SVyacheslav Levytskyy; CHECK: OpFunctionEnd 56540d2551SVyacheslav Levytskyy 57540d2551SVyacheslav Levytskyy; CHECK: OpFunction 58540d2551SVyacheslav Levytskyy; CHECK: %[[Shuffle1:.*]] = OpVectorShuffle %[[IntVec2]] %[[#]] %[[#]] 1 -1 59540d2551SVyacheslav Levytskyy; CHECK: %[[Added1:.*]] = OpBitwiseAnd %[[IntVec2]] %[[#]] %[[#]] 60540d2551SVyacheslav Levytskyy; CHECK: %[[Vec2IntR:.*]] = OpCompositeExtract %[[Int]] %[[Added1]] 0 61540d2551SVyacheslav Levytskyy; CHECK: OpReturnValue %[[Vec2IntR]] 62540d2551SVyacheslav Levytskyy; CHECK: OpFunctionEnd 63540d2551SVyacheslav Levytskyy 64540d2551SVyacheslav Levytskyy; CHECK: OpFunction 65540d2551SVyacheslav Levytskyy; CHECK: %[[ParamVec3Int:.*]] = OpFunctionParameter %[[IntVec3]] 66540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3IntItem0:.*]] = OpCompositeExtract %[[Int]] %[[ParamVec3Int]] 0 67540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3IntItem1:.*]] = OpCompositeExtract %[[Int]] %[[ParamVec3Int]] 1 68540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3IntItem2:.*]] = OpCompositeExtract %[[Int]] %[[ParamVec3Int]] 2 69540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3IntR1:.*]] = OpBitwiseAnd %[[Int]] %[[Vec3IntItem0]] %[[Vec3IntItem1]] 70540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3IntR2:.*]] = OpBitwiseAnd %[[Int]] %[[Vec3IntR1]] %[[Vec3IntItem2]] 71540d2551SVyacheslav Levytskyy; CHECK: OpReturnValue %[[Vec3IntR2]] 72540d2551SVyacheslav Levytskyy; CHECK: OpFunctionEnd 73540d2551SVyacheslav Levytskyy 74540d2551SVyacheslav Levytskyy; CHECK: OpFunction 75540d2551SVyacheslav Levytskyy; CHECK: %[[Shuffle1:.*]] = OpVectorShuffle %[[LongVec2]] %[[#]] %[[#]] 1 -1 76540d2551SVyacheslav Levytskyy; CHECK: %[[Added1:.*]] = OpBitwiseAnd %[[LongVec2]] %[[#]] %[[#]] 77540d2551SVyacheslav Levytskyy; CHECK: %[[Vec2LongR:.*]] = OpCompositeExtract %[[Long]] %[[Added1]] 0 78540d2551SVyacheslav Levytskyy; CHECK: OpReturnValue %[[Vec2LongR]] 79540d2551SVyacheslav Levytskyy; CHECK: OpFunctionEnd 80540d2551SVyacheslav Levytskyy 81540d2551SVyacheslav Levytskyy; CHECK: OpFunction 82540d2551SVyacheslav Levytskyy; CHECK: %[[ParamVec3Long:.*]] = OpFunctionParameter %[[LongVec3]] 83540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3LongItem0:.*]] = OpCompositeExtract %[[Long]] %[[ParamVec3Long]] 0 84540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3LongItem1:.*]] = OpCompositeExtract %[[Long]] %[[ParamVec3Long]] 1 85540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3LongItem2:.*]] = OpCompositeExtract %[[Long]] %[[ParamVec3Long]] 2 86540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3LongR1:.*]] = OpBitwiseAnd %[[Long]] %[[Vec3LongItem0]] %[[Vec3LongItem1]] 87540d2551SVyacheslav Levytskyy; CHECK: %[[Vec3LongR2:.*]] = OpBitwiseAnd %[[Long]] %[[Vec3LongR1]] %[[Vec3LongItem2]] 88540d2551SVyacheslav Levytskyy; CHECK: OpReturnValue %[[Vec3LongR2]] 89540d2551SVyacheslav Levytskyy; CHECK: OpFunctionEnd 90540d2551SVyacheslav Levytskyy 91540d2551SVyacheslav Levytskyydefine spir_func i8 @test_vector_reduce_and_v2i8(<2 x i8> %v) { 92540d2551SVyacheslav Levytskyyentry: 93540d2551SVyacheslav Levytskyy %res = call i8 @llvm.vector.reduce.and.v2i8(<2 x i8> %v) 94540d2551SVyacheslav Levytskyy ret i8 %res 95540d2551SVyacheslav Levytskyy} 96540d2551SVyacheslav Levytskyy 97540d2551SVyacheslav Levytskyydefine spir_func i8 @test_vector_reduce_and_v3i8(<3 x i8> %v) { 98540d2551SVyacheslav Levytskyyentry: 99540d2551SVyacheslav Levytskyy %res = call i8 @llvm.vector.reduce.and.v3i8(<3 x i8> %v) 100540d2551SVyacheslav Levytskyy ret i8 %res 101540d2551SVyacheslav Levytskyy} 102540d2551SVyacheslav Levytskyy 103540d2551SVyacheslav Levytskyydefine spir_func i8 @test_vector_reduce_and_v4i8(<4 x i8> %v) { 104540d2551SVyacheslav Levytskyyentry: 105540d2551SVyacheslav Levytskyy %res = call i8 @llvm.vector.reduce.and.v4i8(<4 x i8> %v) 106540d2551SVyacheslav Levytskyy ret i8 %res 107540d2551SVyacheslav Levytskyy} 108540d2551SVyacheslav Levytskyy 109540d2551SVyacheslav Levytskyydefine spir_func i8 @test_vector_reduce_and_v8i8(<8 x i8> %v) { 110540d2551SVyacheslav Levytskyyentry: 111540d2551SVyacheslav Levytskyy %res = call i8 @llvm.vector.reduce.and.v8i8(<8 x i8> %v) 112540d2551SVyacheslav Levytskyy ret i8 %res 113540d2551SVyacheslav Levytskyy} 114540d2551SVyacheslav Levytskyy 115540d2551SVyacheslav Levytskyydefine spir_func i8 @test_vector_reduce_and_v16i8(<16 x i8> %v) { 116540d2551SVyacheslav Levytskyyentry: 117540d2551SVyacheslav Levytskyy %res = call i8 @llvm.vector.reduce.and.v16i8(<16 x i8> %v) 118540d2551SVyacheslav Levytskyy ret i8 %res 119540d2551SVyacheslav Levytskyy} 120540d2551SVyacheslav Levytskyy 121540d2551SVyacheslav Levytskyydefine spir_func i16 @test_vector_reduce_and_v2i16(<2 x i16> %v) { 122540d2551SVyacheslav Levytskyyentry: 123540d2551SVyacheslav Levytskyy %res = call i16 @llvm.vector.reduce.and.v2i16(<2 x i16> %v) 124540d2551SVyacheslav Levytskyy ret i16 %res 125540d2551SVyacheslav Levytskyy} 126540d2551SVyacheslav Levytskyy 127540d2551SVyacheslav Levytskyydefine spir_func i16 @test_vector_reduce_and_v3i16(<3 x i16> %v) { 128540d2551SVyacheslav Levytskyyentry: 129540d2551SVyacheslav Levytskyy %res = call i16 @llvm.vector.reduce.and.v3i16(<3 x i16> %v) 130540d2551SVyacheslav Levytskyy ret i16 %res 131540d2551SVyacheslav Levytskyy} 132540d2551SVyacheslav Levytskyy 133540d2551SVyacheslav Levytskyydefine spir_func i16 @test_vector_reduce_and_v4i16(<4 x i16> %v) { 134540d2551SVyacheslav Levytskyyentry: 135540d2551SVyacheslav Levytskyy %res = call i16 @llvm.vector.reduce.and.v4i16(<4 x i16> %v) 136540d2551SVyacheslav Levytskyy ret i16 %res 137540d2551SVyacheslav Levytskyy} 138540d2551SVyacheslav Levytskyy 139540d2551SVyacheslav Levytskyydefine spir_func i16 @test_vector_reduce_and_v8i16(<8 x i16> %v) { 140540d2551SVyacheslav Levytskyyentry: 141540d2551SVyacheslav Levytskyy %res = call i16 @llvm.vector.reduce.and.v8i16(<8 x i16> %v) 142540d2551SVyacheslav Levytskyy ret i16 %res 143540d2551SVyacheslav Levytskyy} 144540d2551SVyacheslav Levytskyy 145540d2551SVyacheslav Levytskyydefine spir_func i16 @test_vector_reduce_and_v16i16(<16 x i16> %v) { 146540d2551SVyacheslav Levytskyyentry: 147540d2551SVyacheslav Levytskyy %res = call i16 @llvm.vector.reduce.and.v16i16(<16 x i16> %v) 148540d2551SVyacheslav Levytskyy ret i16 %res 149540d2551SVyacheslav Levytskyy} 150540d2551SVyacheslav Levytskyy 151540d2551SVyacheslav Levytskyy 152540d2551SVyacheslav Levytskyydefine spir_func i32 @test_vector_reduce_and_v2i32(<2 x i32> %v) { 153540d2551SVyacheslav Levytskyyentry: 154540d2551SVyacheslav Levytskyy %res = call i32 @llvm.vector.reduce.and.v2i32(<2 x i32> %v) 155540d2551SVyacheslav Levytskyy ret i32 %res 156540d2551SVyacheslav Levytskyy} 157540d2551SVyacheslav Levytskyy 158540d2551SVyacheslav Levytskyydefine spir_func i32 @test_vector_reduce_and_v3i32(<3 x i32> %v) { 159540d2551SVyacheslav Levytskyyentry: 160540d2551SVyacheslav Levytskyy %res = call i32 @llvm.vector.reduce.and.v3i32(<3 x i32> %v) 161540d2551SVyacheslav Levytskyy ret i32 %res 162540d2551SVyacheslav Levytskyy} 163540d2551SVyacheslav Levytskyy 164540d2551SVyacheslav Levytskyydefine spir_func i32 @test_vector_reduce_and_v4i32(<4 x i32> %v) { 165540d2551SVyacheslav Levytskyyentry: 166540d2551SVyacheslav Levytskyy %res = call i32 @llvm.vector.reduce.and.v4i32(<4 x i32> %v) 167540d2551SVyacheslav Levytskyy ret i32 %res 168540d2551SVyacheslav Levytskyy} 169540d2551SVyacheslav Levytskyy 170540d2551SVyacheslav Levytskyydefine spir_func i32 @test_vector_reduce_and_v8i32(<8 x i32> %v) { 171540d2551SVyacheslav Levytskyyentry: 172540d2551SVyacheslav Levytskyy %res = call i32 @llvm.vector.reduce.and.v8i32(<8 x i32> %v) 173540d2551SVyacheslav Levytskyy ret i32 %res 174540d2551SVyacheslav Levytskyy} 175540d2551SVyacheslav Levytskyy 176540d2551SVyacheslav Levytskyydefine spir_func i32 @test_vector_reduce_and_v16i32(<16 x i32> %v) { 177540d2551SVyacheslav Levytskyyentry: 178540d2551SVyacheslav Levytskyy %res = call i32 @llvm.vector.reduce.and.v16i32(<16 x i32> %v) 179540d2551SVyacheslav Levytskyy ret i32 %res 180540d2551SVyacheslav Levytskyy} 181540d2551SVyacheslav Levytskyy 182540d2551SVyacheslav Levytskyydefine spir_func i64 @test_vector_reduce_and_v2i64(<2 x i64> %v) { 183540d2551SVyacheslav Levytskyyentry: 184540d2551SVyacheslav Levytskyy %res = call i64 @llvm.vector.reduce.and.v2i64(<2 x i64> %v) 185540d2551SVyacheslav Levytskyy ret i64 %res 186540d2551SVyacheslav Levytskyy} 187540d2551SVyacheslav Levytskyy 188540d2551SVyacheslav Levytskyydefine spir_func i64 @test_vector_reduce_and_v3i64(<3 x i64> %v) { 189540d2551SVyacheslav Levytskyyentry: 190540d2551SVyacheslav Levytskyy %res = call i64 @llvm.vector.reduce.and.v3i64(<3 x i64> %v) 191540d2551SVyacheslav Levytskyy ret i64 %res 192540d2551SVyacheslav Levytskyy} 193540d2551SVyacheslav Levytskyy 194540d2551SVyacheslav Levytskyydefine spir_func i64 @test_vector_reduce_and_v4i64(<4 x i64> %v) { 195540d2551SVyacheslav Levytskyyentry: 196540d2551SVyacheslav Levytskyy %res = call i64 @llvm.vector.reduce.and.v4i64(<4 x i64> %v) 197540d2551SVyacheslav Levytskyy ret i64 %res 198540d2551SVyacheslav Levytskyy} 199540d2551SVyacheslav Levytskyy 200540d2551SVyacheslav Levytskyydefine spir_func i64 @test_vector_reduce_and_v8i64(<8 x i64> %v) { 201540d2551SVyacheslav Levytskyyentry: 202540d2551SVyacheslav Levytskyy %res = call i64 @llvm.vector.reduce.and.v8i64(<8 x i64> %v) 203540d2551SVyacheslav Levytskyy ret i64 %res 204540d2551SVyacheslav Levytskyy} 205540d2551SVyacheslav Levytskyy 206540d2551SVyacheslav Levytskyydefine spir_func i64 @test_vector_reduce_and_v16i64(<16 x i64> %v) { 207540d2551SVyacheslav Levytskyyentry: 208540d2551SVyacheslav Levytskyy %res = call i64 @llvm.vector.reduce.and.v16i64(<16 x i64> %v) 209540d2551SVyacheslav Levytskyy ret i64 %res 210540d2551SVyacheslav Levytskyy} 211540d2551SVyacheslav Levytskyy 212540d2551SVyacheslav Levytskyydeclare i8 @llvm.vector.reduce.and.v2i8(<2 x i8>) 213540d2551SVyacheslav Levytskyydeclare i8 @llvm.vector.reduce.and.v3i8(<3 x i8>) 214540d2551SVyacheslav Levytskyydeclare i8 @llvm.vector.reduce.and.v4i8(<4 x i8>) 215540d2551SVyacheslav Levytskyydeclare i8 @llvm.vector.reduce.and.v8i8(<8 x i8>) 216540d2551SVyacheslav Levytskyydeclare i8 @llvm.vector.reduce.and.v16i8(<16 x i8>) 217540d2551SVyacheslav Levytskyy 218540d2551SVyacheslav Levytskyydeclare i16 @llvm.vector.reduce.and.v2i16(<2 x i16>) 219540d2551SVyacheslav Levytskyydeclare i16 @llvm.vector.reduce.and.v3i16(<3 x i16>) 220540d2551SVyacheslav Levytskyydeclare i16 @llvm.vector.reduce.and.v4i16(<4 x i16>) 221540d2551SVyacheslav Levytskyydeclare i16 @llvm.vector.reduce.and.v8i16(<8 x i16>) 222540d2551SVyacheslav Levytskyydeclare i16 @llvm.vector.reduce.and.v16i16(<16 x i16>) 223540d2551SVyacheslav Levytskyy 224540d2551SVyacheslav Levytskyydeclare i32 @llvm.vector.reduce.and.v2i32(<2 x i32>) 225540d2551SVyacheslav Levytskyydeclare i32 @llvm.vector.reduce.and.v3i32(<3 x i32>) 226540d2551SVyacheslav Levytskyydeclare i32 @llvm.vector.reduce.and.v4i32(<4 x i32>) 227540d2551SVyacheslav Levytskyydeclare i32 @llvm.vector.reduce.and.v8i32(<8 x i32>) 228540d2551SVyacheslav Levytskyydeclare i32 @llvm.vector.reduce.and.v16i32(<16 x i32>) 229540d2551SVyacheslav Levytskyy 230540d2551SVyacheslav Levytskyydeclare i64 @llvm.vector.reduce.and.v2i64(<2 x i64>) 231540d2551SVyacheslav Levytskyydeclare i64 @llvm.vector.reduce.and.v3i64(<3 x i64>) 232540d2551SVyacheslav Levytskyydeclare i64 @llvm.vector.reduce.and.v4i64(<4 x i64>) 233540d2551SVyacheslav Levytskyydeclare i64 @llvm.vector.reduce.and.v8i64(<8 x i64>) 234540d2551SVyacheslav Levytskyydeclare i64 @llvm.vector.reduce.and.v16i64(<16 x i64>) 235