File: no-promote.ll

package info (click to toggle)
intel-graphics-compiler 1.0.17791.18-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 102,312 kB
  • sloc: cpp: 935,343; lisp: 286,143; ansic: 16,196; python: 3,279; yacc: 2,487; lex: 1,642; pascal: 300; sh: 174; makefile: 27
file content (156 lines) | stat: -rw-r--r-- 5,330 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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
;=========================== begin_copyright_notice ============================
;
; Copyright (C) 2022 Intel Corporation
;
; SPDX-License-Identifier: MIT
;
;============================ end_copyright_notice =============================

; RUN: igc_opt --enable-debugify -igc-type-legalizer -S < %s 2>&1 | FileCheck %s

; Test checks legal cases for several unsupported instructions and cases that ignore
; illegal operands/return value

; Debug-info related check
; CHECK-NOT: WARNING
; CHECK: CheckModuleDebugify: PASS

target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f16:16:16-f32:32:32-f64:64:64-f80:128:128-v16:16:16-v24:32:32-v32:32:32-v48:64:64-v64:64:64-v96:128:128-v128:128:128-v192:256:256-v256:256:256-v512:512:512-v1024:1024:1024-a:64:64-f80:128:128-n8:16:32:64"

; Note: Illegal imm will result in assert as not supported, should follow Elementize routine
define void @test_aggregate(i8 %src) {
; CHECK-LABEL: @test_aggregate(
; CHECK:    [[TMP1:%.*]] = insertvalue [2 x i8] c"\0D\12", i8 [[SRC:%.*]], 0
; CHECK:    [[TMP2:%.*]] = extractvalue [2 x i8] [[TMP1]], 0
; CHECK:    call void @use.i8(i8 [[TMP2]])
; CHECK:    ret void
;
  %1 = insertvalue [2 x i8] [i8 13, i8 18], i8 %src, 0
  %2 = extractvalue [2 x i8] %1, 0
  call void @use.i8(i8 %2)
  ret void
}

; Note: llvm does required checkers for pow2 and larger then byte access for atomics, but large ints are currently not supported
define void @test_atomic_cmp(i128* %src) {
; CHECK-LABEL: @test_atomic_cmp(
; CHECK:    [[TMP1:%.*]] = cmpxchg i128* [[SRC:%.*]], i128 13, i128 14 acq_rel monotonic
; CHECK:    [[TMP2:%.*]] = extractvalue { i128, i1 } [[TMP1]], 0
; CHECK:    call void @use.i128(i128 [[TMP2]])
; CHECK:    ret void
;
  %1 = cmpxchg i128* %src, i128 13, i128 14 acq_rel monotonic
  %2 = extractvalue {i128, i1} %1, 0
  call void @use.i128(i128 %2)
  ret void
}

; Note: llvm does required checkers for pow2 and larger then byte access for atomics, but large ints are currently not supported
define void @test_atomic_rmw(i128* %src) {
; CHECK-LABEL: @test_atomic_rmw(
; CHECK:    [[TMP1:%.*]] = atomicrmw add i128* [[SRC:%.*]], i128 1 acquire
; CHECK:    call void @use.i128(i128 [[TMP1]])
; CHECK:    ret void
;
  %1 = atomicrmw add i128* %src, i128 1 acquire
  call void @use.i128(i128 %1)
  ret void
}

; Note: no type, always legal
define void @test_fence() {
; CHECK-LABEL: @test_fence(
; CHECK:    fence acquire
; CHECK:    ret void
;
  fence acquire
  ret void
}

; Note: GenX intrinsics are expected to be legal, no check is present
define void @test_gen_intinsic() {
; CHECK-LABEL: @test_gen_intinsic(
; CHECK:    [[TMP1:%.*]] = call i4 @llvm.genx.GenISA.WaveShuffleIndex.i4(i4 3, i32 11, i32 13)
; CHECK:    [[TMP2:%.*]] = sext i4 [[TMP1]] to i8
; CHECK:    call void @use.i8(i8 [[TMP2]])
; CHECK:    ret void
;
  %1 = call i4 @llvm.genx.GenISA.WaveShuffleIndex.i4(i4 3, i32 11, i32 13)
  %2 = sext i4 %1 to i8
  call void @use.i8(i8 %2)
  ret void
}
declare i4 @llvm.genx.GenISA.WaveShuffleIndex.i4(i4, i32, i32)

; Note: Landing pad is not supported and treated as legal
define void @test_landingpad(i8* %src) personality i8* null {
; CHECK-LABEL: @test_landingpad(
; CHECK:    invoke void @foo()
; CHECK:    to label [[EXIT:%.*]] unwind label [[LPAD:%.*]]
; CHECK:       lpad:
; CHECK:    [[TMP1:%.*]] = landingpad { i8*, i4 }
; CHECK:    cleanup
; CHECK:    ret void
; CHECK:       exit:
; CHECK:    ret void
;
  invoke void @foo() to label %exit unwind label %lpad
lpad:
  %1 = landingpad { i8*, i4 } cleanup
  ret void
exit:
  ret void
}
declare void @foo()

; Note: Shuffle vector is not supported, illegal cases result in assert
define void @test_shuffle() {
; CHECK-LABEL: @test_shuffle(
; CHECK:    [[TMP1:%.*]] = shufflevector <3 x i8> <i8 1, i8 2, i8 3>, <3 x i8> <i8 4, i8 5, i8 6>, <2 x i32> <i32 0, i32 1>
; CHECK:    ret void
;
  %1 = shufflevector <3 x i8> <i8 1, i8 2, i8 3>, <3 x i8> <i8 4, i8 5, i8 6>, <2 x i32> <i32 0, i32 1>
  ret void
}

; Note: memtransfer intrinsic - always legal
define void @test_memcpy(i4* %src, i4* %dst) {
; CHECK-LABEL: @test_memcpy(
; CHECK:    call void @llvm.memcpy.p0i4.p0i4.i32(i4* [[SRC:%.*]], i4* [[DST:%.*]], i32 10, i1 false)
; CHECK:    ret void
;
  call void @llvm.memcpy.p0i4.p0i4.i32(i4* %src, i4* %dst, i32 10, i1 0)
  ret void
}
declare void @llvm.memcpy.p0i4.p0i4.i32(i4*, i4*, i32, i1)

; Note: mem intrinsic - always legal
define void @test_memset(i4* %dst) {
; CHECK-LABEL: @test_memset(
; CHECK:    call void @llvm.memset.p0i4.i32(i4* [[DST:%.*]], i8 3, i32 10, i1 false)
; CHECK:    ret void
;
  call void @llvm.memset.p0i4.i32(i4* %dst, i8 3, i32 10, i1 0)
  ret void
}
declare void @llvm.memset.p0i4.i32(i4*, i8, i32, i1)

; Note: VA intrinsics always legal, and have a checker in llvm
define void @test_va(i8* %src, i8* %dst) {
; CHECK-LABEL: @test_va(
; CHECK:    call void @llvm.va_start(i8* [[SRC:%.*]])
; CHECK:    call void @llvm.va_copy(i8* [[DST:%.*]], i8* [[SRC]])
; CHECK:    call void @llvm.va_end(i8* [[DST]])
; CHECK:    ret void
;
  call void @llvm.va_start(i8* %src)
  call void @llvm.va_copy(i8* %dst, i8* %src)
  call void @llvm.va_end(i8* %dst)
  ret void
}
declare void @llvm.va_start(i8*)
declare void @llvm.va_copy(i8*, i8*)
declare void @llvm.va_end(i8*)

declare void @use.i8(i8)
declare void @use.i128(i128)