Skip to content

Commit 67036ee

Browse files
committed
Fix check of noalias range
Switch from using range parsing was off and also didn't handle the wrapped range case
1 parent 96bcb08 commit 67036ee

File tree

2 files changed

+85
-17
lines changed

2 files changed

+85
-17
lines changed

llvm/lib/Target/AMDGPU/SIISelLowering.cpp

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16322,15 +16322,14 @@ static bool flatInstrMayAccessPrivate(const Instruction *I) {
1632216322
++I) {
1632316323
auto *Low = mdconst::extract<ConstantInt>(
1632416324
NoaliasAddrSpaceMD->getOperand(2 * I + 0));
16325-
auto *High = mdconst::extract<ConstantInt>(
16326-
NoaliasAddrSpaceMD->getOperand(2 * I + 1));
16327-
16328-
if (Low->getValue().uge(AMDGPUAS::PRIVATE_ADDRESS) &&
16329-
High->getValue().ult(AMDGPUAS::PRIVATE_ADDRESS))
16330-
return true;
16325+
if (Low->getValue().uge(AMDGPUAS::PRIVATE_ADDRESS)) {
16326+
auto *High = mdconst::extract<ConstantInt>(
16327+
NoaliasAddrSpaceMD->getOperand(2 * I + 1));
16328+
return High->getValue().ule(AMDGPUAS::PRIVATE_ADDRESS);
16329+
}
1633116330
}
1633216331

16333-
return false;
16332+
return true;
1633416333
}
1633516334

1633616335
TargetLowering::AtomicExpansionKind

llvm/test/Transforms/AtomicExpand/AMDGPU/expand-cmpxchg-flat-maybe-private.ll

