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