Skip to content

Commit 0648412

Browse files
arsenmtru
authored andcommitted
InferAddressSpaces: Fix mishandling stores of pointers to themselves (llvm#101877)
(cherry picked from commit 3c483b8)
1 parent 1069d16 commit 0648412

File tree

2 files changed

+72
-1
lines changed

2 files changed

+72
-1
lines changed

llvm/lib/Transforms/Scalar/InferAddressSpaces.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1233,7 +1233,7 @@ bool InferAddressSpacesImpl::rewriteWithNewAddressSpaces(
12331233
// If V is used as the pointer operand of a compatible memory operation,
12341234
// sets the pointer operand to NewV. This replacement does not change
12351235
// the element type, so the resultant load/store is still valid.
1236-
CurUser->replaceUsesOfWith(V, NewV);
1236+
U.set(NewV);
12371237
continue;
12381238
}
12391239

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2+
; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -passes=infer-address-spaces %s | FileCheck %s
3+
4+
; Make sure memory instructions where the pointer appears in both a
5+
; pointer and value operand work correctly.
6+
7+
declare void @user(ptr)
8+
9+
; Make sure only the pointer operand use of the store is replaced
10+
define void @store_flat_pointer_to_self() {
11+
; CHECK-LABEL: define void @store_flat_pointer_to_self() {
12+
; CHECK-NEXT: [[ALLOCA:%.*]] = alloca ptr, align 8, addrspace(5)
13+
; CHECK-NEXT: [[FLAT:%.*]] = addrspacecast ptr addrspace(5) [[ALLOCA]] to ptr
14+
; CHECK-NEXT: store ptr [[FLAT]], ptr addrspace(5) [[ALLOCA]], align 8
15+
; CHECK-NEXT: call void @user(ptr [[FLAT]])
16+
; CHECK-NEXT: ret void
17+
;
18+
%alloca = alloca ptr, align 8, addrspace(5)
19+
%flat = addrspacecast ptr addrspace(5) %alloca to ptr
20+
store ptr %flat, ptr %flat, align 8
21+
call void @user(ptr %flat)
22+
ret void
23+
}
24+
25+
; FIXME: Should be able to optimize the pointer operand to flat.
26+
define ptr @atomicrmw_xchg_flat_pointer_to_self() {
27+
; CHECK-LABEL: define ptr @atomicrmw_xchg_flat_pointer_to_self() {
28+
; CHECK-NEXT: [[ALLOCA:%.*]] = alloca ptr, align 8, addrspace(5)
29+
; CHECK-NEXT: [[FLAT:%.*]] = addrspacecast ptr addrspace(5) [[ALLOCA]] to ptr
30+
; CHECK-NEXT: [[XCHG:%.*]] = atomicrmw xchg ptr [[FLAT]], ptr [[FLAT]] seq_cst, align 8
31+
; CHECK-NEXT: call void @user(ptr [[FLAT]])
32+
; CHECK-NEXT: ret ptr [[XCHG]]
33+
;
34+
%alloca = alloca ptr, align 8, addrspace(5)
35+
%flat = addrspacecast ptr addrspace(5) %alloca to ptr
36+
%xchg = atomicrmw xchg ptr %flat, ptr %flat seq_cst, align 8
37+
call void @user(ptr %flat)
38+
ret ptr %xchg
39+
}
40+
41+
define { ptr, i1 } @cmpxchg_flat_pointer_new_to_self(ptr %cmp) {
42+
; CHECK-LABEL: define { ptr, i1 } @cmpxchg_flat_pointer_new_to_self(
43+
; CHECK-SAME: ptr [[CMP:%.*]]) {
44+
; CHECK-NEXT: [[ALLOCA:%.*]] = alloca ptr, align 8, addrspace(5)
45+
; CHECK-NEXT: [[FLAT:%.*]] = addrspacecast ptr addrspace(5) [[ALLOCA]] to ptr
46+
; CHECK-NEXT: [[CMPX:%.*]] = cmpxchg ptr [[FLAT]], ptr [[CMP]], ptr [[FLAT]] seq_cst seq_cst, align 8
47+
; CHECK-NEXT: call void @user(ptr [[FLAT]])
48+
; CHECK-NEXT: ret { ptr, i1 } [[CMPX]]
49+
;
50+
%alloca = alloca ptr, align 8, addrspace(5)
51+
%flat = addrspacecast ptr addrspace(5) %alloca to ptr
52+
%cmpx = cmpxchg ptr %flat, ptr %cmp, ptr %flat seq_cst seq_cst, align 8
53+
call void @user(ptr %flat)
54+
ret { ptr, i1 } %cmpx
55+
}
56+
57+
define { ptr, i1 } @cmpxchg_flat_pointer_cmp_to_self(ptr %new) {
58+
; CHECK-LABEL: define { ptr, i1 } @cmpxchg_flat_pointer_cmp_to_self(
59+
; CHECK-SAME: ptr [[NEW:%.*]]) {
60+
; CHECK-NEXT: [[ALLOCA:%.*]] = alloca ptr, align 8, addrspace(5)
61+
; CHECK-NEXT: [[FLAT:%.*]] = addrspacecast ptr addrspace(5) [[ALLOCA]] to ptr
62+
; CHECK-NEXT: [[CMPX:%.*]] = cmpxchg ptr [[FLAT]], ptr [[FLAT]], ptr [[NEW]] seq_cst seq_cst, align 8
63+
; CHECK-NEXT: call void @user(ptr [[FLAT]])
64+
; CHECK-NEXT: ret { ptr, i1 } [[CMPX]]
65+
;
66+
%alloca = alloca ptr, align 8, addrspace(5)
67+
%flat = addrspacecast ptr addrspace(5) %alloca to ptr
68+
%cmpx = cmpxchg ptr %flat, ptr %flat, ptr %new seq_cst seq_cst, align 8
69+
call void @user(ptr %flat)
70+
ret { ptr, i1 } %cmpx
71+
}

0 commit comments

Comments
 (0)