File: vectors.ll

package info (click to toggle)
llvm-toolchain-19 1%3A19.1.7-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,998,520 kB
  • sloc: cpp: 6,951,680; ansic: 1,486,157; asm: 913,598; python: 232,024; f90: 80,126; objc: 75,281; lisp: 37,276; pascal: 16,990; sh: 10,009; ml: 5,058; perl: 4,724; awk: 3,523; makefile: 3,167; javascript: 2,504; xml: 892; fortran: 664; cs: 573
file content (146 lines) | stat: -rw-r--r-- 7,072 bytes parent folder | download | duplicates (6)
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
; RUN: opt -S -disable-output -passes="print<demanded-bits>" < %s 2>&1 | FileCheck %s

; CHECK-LABEL: Printing analysis 'Demanded Bits Analysis' for function 'test_basic':
; CHECK-DAG: DemandedBits: 0xff00 for   %x = or <2 x i32> %a, zeroinitializer
; CHECK-DAG: DemandedBits: 0xff00 for   %y = or <2 x i32> %b, zeroinitializer
; CHECK-DAG: DemandedBits: 0xff00 for   %z = or <2 x i32> %x, %y
; CHECK-DAG: DemandedBits: 0xff for   %u = lshr <2 x i32> %z, <i32 8, i32 8>
; CHECK-DAG: DemandedBits: 0xff for   %r = trunc <2 x i32> %u to <2 x i8>
define <2 x i8> @test_basic(<2 x i32> %a, <2 x i32> %b) {
  %x = or <2 x i32> %a, zeroinitializer
  %y = or <2 x i32> %b, zeroinitializer
  %z = or <2 x i32> %x, %y
  %u = lshr <2 x i32> %z, <i32 8, i32 8>
  %r = trunc <2 x i32> %u to <2 x i8>
  ret <2 x i8> %r
}

; Vector-specific instructions

; CHECK-LABEL: Printing analysis 'Demanded Bits Analysis' for function 'test_extractelement':
; CHECK-DAG: DemandedBits: 0xff for   %x = or <2 x i32> %a, zeroinitializer
; CHECK-DAG: DemandedBits: 0xf0 for   %z = extractelement <2 x i32> %x, i32 1
; CHECK-DAG: DemandedBits: 0xf for   %y = extractelement <2 x i32> %x, i32 0
; CHECK-DAG: DemandedBits: 0xffffffff for   %u = and i32 %y, 15
; CHECK-DAG: DemandedBits: 0xffffffff for   %v = and i32 %z, 240
; CHECK-DAG: DemandedBits: 0xffffffff for   %r = or i32 %u, %v
define i32 @test_extractelement(<2 x i32> %a) {
  %x = or <2 x i32> %a, zeroinitializer
  %y = extractelement <2 x i32> %x, i32 0
  %z = extractelement <2 x i32> %x, i32 1
  %u = and i32 %y, 15
  %v = and i32 %z, 240
  %r = or i32 %u, %v
  ret i32 %r
}

; CHECK-LABEL: Printing analysis 'Demanded Bits Analysis' for function 'test_insertelement':
; CHECK-DAG: DemandedBits: 0xff for   %x = or i32 %a, 0
; CHECK-DAG: DemandedBits: 0xff for   %y = or i32 %b, 0
; CHECK-DAG: DemandedBits: 0xff for   %z = insertelement <2 x i32> undef, i32 %x, i32 0
; CHECK-DAG: DemandedBits: 0xff for   %u = insertelement <2 x i32> %z, i32 %y, i32 1
; CHECK-DAG: DemandedBits: 0xffffffff for   %r = and <2 x i32> %u, <i32 255, i32 127>
define <2 x i32> @test_insertelement(i32 %a, i32 %b) {
  %x = or i32 %a, 0
  %y = or i32 %b, 0
  %z = insertelement <2 x i32> undef, i32 %x, i32 0
  %u = insertelement <2 x i32> %z, i32 %y, i32 1
  %r = and <2 x i32> %u, <i32 255, i32 127>
  ret <2 x i32> %r
}

; CHECK-LABEL: Printing analysis 'Demanded Bits Analysis' for function 'test_shufflevector':
; CHECK-DAG: DemandedBits: 0xff for   %x = or <2 x i32> %a, zeroinitializer
; CHECK-DAG: DemandedBits: 0xff for   %y = or <2 x i32> %b, zeroinitializer
; CHECK-DAG: DemandedBits: 0xff for   %z = shufflevector <2 x i32> %x, <2 x i32> %y, <3 x i32> <i32 0, i32 3, i32 1>
; CHECK-DAG: DemandedBits: 0xffffffff for   %r = and <3 x i32> %z, <i32 255, i32 127, i32 0>
define <3 x i32> @test_shufflevector(<2 x i32> %a, <2 x i32> %b) {
  %x = or <2 x i32> %a, zeroinitializer
  %y = or <2 x i32> %b, zeroinitializer
  %z = shufflevector <2 x i32> %x, <2 x i32> %y, <3 x i32> <i32 0, i32 3, i32 1>
  %r = and <3 x i32> %z, <i32 255, i32 127, i32 0>
  ret <3 x i32> %r
}

; Shifts with splat shift amounts

