@@ -87,16 +87,21 @@ void test_s_barrier_signal()
87
87
88
88
// CHECK-LABEL: @test_s_barrier_signal_var(
89
89
// CHECK-NEXT: entry:
90
+ // CHECK-NEXT: [[BAR_ADDR:%.*]] = alloca ptr, align 8, addrspace(5)
90
91
// CHECK-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4, addrspace(5)
92
+ // CHECK-NEXT: [[BAR_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[BAR_ADDR]] to ptr
91
93
// CHECK-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[A_ADDR]] to ptr
94
+ // CHECK-NEXT: store ptr [[BAR:%.*]], ptr [[BAR_ADDR_ASCAST]], align 8
92
95
// CHECK-NEXT: store i32 [[A:%.*]], ptr [[A_ADDR_ASCAST]], align 4
93
- // CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR_ASCAST]], align 4
94
- // CHECK-NEXT: call void @llvm.amdgcn.s.barrier.signal.var(i32 [[TMP0]])
96
+ // CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[BAR_ADDR_ASCAST]], align 8
97
+ // CHECK-NEXT: [[TMP1:%.*]] = addrspacecast ptr [[TMP0]] to ptr addrspace(3)
98
+ // CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[A_ADDR_ASCAST]], align 4
99
+ // CHECK-NEXT: call void @llvm.amdgcn.s.barrier.signal.var(ptr addrspace(3) [[TMP1]], i32 [[TMP2]])
95
100
// CHECK-NEXT: ret void
96
101
//
97
- void test_s_barrier_signal_var (int a )
102
+ void test_s_barrier_signal_var (void * bar , int a )
98
103
{
99
- __builtin_amdgcn_s_barrier_signal_var (a );
104
+ __builtin_amdgcn_s_barrier_signal_var (bar , a );
100
105
}
101
106
102
107
// CHECK-LABEL: @test_s_barrier_signal_isfirst(
@@ -134,110 +139,63 @@ void test_s_barrier_signal_isfirst(int* a, int* b, int *c)
134
139
__builtin_amdgcn_s_barrier_wait (1 );
135
140
}
136
141
137
- // CHECK-LABEL: @test_s_barrier_isfirst_var(
138
- // CHECK-NEXT: entry:
139
- // CHECK-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 8, addrspace(5)
140
- // CHECK-NEXT: [[B_ADDR:%.*]] = alloca ptr, align 8, addrspace(5)
141
- // CHECK-NEXT: [[C_ADDR:%.*]] = alloca ptr, align 8, addrspace(5)
142
- // CHECK-NEXT: [[D_ADDR:%.*]] = alloca i32, align 4, addrspace(5)
143
- // CHECK-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[A_ADDR]] to ptr
144
- // CHECK-NEXT: [[B_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[B_ADDR]] to ptr
145
- // CHECK-NEXT: [[C_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[C_ADDR]] to ptr
146
- // CHECK-NEXT: [[D_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[D_ADDR]] to ptr
147
- // CHECK-NEXT: store ptr [[A:%.*]], ptr [[A_ADDR_ASCAST]], align 8
148
- // CHECK-NEXT: store ptr [[B:%.*]], ptr [[B_ADDR_ASCAST]], align 8
149
- // CHECK-NEXT: store ptr [[C:%.*]], ptr [[C_ADDR_ASCAST]], align 8
150
- // CHECK-NEXT: store i32 [[D:%.*]], ptr [[D_ADDR_ASCAST]], align 4
151
- // CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[D_ADDR_ASCAST]], align 4
152
- // CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.amdgcn.s.barrier.signal.isfirst.var(i32 [[TMP0]])
153
- // CHECK-NEXT: br i1 [[TMP1]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
154
- // CHECK: if.then:
155
- // CHECK-NEXT: [[TMP2:%.*]] = load ptr, ptr [[B_ADDR_ASCAST]], align 8
156
- // CHECK-NEXT: store ptr [[TMP2]], ptr [[A_ADDR_ASCAST]], align 8
157
- // CHECK-NEXT: br label [[IF_END:%.*]]
158
- // CHECK: if.else:
159
- // CHECK-NEXT: [[TMP3:%.*]] = load ptr, ptr [[C_ADDR_ASCAST]], align 8
160
- // CHECK-NEXT: store ptr [[TMP3]], ptr [[A_ADDR_ASCAST]], align 8
161
- // CHECK-NEXT: br label [[IF_END]]
162
- // CHECK: if.end:
163
- // CHECK-NEXT: call void @llvm.amdgcn.s.barrier.wait(i16 1)
164
- // CHECK-NEXT: ret void
165
- //
166
- void test_s_barrier_isfirst_var (int * a , int * b , int * c , int d )
167
- {
168
- if ( __builtin_amdgcn_s_barrier_signal_isfirst_var (d ))
169
- a = b ;
170
- else
171
- a = c ;
172
-
173
- __builtin_amdgcn_s_barrier_wait (1 );
174
-
175
- }
176
-
177
142
// CHECK-LABEL: @test_s_barrier_init(
178
143
// CHECK-NEXT: entry:
144
+ // CHECK-NEXT: [[BAR_ADDR:%.*]] = alloca ptr, align 8, addrspace(5)
179
145
// CHECK-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4, addrspace(5)
146
+ // CHECK-NEXT: [[BAR_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[BAR_ADDR]] to ptr
180
147
// CHECK-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[A_ADDR]] to ptr
148
+ // CHECK-NEXT: store ptr [[BAR:%.*]], ptr [[BAR_ADDR_ASCAST]], align 8
181
149
// CHECK-NEXT: store i32 [[A:%.*]], ptr [[A_ADDR_ASCAST]], align 4
182
- // CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[A_ADDR_ASCAST]], align 4
183
- // CHECK-NEXT: call void @llvm.amdgcn.s.barrier.init(i32 1, i32 [[TMP0]])
150
+ // CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[BAR_ADDR_ASCAST]], align 8
151
+ // CHECK-NEXT: [[TMP1:%.*]] = addrspacecast ptr [[TMP0]] to ptr addrspace(3)
152
+ // CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[A_ADDR_ASCAST]], align 4
153
+ // CHECK-NEXT: call void @llvm.amdgcn.s.barrier.init(ptr addrspace(3) [[TMP1]], i32 [[TMP2]])
184
154
// CHECK-NEXT: ret void
185
155
//
186
- void test_s_barrier_init (int a )
156
+ void test_s_barrier_init (void * bar , int a )
187
157
{
188
- __builtin_amdgcn_s_barrier_init (1 , a );
158
+ __builtin_amdgcn_s_barrier_init (bar , a );
189
159
}
190
160
191
161
// CHECK-LABEL: @test_s_barrier_join(
192
162
// CHECK-NEXT: entry:
193
- // CHECK-NEXT: call void @llvm.amdgcn.s.barrier.join(i32 1)
163
+ // CHECK-NEXT: [[BAR_ADDR:%.*]] = alloca ptr, align 8, addrspace(5)
164
+ // CHECK-NEXT: [[BAR_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[BAR_ADDR]] to ptr
165
+ // CHECK-NEXT: store ptr [[BAR:%.*]], ptr [[BAR_ADDR_ASCAST]], align 8
166
+ // CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[BAR_ADDR_ASCAST]], align 8
167
+ // CHECK-NEXT: [[TMP1:%.*]] = addrspacecast ptr [[TMP0]] to ptr addrspace(3)
168
+ // CHECK-NEXT: call void @llvm.amdgcn.s.barrier.join(ptr addrspace(3) [[TMP1]])
194
169
// CHECK-NEXT: ret void
195
170
//
196
- void test_s_barrier_join ()
171
+ void test_s_barrier_join (void * bar )
197
172
{
198
- __builtin_amdgcn_s_barrier_join (1 );
173
+ __builtin_amdgcn_s_barrier_join (bar );
199
174
}
200
175
201
176
// CHECK-LABEL: @test_s_wakeup_barrier(
202
177
// CHECK-NEXT: entry:
203
- // CHECK-NEXT: call void @llvm.amdgcn.s.barrier.join(i32 1)
178
+ // CHECK-NEXT: [[BAR_ADDR:%.*]] = alloca ptr, align 8, addrspace(5)
179
+ // CHECK-NEXT: [[BAR_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[BAR_ADDR]] to ptr
180
+ // CHECK-NEXT: store ptr [[BAR:%.*]], ptr [[BAR_ADDR_ASCAST]], align 8
181
+ // CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[BAR_ADDR_ASCAST]], align 8
182
+ // CHECK-NEXT: [[TMP1:%.*]] = addrspacecast ptr [[TMP0]] to ptr addrspace(3)
183
+ // CHECK-NEXT: call void @llvm.amdgcn.s.wakeup.barrier(ptr addrspace(3) [[TMP1]])
204
184
// CHECK-NEXT: ret void
205
185
//
206
- void test_s_wakeup_barrier ()
186
+ void test_s_wakeup_barrier (void * bar )
207
187
{
208
- __builtin_amdgcn_s_barrier_join ( 1 );
188
+ __builtin_amdgcn_s_wakeup_barrier ( bar );
209
189
}
210
190
211
191
// CHECK-LABEL: @test_s_barrier_leave(
212
192
// CHECK-NEXT: entry:
213
- // CHECK-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 8, addrspace(5)
214
- // CHECK-NEXT: [[B_ADDR:%.*]] = alloca ptr, align 8, addrspace(5)
215
- // CHECK-NEXT: [[C_ADDR:%.*]] = alloca ptr, align 8, addrspace(5)
216
- // CHECK-NEXT: [[A_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[A_ADDR]] to ptr
217
- // CHECK-NEXT: [[B_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[B_ADDR]] to ptr
218
- // CHECK-NEXT: [[C_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[C_ADDR]] to ptr
219
- // CHECK-NEXT: store ptr [[A:%.*]], ptr [[A_ADDR_ASCAST]], align 8
220
- // CHECK-NEXT: store ptr [[B:%.*]], ptr [[B_ADDR_ASCAST]], align 8
221
- // CHECK-NEXT: store ptr [[C:%.*]], ptr [[C_ADDR_ASCAST]], align 8
222
- // CHECK-NEXT: [[TMP0:%.*]] = call i1 @llvm.amdgcn.s.barrier.leave()
223
- // CHECK-NEXT: br i1 [[TMP0]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
224
- // CHECK: if.then:
225
- // CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[B_ADDR_ASCAST]], align 8
226
- // CHECK-NEXT: store ptr [[TMP1]], ptr [[A_ADDR_ASCAST]], align 8
227
- // CHECK-NEXT: br label [[IF_END:%.*]]
228
- // CHECK: if.else:
229
- // CHECK-NEXT: [[TMP2:%.*]] = load ptr, ptr [[C_ADDR_ASCAST]], align 8
230
- // CHECK-NEXT: store ptr [[TMP2]], ptr [[A_ADDR_ASCAST]], align 8
231
- // CHECK-NEXT: br label [[IF_END]]
232
- // CHECK: if.end:
193
+ // CHECK-NEXT: call void @llvm.amdgcn.s.barrier.leave(i16 1)
233
194
// CHECK-NEXT: ret void
234
195
//
235
- void test_s_barrier_leave (int * a , int * b , int * c )
196
+ void test_s_barrier_leave ()
236
197
{
237
- if (__builtin_amdgcn_s_barrier_leave ())
238
- a = b ;
239
- else
240
- a = c ;
198
+ __builtin_amdgcn_s_barrier_leave (1 );
241
199
}
242
200
243
201
// CHECK-LABEL: @test_s_get_barrier_state(
@@ -261,6 +219,28 @@ unsigned test_s_get_barrier_state(int a)
261
219
return State ;
262
220
}
263
221
222
+ // CHECK-LABEL: @test_s_get_named_barrier_state(
223
+ // CHECK-NEXT: entry:
224
+ // CHECK-NEXT: [[RETVAL:%.*]] = alloca i32, align 4, addrspace(5)
225
+ // CHECK-NEXT: [[BAR_ADDR:%.*]] = alloca ptr, align 8, addrspace(5)
226
+ // CHECK-NEXT: [[STATE:%.*]] = alloca i32, align 4, addrspace(5)
227
+ // CHECK-NEXT: [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr
228
+ // CHECK-NEXT: [[BAR_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[BAR_ADDR]] to ptr
229
+ // CHECK-NEXT: [[STATE_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[STATE]] to ptr
230
+ // CHECK-NEXT: store ptr [[BAR:%.*]], ptr [[BAR_ADDR_ASCAST]], align 8
231
+ // CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[BAR_ADDR_ASCAST]], align 8
232
+ // CHECK-NEXT: [[TMP1:%.*]] = addrspacecast ptr [[TMP0]] to ptr addrspace(3)
233
+ // CHECK-NEXT: [[TMP2:%.*]] = call i32 @llvm.amdgcn.s.get.named.barrier.state(ptr addrspace(3) [[TMP1]])
234
+ // CHECK-NEXT: store i32 [[TMP2]], ptr [[STATE_ASCAST]], align 4
235
+ // CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[STATE_ASCAST]], align 4
236
+ // CHECK-NEXT: ret i32 [[TMP3]]
237
+ //
238
+ unsigned test_s_get_named_barrier_state (void * bar )
239
+ {
240
+ unsigned State = __builtin_amdgcn_s_get_named_barrier_state (bar );
241
+ return State ;
242
+ }
243
+
264
244
// CHECK-LABEL: @test_s_ttracedata(
265
245
// CHECK-NEXT: entry:
266
246
// CHECK-NEXT: call void @llvm.amdgcn.s.ttracedata(i32 1)
0 commit comments