Lines changed: 79 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -201,19 +201,19 @@ define { i64, i1 } @cmpxchg_flat_agent_i64__nolocal(ptr %ptr, i64 %val, i64 %swa
201201
; CHECK-NEXT: [[IS_PRIVATE:%.*]] = call i1 @llvm.amdgcn.is.private(ptr [[PTR]])
202202
; CHECK-NEXT: br i1 [[IS_PRIVATE]], label %[[ATOMICRMW_PRIVATE:.*]], label %[[ATOMICRMW_GLOBAL:.*]]
203203
; CHECK: [[ATOMICRMW_PRIVATE]]:
204-
; CHECK-NEXT: [[TMP3:%.*]] = addrspacecast ptr [[PTR]] to ptr addrspace(5)
205-
; CHECK-NEXT: [[TMP4:%.*]] = load i64, ptr addrspace(5) [[TMP3]], align 8
206-
; CHECK-NEXT: [[TMP5:%.*]] = icmp eq i64 [[TMP4]], [[VAL]]
207-
; CHECK-NEXT: [[TMP6:%.*]] = select i1 [[TMP5]], i64 [[SWAP]], i64 [[TMP4]]
208-
; CHECK-NEXT: store i64 [[TMP6]], ptr addrspace(5) [[TMP3]], align 8
209-
; CHECK-NEXT: [[TMP7:%.*]] = insertvalue { i64, i1 } poison, i64 [[TMP4]], 0
210-
; CHECK-NEXT: [[TMP8:%.*]] = insertvalue { i64, i1 } [[TMP7]], i1 [[TMP5]], 1
204+
; CHECK-NEXT: [[TMP1:%.*]] = addrspacecast ptr [[PTR]] to ptr addrspace(5)
205+
; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr addrspace(5) [[TMP1]], align 8
206+
; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i64 [[TMP2]], [[VAL]]
207+
; CHECK-NEXT: [[TMP4:%.*]] = select i1 [[TMP3]], i64 [[SWAP]], i64 [[TMP2]]
208+
; CHECK-NEXT: store i64 [[TMP4]], ptr addrspace(5) [[TMP1]], align 8
209+
; CHECK-NEXT: [[TMP5:%.*]] = insertvalue { i64, i1 } poison, i64 [[TMP2]], 0
210+
; CHECK-NEXT: [[TMP6:%.*]] = insertvalue { i64, i1 } [[TMP5]], i1 [[TMP3]], 1
211211
; CHECK-NEXT: br label %[[ATOMICRMW_PHI:.*]]
212212
; CHECK: [[ATOMICRMW_GLOBAL]]:
213-
; CHECK-NEXT: [[TMP9:%.*]] = cmpxchg ptr [[PTR]], i64 [[VAL]], i64 [[SWAP]] syncscope("agent") monotonic seq_cst, align 8, !noalias.addrspace [[META0]]
213+
; CHECK-NEXT: [[TMP7:%.*]] = cmpxchg ptr [[PTR]], i64 [[VAL]], i64 [[SWAP]] syncscope("agent") monotonic seq_cst, align 8, !noalias.addrspace [[META0]]
214214
; CHECK-NEXT: br label %[[ATOMICRMW_PHI]]
215215
; CHECK: [[ATOMICRMW_PHI]]:
216-
; CHECK-NEXT: [[RESULT:%.*]] = phi { i64, i1 } [ [[TMP8]], %[[ATOMICRMW_PRIVATE]] ], [ [[TMP9]], %[[ATOMICRMW_GLOBAL]] ]
216+
; CHECK-NEXT: [[RESULT:%.*]] = phi { i64, i1 } [ [[TMP6]], %[[ATOMICRMW_PRIVATE]] ], [ [[TMP7]], %[[ATOMICRMW_GLOBAL]] ]
217217
; CHECK-NEXT: br label %[[ATOMICRMW_END:.*]]
218218
; CHECK: [[ATOMICRMW_END]]:
219219
; CHECK-NEXT: ret { i64, i1 } [[RESULT]]
@@ -276,17 +276,86 @@ define { i64, i1 } @cmpxchg_flat_agent_i64_mmra_noprivate(ptr %ptr, i64 %val, i6
276276
ret { i64, i1 } %result
277277
}
278278

279+
; may alias private, wrapped range
280+
define { i64, i1 } @cmpxchg_flat_agent_i64__noalias_addrspace_edge_case0(ptr %ptr, i64 %val, i64 %swap) {
281+
; CHECK-LABEL: define { i64, i1 } @cmpxchg_flat_agent_i64__noalias_addrspace_edge_case0(
282+
; CHECK-SAME: ptr [[PTR:%.*]], i64 [[VAL:%.*]], i64 [[SWAP:%.*]]) {
283+
; CHECK-NEXT: [[IS_PRIVATE:%.*]] = call i1 @llvm.amdgcn.is.private(ptr [[PTR]])
284+
; CHECK-NEXT: br i1 [[IS_PRIVATE]], label %[[ATOMICRMW_PRIVATE:.*]], label %[[ATOMICRMW_GLOBAL:.*]]
285+
; CHECK: [[ATOMICRMW_PRIVATE]]:
286+
; CHECK-NEXT: [[TMP1:%.*]] = addrspacecast ptr [[PTR]] to ptr addrspace(5)
287+
; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr addrspace(5) [[TMP1]], align 8
288+
; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i64 [[TMP2]], [[VAL]]
289+
; CHECK-NEXT: [[TMP4:%.*]] = select i1 [[TMP3]], i64 [[SWAP]], i64 [[TMP2]]
290+
; CHECK-NEXT: store i64 [[TMP4]], ptr addrspace(5) [[TMP1]], align 8
291+
; CHECK-NEXT: [[TMP5:%.*]] = insertvalue { i64, i1 } poison, i64 [[TMP2]], 0
292+
; CHECK-NEXT: [[TMP6:%.*]] = insertvalue { i64, i1 } [[TMP5]], i1 [[TMP3]], 1
293+
; CHECK-NEXT: br label %[[ATOMICRMW_PHI:.*]]
294+
; CHECK: [[ATOMICRMW_GLOBAL]]:
295+
; CHECK-NEXT: [[TMP7:%.*]] = cmpxchg ptr [[PTR]], i64 [[VAL]], i64 [[SWAP]] syncscope("agent") monotonic seq_cst, align 8, !noalias.addrspace [[META0]]
296+
; CHECK-NEXT: br label %[[ATOMICRMW_PHI]]
297+
; CHECK: [[ATOMICRMW_PHI]]:
298+
; CHECK-NEXT: [[RESULT:%.*]] = phi { i64, i1 } [ [[TMP6]], %[[ATOMICRMW_PRIVATE]] ], [ [[TMP7]], %[[ATOMICRMW_GLOBAL]] ]
299+
; CHECK-NEXT: br label %[[ATOMICRMW_END:.*]]
300+
; CHECK: [[ATOMICRMW_END]]:
301+
; CHECK-NEXT: ret { i64, i1 } [[RESULT]]
302+
;
303+
%result = cmpxchg ptr %ptr, i64 %val, i64 %swap syncscope("agent") monotonic seq_cst, !noalias.addrspace !6
304+
ret { i64, i1 } %result
305+
}
306+
307+
; covers private case, but private isn't the low value.
308+
define { i64, i1 } @cmpxchg_flat_agent_i64__no_2_6(ptr %ptr, i64 %val, i64 %swap) {
309+
; CHECK-LABEL: define { i64, i1 } @cmpxchg_flat_agent_i64__no_2_6(
310+
; CHECK-SAME: ptr [[PTR:%.*]], i64 [[VAL:%.*]], i64 [[SWAP:%.*]]) {
311+
; CHECK-NEXT: [[IS_PRIVATE:%.*]] = call i1 @llvm.amdgcn.is.private(ptr [[PTR]])
312+
; CHECK-NEXT: br i1 [[IS_PRIVATE]], label %[[ATOMICRMW_PRIVATE:.*]], label %[[ATOMICRMW_GLOBAL:.*]]
313+
; CHECK: [[ATOMICRMW_PRIVATE]]:
314+
; CHECK-NEXT: [[TMP1:%.*]] = addrspacecast ptr [[PTR]] to ptr addrspace(5)
315+
; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr addrspace(5) [[TMP1]], align 8
316+
; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i64 [[TMP2]], [[VAL]]
317+
; CHECK-NEXT: [[TMP4:%.*]] = select i1 [[TMP3]], i64 [[SWAP]], i64 [[TMP2]]
318+
; CHECK-NEXT: store i64 [[TMP4]], ptr addrspace(5) [[TMP1]], align 8
319+
; CHECK-NEXT: [[TMP5:%.*]] = insertvalue { i64, i1 } poison, i64 [[TMP2]], 0
320+
; CHECK-NEXT: [[TMP6:%.*]] = insertvalue { i64, i1 } [[TMP5]], i1 [[TMP3]], 1
321+
; CHECK-NEXT: br label %[[ATOMICRMW_PHI:.*]]
322+
; CHECK: [[ATOMICRMW_GLOBAL]]:
323+
; CHECK-NEXT: [[TMP7:%.*]] = cmpxchg ptr [[PTR]], i64 [[VAL]], i64 [[SWAP]] syncscope("agent") monotonic seq_cst, align 8, !noalias.addrspace [[META0]]
324+
; CHECK-NEXT: br label %[[ATOMICRMW_PHI]]
325+
; CHECK: [[ATOMICRMW_PHI]]:
326+
; CHECK-NEXT: [[RESULT:%.*]] = phi { i64, i1 } [ [[TMP6]], %[[ATOMICRMW_PRIVATE]] ], [ [[TMP7]], %[[ATOMICRMW_GLOBAL]] ]
327+
; CHECK-NEXT: br label %[[ATOMICRMW_END:.*]]
328+
; CHECK: [[ATOMICRMW_END]]:
329+
; CHECK-NEXT: ret { i64, i1 } [[RESULT]]
330+
;
331+
%result = cmpxchg ptr %ptr, i64 %val, i64 %swap syncscope("agent") monotonic seq_cst, !noalias.addrspace !7
332+
ret { i64, i1 } %result
333+
}
334+
335+
define { i64, i1 } @cmpxchg_flat_agent_i64__no_2_3_5(ptr %ptr, i64 %val, i64 %swap) {
336+
; CHECK-LABEL: define { i64, i1 } @cmpxchg_flat_agent_i64__no_2_3_5(
337+
; CHECK-SAME: ptr [[PTR:%.*]], i64 [[VAL:%.*]], i64 [[SWAP:%.*]]) {
338+
; CHECK-NEXT: [[RESULT:%.*]] = cmpxchg ptr [[PTR]], i64 [[VAL]], i64 [[SWAP]] syncscope("agent") monotonic seq_cst, align 8, !noalias.addrspace [[META4:![0-9]+]]
339+
; CHECK-NEXT: ret { i64, i1 } [[RESULT]]
340+
;
341+
%result = cmpxchg ptr %ptr, i64 %val, i64 %swap syncscope("agent") monotonic seq_cst, !noalias.addrspace !8
342+
ret { i64, i1 } %result
343+
}
344+
279345
!0 = !{i32 5, i32 6}
280346
!1 = !{i32 3, i32 4}
281347
!2 = !{!"foo", !"bar"}
282348
!3 = !{!"bux", !"baz"}
283349
!4 = !{!2, !3}
284350
!5 = !{}
285-
351+
!6 = !{i32 6, i32 5}
352+
!7 = !{i32 2, i32 6}
353+
!8 = !{i32 2, i32 4, i32 5, i32 6}
286354

287355
;.
288356
; CHECK: [[META0]] = !{i32 5, i32 6}
289357
; CHECK: [[META1]] = !{[[META2:![0-9]+]], [[META3:![0-9]+]]}
290358
; CHECK: [[META2]] = !{!"foo", !"bar"}
291359
; CHECK: [[META3]] = !{!"bux", !"baz"}
360+
; CHECK: [[META4]] = !{i32 2, i32 4, i32 5, i32 6}
292361
;.

0 commit comments

Comments
 (0)