; CHECK-LABEL: Printing analysis 'Demanded Bits Analysis' for function 'test_shl':
; CHECK-DAG: DemandedBits: 0xf for   %x = or <2 x i32> %a, zeroinitializer
; CHECK-DAG: DemandedBits: 0xf0 for   %y = shl <2 x i32> %x, <i32 4, i32 4>
; CHECK-DAG: DemandedBits: 0xffffffff for   %r = and <2 x i32> %y, <i32 240, i32 240>
define <2 x i32> @test_shl(<2 x i32> %a) {
  %x = or <2 x i32> %a, zeroinitializer
  %y = shl <2 x i32> %x, <i32 4, i32 4>
  %r = and <2 x i32> %y, <i32 240, i32 240>
  ret <2 x i32> %r
}

; CHECK-LABEL: Printing analysis 'Demanded Bits Analysis' for function 'test_ashr':
; CHECK-DAG: DemandedBits: 0xf00 for   %x = or <2 x i32> %a, zeroinitializer
; CHECK-DAG: DemandedBits: 0xf0 for   %y = ashr <2 x i32> %x, <i32 4, i32 4>
; CHECK-DAG: DemandedBits: 0xffffffff for   %r = and <2 x i32> %y, <i32 240, i32 240>
define <2 x i32> @test_ashr(<2 x i32> %a) {
  %x = or <2 x i32> %a, zeroinitializer
  %y = ashr <2 x i32> %x, <i32 4, i32 4>
  %r = and <2 x i32> %y, <i32 240, i32 240>
  ret <2 x i32> %r
}

; CHECK-LABEL: Printing analysis 'Demanded Bits Analysis' for function 'test_lshr':
; CHECK-DAG: DemandedBits: 0xf00 for   %x = or <2 x i32> %a, zeroinitializer
; CHECK-DAG: DemandedBits: 0xf0 for   %y = lshr <2 x i32> %x, <i32 4, i32 4>
; CHECK-DAG: DemandedBits: 0xffffffff for   %r = and <2 x i32> %y, <i32 240, i32 240>
define <2 x i32> @test_lshr(<2 x i32> %a) {
  %x = or <2 x i32> %a, zeroinitializer
  %y = lshr <2 x i32> %x, <i32 4, i32 4>
  %r = and <2 x i32> %y, <i32 240, i32 240>
  ret <2 x i32> %r
}

declare <2 x i32> @llvm.fshl.i32(<2 x i32>, <2 x i32>, <2 x i32>)
declare <2 x i32> @llvm.fshr.i32(<2 x i32>, <2 x i32>, <2 x i32>)

; CHECK-LABEL: Printing analysis 'Demanded Bits Analysis' for function 'test_fshl':
; CHECK-DAG: DemandedBits: 0xf for   %x = or <2 x i32> %a, zeroinitializer
; CHECK-DAG: DemandedBits: 0xf0000000 for   %y = or <2 x i32> %b, zeroinitializer
; CHECK-DAG: DemandedBits: 0xff for   %z = call <2 x i32> @llvm.fshl.v2i32(<2 x i32> %x, <2 x i32> %y, <2 x i32> <i32 4, i32 4>)
; CHECK-DAG: DemandedBits: 0xffffffff for   %r = and <2 x i32> %z, <i32 255, i32 255>
define <2 x i32> @test_fshl(<2 x i32> %a, <2 x i32> %b) {
  %x = or <2 x i32> %a, zeroinitializer
  %y = or <2 x i32> %b, zeroinitializer
  %z = call <2 x i32> @llvm.fshl.i32(<2 x i32> %x, <2 x i32> %y, <2 x i32> <i32 4, i32 4>)
  %r = and <2 x i32> %z, <i32 255, i32 255>
  ret <2 x i32> %r
}

; CHECK-LABEL: Printing analysis 'Demanded Bits Analysis' for function 'test_fshr':
; CHECK-DAG: DemandedBits: 0xf for   %x = or <2 x i32> %a, zeroinitializer
; CHECK-DAG: DemandedBits: 0xf0000000 for   %y = or <2 x i32> %b, zeroinitializer
; CHECK-DAG: DemandedBits: 0xff for   %z = call <2 x i32> @llvm.fshr.v2i32(<2 x i32> %x, <2 x i32> %y, <2 x i32> <i32 28, i32 28>)
; CHECK-DAG: DemandedBits: 0xffffffff for   %r = and <2 x i32> %z, <i32 255, i32 255>
define <2 x i32> @test_fshr(<2 x i32> %a, <2 x i32> %b) {
  %x = or <2 x i32> %a, zeroinitializer
  %y = or <2 x i32> %b, zeroinitializer
  %z = call <2 x i32> @llvm.fshr.i32(<2 x i32> %x, <2 x i32> %y, <2 x i32> <i32 28, i32 28>)
  %r = and <2 x i32> %z, <i32 255, i32 255>
  ret <2 x i32> %r
}

; FP / Int conversion. These have different input / output types.

; CHECK-LABEL: Printing analysis 'Demanded Bits Analysis' for function 'test_uitofp':
; CHECK-DAG: DemandedBits: 0xffffffff for   %x = or <2 x i32> %a, zeroinitializer
define <2 x float> @test_uitofp(<2 x i32> %a) {
  %x = or <2 x i32> %a, zeroinitializer
  %r = uitofp <2 x i32> %x to <2 x float>
  ret <2 x float> %r
}

; CHECK-LABEL: Printing analysis 'Demanded Bits Analysis' for function 'test_fptoui':
; CHECK-DAG: DemandedBits: 0xffffffff for   %y = fptoui <2 x float> %x to <2 x i32>
define <2 x i32> @test_fptoui(<2 x float> %a) {
  %x = fadd <2 x float> %a, <float 1.0, float 1.0>
  %y = fptoui <2 x float> %x to <2 x i32>
  %r = and <2 x i32> %y, <i32 255, i32 255>
  ret <2 x i32> %y
}