xref: /llvm-project/llvm/test/CodeGen/SPIRV/extensions/SPV_INTEL_function_pointers/fp-simple-hierarchy.ll (revision 83c1d003118a2cb8136fe49e2ec43958c93d9d6b)
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