~pali/+junk/llvm-toolchain-3.7

« back to all changes in this revision

Viewing changes to test/CodeGen/AMDGPU/min.ll

  • Committer: Package Import Robot
  • Author(s): Sylvestre Ledru
  • Date: 2015-07-15 17:51:08 UTC
  • Revision ID: package-import@ubuntu.com-20150715175108-l8mynwovkx4zx697
Tags: upstream-3.7~+rc2
ImportĀ upstreamĀ versionĀ 3.7~+rc2

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
; RUN: llc -march=amdgcn -mcpu=SI < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s
 
2
 
 
3
declare i32 @llvm.r600.read.tidig.x() nounwind readnone
 
4
 
 
5
; FUNC-LABEL: @v_test_imin_sle_i32
 
6
; SI: v_min_i32_e32
 
7
define void @v_test_imin_sle_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %aptr, i32 addrspace(1)* %bptr) nounwind {
 
8
  %tid = call i32 @llvm.r600.read.tidig.x() nounwind readnone
 
9
  %gep0 = getelementptr i32, i32 addrspace(1)* %aptr, i32 %tid
 
10
  %gep1 = getelementptr i32, i32 addrspace(1)* %bptr, i32 %tid
 
11
  %outgep = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
 
12
  %a = load i32, i32 addrspace(1)* %gep0, align 4
 
13
  %b = load i32, i32 addrspace(1)* %gep1, align 4
 
14
  %cmp = icmp sle i32 %a, %b
 
15
  %val = select i1 %cmp, i32 %a, i32 %b
 
16
  store i32 %val, i32 addrspace(1)* %outgep, align 4
 
17
  ret void
 
18
}
 
19
 
 
20
; FUNC-LABEL: @s_test_imin_sle_i32
 
21
; SI: s_min_i32
 
22
define void @s_test_imin_sle_i32(i32 addrspace(1)* %out, i32 %a, i32 %b) nounwind {
 
23
  %cmp = icmp sle i32 %a, %b
 
24
  %val = select i1 %cmp, i32 %a, i32 %b
 
25
  store i32 %val, i32 addrspace(1)* %out, align 4
 
26
  ret void
 
27
}
 
28
 
 
29
; FUNC-LABEL: @v_test_imin_slt_i32
 
30
; SI: v_min_i32_e32
 
31
define void @v_test_imin_slt_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %aptr, i32 addrspace(1)* %bptr) nounwind {
 
32
  %tid = call i32 @llvm.r600.read.tidig.x() nounwind readnone
 
33
  %gep0 = getelementptr i32, i32 addrspace(1)* %aptr, i32 %tid
 
34
  %gep1 = getelementptr i32, i32 addrspace(1)* %bptr, i32 %tid
 
35
  %outgep = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
 
36
  %a = load i32, i32 addrspace(1)* %gep0, align 4
 
37
  %b = load i32, i32 addrspace(1)* %gep1, align 4
 
38
  %cmp = icmp slt i32 %a, %b
 
39
  %val = select i1 %cmp, i32 %a, i32 %b
 
40
  store i32 %val, i32 addrspace(1)* %outgep, align 4
 
41
  ret void
 
42
}
 
43
 
 
44
; FUNC-LABEL: @s_test_imin_slt_i32
 
45
; SI: s_min_i32
 
46
define void @s_test_imin_slt_i32(i32 addrspace(1)* %out, i32 %a, i32 %b) nounwind {
 
47
  %cmp = icmp slt i32 %a, %b
 
48
  %val = select i1 %cmp, i32 %a, i32 %b
 
49
  store i32 %val, i32 addrspace(1)* %out, align 4
 
50
  ret void
 
51
}
 
52
 
 
53
; FUNC-LABEL: {{^}}s_test_imin_slt_imm_i32:
 
54
; SI: s_min_i32 {{s[0-9]+}}, {{s[0-9]+}}, 8
 
55
define void @s_test_imin_slt_imm_i32(i32 addrspace(1)* %out, i32 %a) nounwind {
 
56
  %cmp = icmp slt i32 %a, 8
 
57
  %val = select i1 %cmp, i32 %a, i32 8
 
58
  store i32 %val, i32 addrspace(1)* %out, align 4
 
59
  ret void
 
60
}
 
61
 
 
62
; FUNC-LABEL: {{^}}s_test_imin_sle_imm_i32:
 
