@@ -87,16 +87,21 @@ void test_s_barrier_signal()
8787
8888// CHECK-LABEL: @test_s_barrier_signal_var(
8989// CHECK-NEXT: entry:
90+ // CHECK-NEXT: [[BAR_ADDR:%.*]] = alloca ptr, align 8, addrspace(5)
9091// CHECK-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4, addrspace(5)
92+ // CHECK-NEXT: [[BAR_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[BAR_ADDR]] to ptr
9193// 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
9295// 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]])
95100// CHECK-NEXT: ret void
96101//
97- void test_s_barrier_signal_var (int a )
102+ void test_s_barrier_signal_var (void * bar , int a )
98103{
99- __builtin_amdgcn_s_barrier_signal_var (a );
104+ __builtin_amdgcn_s_barrier_signal_var (bar , a );
100105}
101106
102107// CHECK-LABEL: @test_s_barrier_signal_isfirst(
@@ -134,110 +139,63 @@ void test_s_barrier_signal_isfirst(int* a, int* b, int *c)
134139 __builtin_amdgcn_s_barrier_wait (1 );
135140}
136141
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-
177142// CHECK-LABEL: @test_s_barrier_init(
178143// CHECK-NEXT: entry:
144+ // CHECK-NEXT: [[BAR_ADDR:%.*]] = alloca ptr, align 8, addrspace(5)
179145// CHECK-NEXT: [[A_ADDR:%.*]] = alloca i32, align 4, addrspace(5)
146+ // CHECK-NEXT: [[BAR_ADDR_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[BAR_ADDR]] to ptr
180147// 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
181149// 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]])
184154// CHECK-NEXT: ret void
185155//
186- void test_s_barrier_init (int a )
156+ void test_s_barrier_init (void * bar , int a )
187157{
188- __builtin_amdgcn_s_barrier_init (1 , a );
158+ __builtin_amdgcn_s_barrier_init (bar , a );
189159}
190160
191161// CHECK-LABEL: @test_s_barrier_join(
192162// 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]])
194169// CHECK-NEXT: ret void
195170//
196- void test_s_barrier_join ()
171+ void test_s_barrier_join (void * bar )
197172{
198- __builtin_amdgcn_s_barrier_join (1 );
173+ __builtin_amdgcn_s_barrier_join (bar );
199174}
200175
201176// CHECK-LABEL: @test_s_wakeup_barrier(
202177// 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]])
204184// CHECK-NEXT: ret void
205185//
206- void test_s_wakeup_barrier ()
186+ void test_s_wakeup_barrier (void * bar )
207187{
208- __builtin_amdgcn_s_barrier_join ( 1 );
188+ __builtin_amdgcn_s_wakeup_barrier ( bar );
209189}
210190
211191// CHECK-LABEL: @test_s_barrier_leave(
212192// 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)
233194// CHECK-NEXT: ret void
234195//
235- void test_s_barrier_leave (int * a , int * b , int * c )
196+ void test_s_barrier_leave ()
236197{
237- if (__builtin_amdgcn_s_barrier_leave ())
238- a = b ;
239- else
240- a = c ;
198+ __builtin_amdgcn_s_barrier_leave (1 );
241199}
242200
243201// CHECK-LABEL: @test_s_get_barrier_state(
@@ -261,6 +219,28 @@ unsigned test_s_get_barrier_state(int a)
261219 return State ;
262220}
263221
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+
264244// CHECK-LABEL: @test_s_ttracedata(
265245// CHECK-NEXT: entry:
266246// CHECK-NEXT: call void @llvm.amdgcn.s.ttracedata(i32 1)
0 commit comments