File: func_ptr.ll

package info (click to toggle)
intel-graphics-compiler2 2.22.3-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 107,676 kB
  • sloc: cpp: 809,645; lisp: 288,070; ansic: 16,397; python: 4,010; yacc: 2,588; lex: 1,666; pascal: 314; sh: 186; makefile: 38
file content (67 lines) | stat: -rw-r--r-- 3,699 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
;=========================== begin_copyright_notice ============================
;
; Copyright (C) 2021-2024 Intel Corporation
;
; SPDX-License-Identifier: MIT
;
;============================ end_copyright_notice =============================

; RUN: %opt_typed_ptrs %use_old_pass_manager% -GenXGlobalValueLowering -march=genx64 -mcpu=Gen9 -S < %s | FileCheck --enable-var-scope %s --check-prefixes=CHECK,CHECK-TYPED-PTRS
; RUN: %opt_opaque_ptrs %use_old_pass_manager% -GenXGlobalValueLowering -march=genx64 -mcpu=Gen9 -S < %s | FileCheck --enable-var-scope %s --check-prefixes=CHECK,CHECK-OPAQUE-PTRS

target datalayout = "e-p:64:64-i64:64-n8:16:32"

define internal void @func_a() #1 {
  ret void
}

define internal void @func_b() #1 {
  ret void
}

define dllexport void @simple(i1 %bool) {
; CHECK-LABEL: @simple
; COM: all the lowered function pointers are at the function entry
; CHECK-TYPED-PTRS-DAG: %[[GADDR_A:[^ ]+]] = call i64 @llvm.genx.gaddr.i64.p0f_isVoidf(void ()* @func_a)
; CHECK-TYPED-PTRS-DAG: %[[PTR_A:[^ ]+]] = inttoptr i64 %[[GADDR_A]] to void ()*
; CHECK-TYPED-PTRS-DAG: %[[GADDR_B:[^ ]+]] = call i64 @llvm.genx.gaddr.i64.p0f_isVoidf(void ()* @func_b)
; CHECK-TYPED-PTRS-DAG: %[[PTR_B:[^ ]+]] = inttoptr i64 %[[GADDR_B]] to void ()*
; CHECK-OPAQUE-PTRS-DAG: %[[GADDR_A:[^ ]+]] = call i64 @llvm.genx.gaddr.i64.p0(ptr @func_a)
; CHECK-OPAQUE-PTRS-DAG: %[[PTR_A:[^ ]+]] = inttoptr i64 %[[GADDR_A]] to ptr
; CHECK-OPAQUE-PTRS-DAG: %[[GADDR_B:[^ ]+]] = call i64 @llvm.genx.gaddr.i64.p0(ptr @func_b)
; CHECK-OPAQUE-PTRS-DAG: %[[PTR_B:[^ ]+]] = inttoptr i64 %[[GADDR_B]] to ptr

  %func.ptr = select i1 %bool, void ()* @func_a, void ()* @func_b
; CHECK-TYPED-PTRS: %func.ptr = select i1 %bool, void ()* %[[PTR_A]], void ()* %[[PTR_B]]
; CHECK-OPAQUE-PTRS: %func.ptr = select i1 %bool, ptr %[[PTR_A]], ptr %[[PTR_B]]
  call void %func.ptr()
; CHECK: call void %func.ptr()
  ret void
}

define dllexport void @ispc_icmp(<4 x i64> %func.ptrs) {
; CHECK-LABEL: @ispc_icmp
; CHECK-TYPED-PTRS-DAG: %[[GADDR_A:[^ ]+]] = call i64 @llvm.genx.gaddr.i64.p0f_isVoidf(void ()* @func_a)
; CHECK-TYPED-PTRS-DAG: %[[PTR_A:[^ ]+]] = inttoptr i64 %[[GADDR_A]] to void ()*
; CHECK-TYPED-PTRS-DAG: %[[GADDR_B:[^ ]+]] = call i64 @llvm.genx.gaddr.i64.p0f_isVoidf(void ()* @func_b)
; CHECK-TYPED-PTRS-DAG: %[[PTR_B:[^ ]+]] = inttoptr i64 %[[GADDR_B]] to void ()*
; CHECK-TYPED-PTRS-DAG: %[[P2I_A:[^ ]+]] = ptrtoint void ()* %[[PTR_A]] to i64
; CHECK-TYPED-PTRS-DAG: %[[P2I_B:[^ ]+]] = ptrtoint void ()* %[[PTR_B]] to i64
; CHECK-OPAQUE-PTRS-DAG: %[[GADDR_A:[^ ]+]] = call i64 @llvm.genx.gaddr.i64.p0(ptr @func_a)
; CHECK-OPAQUE-PTRS-DAG: %[[PTR_A:[^ ]+]] = inttoptr i64 %[[GADDR_A]] to ptr
; CHECK-OPAQUE-PTRS-DAG: %[[GADDR_B:[^ ]+]] = call i64 @llvm.genx.gaddr.i64.p0(ptr @func_b)
; CHECK-OPAQUE-PTRS-DAG: %[[PTR_B:[^ ]+]] = inttoptr i64 %[[GADDR_B]] to ptr
; CHECK-OPAQUE-PTRS-DAG: %[[P2I_A:[^ ]+]] = ptrtoint ptr %[[PTR_A]] to i64
; CHECK-OPAQUE-PTRS-DAG: %[[P2I_B:[^ ]+]] = ptrtoint ptr %[[PTR_B]] to i64
; CHECK-DAG: %[[VEC_0:[^ ]+]] = insertelement <4 x i64> undef, i64 %[[P2I_A]], i64 0
; CHECK-DAG: %[[VEC_1:[^ ]+]] = insertelement <4 x i64> %[[VEC_0]], i64 %[[P2I_B]], i64 1
; CHECK-DAG: %[[VEC_2:[^ ]+]] = insertelement <4 x i64> %[[VEC_1]], i64 %[[P2I_A]], i64 2
; CHECK-DAG: %[[VEC:[^ ]+]] = insertelement <4 x i64> %[[VEC_2]], i64 %[[P2I_B]], i64 3

; COM: <a, b, a, b>
  %icmp = icmp eq <4 x i64> %func.ptrs, <i64 ptrtoint (void ()* @func_a to i64), i64 ptrtoint (void ()* @func_b to i64), i64 ptrtoint (void ()* @func_a to i64), i64 ptrtoint (void ()* @func_b to i64)>
; CHECK: %icmp = icmp eq <4 x i64> %func.ptrs, %[[VEC]]
  ret void
}

attributes #1 = { noinline nounwind "CMStackCall" }