63
; SI: s_min_i32 {{s[0-9]+}}, {{s[0-9]+}}, 8
 
64
define void @s_test_imin_sle_imm_i32(i32 addrspace(1)* %out, i32 %a) nounwind {
 
65
  %cmp = icmp sle i32 %a, 8
 
66
  %val = select i1 %cmp, i32 %a, i32 8
 
67
  store i32 %val, i32 addrspace(1)* %out, align 4
 
68
  ret void
 
69
}
 
70
 
 
71
; FUNC-LABEL: @v_test_umin_ule_i32
 
72
; SI: v_min_u32_e32
 
73
define void @v_test_umin_ule_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %aptr, i32 addrspace(1)* %bptr) nounwind {
 
74
  %tid = call i32 @llvm.r600.read.tidig.x() nounwind readnone
 
75
  %gep0 = getelementptr i32, i32 addrspace(1)* %aptr, i32 %tid
 
76
  %gep1 = getelementptr i32, i32 addrspace(1)* %bptr, i32 %tid
 
77
  %outgep = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
 
78
  %a = load i32, i32 addrspace(1)* %gep0, align 4
 
79
  %b = load i32, i32 addrspace(1)* %gep1, align 4
 
80
  %cmp = icmp ule i32 %a, %b
 
81
  %val = select i1 %cmp, i32 %a, i32 %b
 
82
  store i32 %val, i32 addrspace(1)* %outgep, align 4
 
83
  ret void
 
84
}
 
85
 
 
86
; FUNC-LABEL: @s_test_umin_ule_i32
 
87
; SI: s_min_u32
 
88
define void @s_test_umin_ule_i32(i32 addrspace(1)* %out, i32 %a, i32 %b) nounwind {
 
89
  %cmp = icmp ule i32 %a, %b
 
90
  %val = select i1 %cmp, i32 %a, i32 %b
 
91
  store i32 %val, i32 addrspace(1)* %out, align 4
 
92
  ret void
 
93
}
 
94
 
 
95
; FUNC-LABEL: @v_test_umin_ult_i32
 
96
; SI: v_min_u32_e32
 
97
define void @v_test_umin_ult_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %aptr, i32 addrspace(1)* %bptr) nounwind {
 
98
  %tid = call i32 @llvm.r600.read.tidig.x() nounwind readnone
 
99
  %gep0 = getelementptr i32, i32 addrspace(1)* %aptr, i32 %tid
 
100
  %gep1 = getelementptr i32, i32 addrspace(1)* %bptr, i32 %tid
 
101
  %outgep = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
 
102
  %a = load i32, i32 addrspace(1)* %gep0, align 4
 
103
  %b = load i32, i32 addrspace(1)* %gep1, align 4
 
104
  %cmp = icmp ult i32 %a, %b
 
105
  %val = select i1 %cmp, i32 %a, i32 %b
 
106
  store i32 %val, i32 addrspace(1)* %outgep, align 4
 
107
  ret void
 
108
}
 
109
 
 
110
; FUNC-LABEL: @s_test_umin_ult_i32
 
111
; SI: s_min_u32
 
112
define void @s_test_umin_ult_i32(i32 addrspace(1)* %out, i32 %a, i32 %b) nounwind {
 
113
  %cmp = icmp ult i32 %a, %b
 
114
  %val = select i1 %cmp, i32 %a, i32 %b
 
115
  store i32 %val, i32 addrspace(1)* %out, align 4
 
116
  ret void
 
117
}
 
118
 
 
119
; FUNC-LABEL: @v_test_umin_ult_i32_multi_use
 
120
; SI-NOT: v_min
 
121
; SI: v_cmp_lt_u32
 
122
; SI-NEXT: v_cndmask_b32
 
123
; SI-NOT: v_min
 
124
; SI: s_endpgm
 
