1*83c1d003SVyacheslav Levytskyy; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv32-unknown-unknown --spirv-ext=+SPV_INTEL_function_pointers %s -o - | FileCheck %s 28d8996ddSVyacheslav Levytskyy; TODO: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown %s -o - -filetype=obj | spirv-val %} 38d8996ddSVyacheslav Levytskyy 48d8996ddSVyacheslav Levytskyy; CHECK-DAG: OpName %[[I9:.*]] "_ZN13BaseIncrement9incrementEPi" 58d8996ddSVyacheslav Levytskyy; CHECK-DAG: OpName %[[I29:.*]] "_ZN12IncrementBy29incrementEPi" 68d8996ddSVyacheslav Levytskyy; CHECK-DAG: OpName %[[I49:.*]] "_ZN12IncrementBy49incrementEPi" 78d8996ddSVyacheslav Levytskyy; CHECK-DAG: OpName %[[I89:.*]] "_ZN12IncrementBy89incrementEPi" 8*83c1d003SVyacheslav Levytskyy; CHECK-DAG: OpName %[[Foo:.*]] "foo" 98d8996ddSVyacheslav Levytskyy 108d8996ddSVyacheslav Levytskyy; CHECK-DAG: %[[TyVoid:.*]] = OpTypeVoid 11*83c1d003SVyacheslav Levytskyy; CHECK-DAG: %[[TyInt32:.*]] = OpTypeInt 32 0 12*83c1d003SVyacheslav Levytskyy; CHECK-DAG: %[[TyInt8:.*]] = OpTypeInt 8 0 13*83c1d003SVyacheslav Levytskyy; CHECK-DAG: %[[Const8:.*]] = OpConstant %[[TyInt32]] 8 14*83c1d003SVyacheslav Levytskyy; CHECK-DAG: %[[TyArr:.*]] = OpTypeArray %[[TyInt8]] %[[Const8]] 158d8996ddSVyacheslav Levytskyy; CHECK-DAG: %[[TyStruct1:.*]] = OpTypeStruct %[[TyArr]] 168d8996ddSVyacheslav Levytskyy; CHECK-DAG: %[[TyStruct2:.*]] = OpTypeStruct %[[TyStruct1]] 178d8996ddSVyacheslav Levytskyy; CHECK-DAG: %[[TyPtrStruct2:.*]] = OpTypePointer Generic %[[TyStruct2]] 188d8996ddSVyacheslav Levytskyy; CHECK-DAG: %[[TyFun:.*]] = OpTypeFunction %[[TyVoid]] %[[TyPtrStruct2]] %[[#]] 198d8996ddSVyacheslav Levytskyy; CHECK-DAG: %[[TyPtrFun:.*]] = OpTypePointer Generic %[[TyFun]] 208d8996ddSVyacheslav Levytskyy; CHECK-DAG: %[[TyPtrPtrFun:.*]] = OpTypePointer Generic %[[TyPtrFun]] 218d8996ddSVyacheslav Levytskyy 22*83c1d003SVyacheslav Levytskyy; CHECK-DAG: %[[I9]] = OpFunction 23*83c1d003SVyacheslav Levytskyy; CHECK-DAG: %[[I29]] = OpFunction 24*83c1d003SVyacheslav Levytskyy; CHECK-DAG: %[[I49]] = OpFunction 25*83c1d003SVyacheslav Levytskyy; CHECK-DAG: %[[I89]] = OpFunction 26*83c1d003SVyacheslav Levytskyy 27*83c1d003SVyacheslav Levytskyy; CHECK: %[[Foo]] = OpFunction 28*83c1d003SVyacheslav Levytskyy; CHECK-4: OpFunctionParameter 298d8996ddSVyacheslav Levytskyy 308d8996ddSVyacheslav Levytskyy; CHECK: %[[Arg1:.*]] = OpPhi %[[TyPtrStruct2]] 318d8996ddSVyacheslav Levytskyy; CHECK: %[[VTbl:.*]] = OpBitcast %[[TyPtrPtrFun]] %[[#]] 328d8996ddSVyacheslav Levytskyy; CHECK: %[[FP:.*]] = OpLoad %[[TyPtrFun]] %[[VTbl]] 338d8996ddSVyacheslav Levytskyy; CHECK: %[[#]] = OpFunctionPointerCallINTEL %[[TyVoid]] %[[FP]] %[[Arg1]] %[[#]] 348d8996ddSVyacheslav Levytskyy 35*83c1d003SVyacheslav Levytskyy; CHECK-NO: OpFunction 36*83c1d003SVyacheslav Levytskyy 378d8996ddSVyacheslav Levytskyy%"cls::id" = type { %"cls::detail::array" } 388d8996ddSVyacheslav Levytskyy%"cls::detail::array" = type { [1 x i64] } 398d8996ddSVyacheslav Levytskyy%struct.obj_storage_t = type { %"struct.aligned_storage<BaseIncrement, IncrementBy2, IncrementBy4, IncrementBy8>::type" } 408d8996ddSVyacheslav Levytskyy%"struct.aligned_storage<BaseIncrement, IncrementBy2, IncrementBy4, IncrementBy8>::type" = type { [8 x i8] } 418d8996ddSVyacheslav Levytskyy 428d8996ddSVyacheslav Levytskyy@_ZTV12IncrementBy8 = linkonce_odr dso_local unnamed_addr addrspace(1) constant { [3 x ptr addrspace(4)] } { [3 x ptr addrspace(4)] [ptr addrspace(4) null, ptr addrspace(4) null, ptr addrspace(4) addrspacecast (ptr @_ZN12IncrementBy89incrementEPi to ptr addrspace(4))] }, align 8 438d8996ddSVyacheslav Levytskyy@_ZTV13BaseIncrement = linkonce_odr dso_local unnamed_addr addrspace(1) constant { [3 x ptr addrspace(4)] } { [3 x ptr addrspace(4)] [ptr addrspace(4) null, ptr addrspace(4) null, ptr addrspace(4) addrspacecast (ptr @_ZN13BaseIncrement9incrementEPi to ptr addrspace(4))] }, align 8 448d8996ddSVyacheslav Levytskyy@_ZTV12IncrementBy4 = linkonce_odr dso_local unnamed_addr addrspace(1) constant { [3 x ptr addrspace(4)] } { [3 x ptr addrspace(4)] [ptr addrspace(4) null, ptr addrspace(4) null, ptr addrspace(4) addrspacecast (ptr @_ZN12IncrementBy49incrementEPi to ptr addrspace(4))] }, align 8 458d8996ddSVyacheslav Levytskyy@_ZTV12IncrementBy2 = linkonce_odr dso_local unnamed_addr addrspace(1) constant { [3 x ptr addrspace(4)] } { [3 x ptr addrspace(4)] [ptr addrspace(4) null, ptr addrspace(4) null, ptr addrspace(4) addrspacecast (ptr @_ZN12IncrementBy29incrementEPi to ptr addrspace(4))] }, align 8 468d8996ddSVyacheslav Levytskyy@__spirv_BuiltInWorkgroupId = external dso_local local_unnamed_addr addrspace(1) constant <3 x i64>, align 32 478d8996ddSVyacheslav Levytskyy@__spirv_BuiltInGlobalLinearId = external dso_local local_unnamed_addr addrspace(1) constant i64, align 8 488d8996ddSVyacheslav Levytskyy@__spirv_BuiltInWorkgroupSize = external dso_local local_unnamed_addr addrspace(1) constant <3 x i64>, align 32 498d8996ddSVyacheslav Levytskyy 508d8996ddSVyacheslav Levytskyydefine weak_odr dso_local spir_kernel void @foo(ptr addrspace(1) noundef align 8 %_arg_StorageAcc, ptr noundef byval(%"cls::id") align 8 %_arg_StorageAcc3, i32 noundef %_arg_TestCase, ptr addrspace(1) noundef align 4 %_arg_DataAcc) { 518d8996ddSVyacheslav Levytskyyentry: 528d8996ddSVyacheslav Levytskyy %r0 = load i64, ptr %_arg_StorageAcc3, align 8 538d8996ddSVyacheslav Levytskyy %add.ptr.i = getelementptr inbounds %struct.obj_storage_t, ptr addrspace(1) %_arg_StorageAcc, i64 %r0 548d8996ddSVyacheslav Levytskyy %arrayidx.ascast.i = addrspacecast ptr addrspace(1) %add.ptr.i to ptr addrspace(4) 558d8996ddSVyacheslav Levytskyy %cmp.i = icmp ugt i32 %_arg_TestCase, 3 568d8996ddSVyacheslav Levytskyy br i1 %cmp.i, label %entry.critedge, label %if.end.1 578d8996ddSVyacheslav Levytskyy 588d8996ddSVyacheslav Levytskyyentry.critedge: ; preds = %entry 598d8996ddSVyacheslav Levytskyy %vtable.i.pre = load ptr addrspace(4), ptr addrspace(4) null, align 8 608d8996ddSVyacheslav Levytskyy br label %exit 618d8996ddSVyacheslav Levytskyy 628d8996ddSVyacheslav Levytskyyif.end.1: ; preds = %entry 638d8996ddSVyacheslav Levytskyy switch i32 %_arg_TestCase, label %if.end.5 [ 648d8996ddSVyacheslav Levytskyy i32 0, label %if.end.2 658d8996ddSVyacheslav Levytskyy i32 1, label %if.end.3 668d8996ddSVyacheslav Levytskyy i32 2, label %if.end.4 678d8996ddSVyacheslav Levytskyy ] 688d8996ddSVyacheslav Levytskyy 698d8996ddSVyacheslav Levytskyyif.end.5: ; preds = %if.end.1 708d8996ddSVyacheslav Levytskyy store ptr addrspace(1) getelementptr inbounds inrange(-16, 8) (i8, ptr addrspace(1) @_ZTV12IncrementBy8, i64 16), ptr addrspace(1) %add.ptr.i, align 8 718d8996ddSVyacheslav Levytskyy br label %exit 728d8996ddSVyacheslav Levytskyy 738d8996ddSVyacheslav Levytskyyif.end.4: ; preds = %if.end.1 748d8996ddSVyacheslav Levytskyy store ptr addrspace(1) getelementptr inbounds inrange(-16, 8) (i8, ptr addrspace(1) @_ZTV12IncrementBy4, i64 16), ptr addrspace(1) %add.ptr.i, align 8 758d8996ddSVyacheslav Levytskyy br label %exit 768d8996ddSVyacheslav Levytskyy 778d8996ddSVyacheslav Levytskyyif.end.3: ; preds = %if.end.1 788d8996ddSVyacheslav Levytskyy store ptr addrspace(1) getelementptr inbounds inrange(-16, 8) (i8, ptr addrspace(1) @_ZTV12IncrementBy2, i64 16), ptr addrspace(1) %add.ptr.i, align 8 798d8996ddSVyacheslav Levytskyy br label %exit 808d8996ddSVyacheslav Levytskyy 818d8996ddSVyacheslav Levytskyyif.end.2: ; preds = %if.end.1 828d8996ddSVyacheslav Levytskyy store ptr addrspace(1) getelementptr inbounds inrange(-16, 8) (i8, ptr addrspace(1) @_ZTV13BaseIncrement, i64 16), ptr addrspace(1) %add.ptr.i, align 8 838d8996ddSVyacheslav Levytskyy br label %exit 848d8996ddSVyacheslav Levytskyy 858d8996ddSVyacheslav Levytskyyexit: ; preds = %if.end.2, %if.end.3, %if.end.4, %if.end.5, %entry.critedge 868d8996ddSVyacheslav Levytskyy %vtable.i = phi ptr addrspace(4) [ %vtable.i.pre, %entry.critedge ], [ inttoptr (i64 ptrtoint (ptr addrspace(1) getelementptr inbounds inrange(-16, 8) (i8, ptr addrspace(1) @_ZTV12IncrementBy8, i64 16) to i64) to ptr addrspace(4)), %if.end.5 ], [ inttoptr (i64 ptrtoint (ptr addrspace(1) getelementptr inbounds inrange(-16, 8) (i8, ptr addrspace(1) @_ZTV12IncrementBy4, i64 16) to i64) to ptr addrspace(4)), %if.end.4 ], [ inttoptr (i64 ptrtoint (ptr addrspace(1) getelementptr inbounds inrange(-16, 8) (i8, ptr addrspace(1) @_ZTV12IncrementBy2, i64 16) to i64) to ptr addrspace(4)), %if.end.3 ], [ inttoptr (i64 ptrtoint (ptr addrspace(1) getelementptr inbounds inrange(-16, 8) (i8, ptr addrspace(1) @_ZTV13BaseIncrement, i64 16) to i64) to ptr addrspace(4)), %if.end.2 ] 878d8996ddSVyacheslav Levytskyy %retval.0.i = phi ptr addrspace(4) [ null, %entry.critedge ], [ %arrayidx.ascast.i, %if.end.5 ], [ %arrayidx.ascast.i, %if.end.4 ], [ %arrayidx.ascast.i, %if.end.3 ], [ %arrayidx.ascast.i, %if.end.2 ] 888d8996ddSVyacheslav Levytskyy %r1 = addrspacecast ptr addrspace(1) %_arg_DataAcc to ptr addrspace(4) 898d8996ddSVyacheslav Levytskyy %r2 = load ptr addrspace(4), ptr addrspace(4) %vtable.i, align 8 908d8996ddSVyacheslav Levytskyy tail call spir_func addrspace(4) void %r2(ptr addrspace(4) noundef align 8 dereferenceable_or_null(8) %retval.0.i, ptr addrspace(4) noundef %r1) 918d8996ddSVyacheslav Levytskyy ret void 928d8996ddSVyacheslav Levytskyy} 938d8996ddSVyacheslav Levytskyy 948d8996ddSVyacheslav Levytskyydeclare dso_local spir_func void @_ZN13BaseIncrement9incrementEPi(ptr addrspace(4) noundef align 8 dereferenceable_or_null(8), ptr addrspace(4) noundef) 958d8996ddSVyacheslav Levytskyydeclare dso_local spir_func void @_ZN12IncrementBy29incrementEPi(ptr addrspace(4) noundef align 8 dereferenceable_or_null(8), ptr addrspace(4) noundef) 968d8996ddSVyacheslav Levytskyydeclare dso_local spir_func void @_ZN12IncrementBy49incrementEPi(ptr addrspace(4) noundef align 8 dereferenceable_or_null(8), ptr addrspace(4) noundef) 978d8996ddSVyacheslav Levytskyydeclare dso_local spir_func void @_ZN12IncrementBy89incrementEPi(ptr addrspace(4) noundef align 8 dereferenceable_or_null(8), ptr addrspace(4) noundef) 98