125
define void @v_test_umin_ult_i32_multi_use(i32 addrspace(1)* %out0, i1 addrspace(1)* %out1, i32 addrspace(1)* %aptr, i32 addrspace(1)* %bptr) nounwind {
 
126
  %tid = call i32 @llvm.r600.read.tidig.x() nounwind readnone
 
127
  %gep0 = getelementptr i32, i32 addrspace(1)* %aptr, i32 %tid
 
128
  %gep1 = getelementptr i32, i32 addrspace(1)* %bptr, i32 %tid
 
129
  %outgep0 = getelementptr i32, i32 addrspace(1)* %out0, i32 %tid
 
130
  %outgep1 = getelementptr i1, i1 addrspace(1)* %out1, i32 %tid
 
131
  %a = load i32, i32 addrspace(1)* %gep0, align 4
 
132
  %b = load i32, i32 addrspace(1)* %gep1, align 4
 
133
  %cmp = icmp ult i32 %a, %b
 
134
  %val = select i1 %cmp, i32 %a, i32 %b
 
135
  store i32 %val, i32 addrspace(1)* %outgep0, align 4
 
136
  store i1 %cmp, i1 addrspace(1)* %outgep1
 
137
  ret void
 
138
}
 
139
 
 
140
; Make sure redundant and removed
 
141
; FUNC-LABEL: {{^}}simplify_demanded_bits_test_umin_ult_i16:
 
142
; SI-DAG: s_load_dword [[A:s[0-9]+]], {{s\[[0-9]+:[0-9]+\]}}, 0xb
 
143
; SI-DAG: s_load_dword [[B:s[0-9]+]], {{s\[[0-9]+:[0-9]+\]}}, 0xc
 
144
; SI: s_min_u32 [[MIN:s[0-9]+]], [[A]], [[B]]
 
145
; SI-NEXT: v_mov_b32_e32 [[VMIN:v[0-9]+]], [[MIN]]
 
146
; SI-NEXT: buffer_store_dword [[VMIN]]
 
147
define void @simplify_demanded_bits_test_umin_ult_i16(i32 addrspace(1)* %out, i16 zeroext %a, i16 zeroext %b) nounwind {
 
148
  %a.ext = zext i16 %a to i32
 
149
  %b.ext = zext i16 %b to i32
 
150
  %cmp = icmp ult i32 %a.ext, %b.ext
 
151
  %val = select i1 %cmp, i32 %a.ext, i32 %b.ext
 
152
  %mask = and i32 %val, 65535
 
153
  store i32 %mask, i32 addrspace(1)* %out
 
154
  ret void
 
155
}
 
156
 
 
157
; Make sure redundant sign_extend_inreg removed.
 
158
 
 
159
; FUNC-LABEL: {{^}}simplify_demanded_bits_test_min_slt_i16:
 
160
; SI-DAG: s_load_dword [[A:s[0-9]+]], {{s\[[0-9]+:[0-9]+\]}}, 0xb
 
161
; SI-DAG: s_load_dword [[B:s[0-9]+]], {{s\[[0-9]+:[0-9]+\]}}, 0xc
 
162
; SI: s_min_i32 [[MIN:s[0-9]+]], [[A]], [[B]]
 
163
; SI-NEXT: v_mov_b32_e32 [[VMIN:v[0-9]+]], [[MIN]]
 
164
; SI-NEXT: buffer_store_dword [[VMIN]]
 
165
define void @simplify_demanded_bits_test_min_slt_i16(i32 addrspace(1)* %out, i16 signext %a, i16 signext %b) nounwind {
 
166
  %a.ext = sext i16 %a to i32
 
167
  %b.ext = sext i16 %b to i32
 
168
  %cmp = icmp slt i32 %a.ext, %b.ext
 
169
  %val = select i1 %cmp, i32 %a.ext, i32 %b.ext
 
170
  %shl = shl i32 %val, 16
 
171
  %sextinreg = ashr i32 %shl, 16
 
172
  store i32 %sextinreg, i32 addrspace(1)* %out
 
173
  ret void
 
174
}
 
175
 
 
176
; FIXME: Should get match min/max through extends inserted by
 
177
; legalization.
 
178
 
 
179
; FUNC-LABEL: {{^}}s_test_imin_sle_i16:
 
180
; SI: s_sext_i32_i16
 
181
; SI: s_sext_i32_i16
 
182
; SI: v_cmp_le_i32_e32
 
183
; SI: v_cndmask_b32
 
184
define void @s_test_imin_sle_i16(i16 addrspace(1)* %out, i16 %a, i16 %b) nounwind {
 
185
  %cmp = icmp sle i16 %a, %b
 
186
  %val = select i1 %cmp, i16 %a, i16 %b
 
187
  store i16 %val, i16 addrspace(1)* %out
 
188
  ret void
 
189
}