xref: /llvm-project/llvm/test/Transforms/CodeGenPrepare/AMDGPU/sink-addrspacecast.ll (revision f1ec0d12bb0843f0deab83ef2b5cf1339cbc4f0b)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 3
2; RUN: opt -S -passes='require<profile-summary>,function(codegenprepare)' -mtriple=amdgcn--amdhsa < %s | FileCheck %s
3
4define i64 @no_sink_local_to_flat(i1 %pred, ptr addrspace(3) %ptr) {
5; CHECK-LABEL: define i64 @no_sink_local_to_flat(
6; CHECK-SAME: i1 [[PRED:%.*]], ptr addrspace(3) [[PTR:%.*]]) {
7; CHECK-NEXT:    [[PTR_CAST:%.*]] = addrspacecast ptr addrspace(3) [[PTR]] to ptr
8; CHECK-NEXT:    br i1 [[PRED]], label [[L1:%.*]], label [[L2:%.*]]
9; CHECK:       l1:
10; CHECK-NEXT:    [[V1:%.*]] = load i64, ptr addrspace(3) [[PTR]], align 8
11; CHECK-NEXT:    ret i64 [[V1]]
12; CHECK:       l2:
13; CHECK-NEXT:    [[V2:%.*]] = load i64, ptr [[PTR_CAST]], align 8
14; CHECK-NEXT:    ret i64 [[V2]]
15;
16  %ptr_cast = addrspacecast ptr addrspace(3) %ptr to ptr
17  br i1 %pred, label %l1, label %l2
18
19l1:
20  %v1 = load i64, ptr addrspace(3) %ptr
21  ret i64 %v1
22
23l2:
24  %v2 = load i64, ptr %ptr_cast
25  ret i64 %v2
26}
27
28define i64 @no_sink_private_to_flat(i1 %pred, ptr addrspace(5) %ptr) {
29; CHECK-LABEL: define i64 @no_sink_private_to_flat(
30; CHECK-SAME: i1 [[PRED:%.*]], ptr addrspace(5) [[PTR:%.*]]) {
31; CHECK-NEXT:    [[PTR_CAST:%.*]] = addrspacecast ptr addrspace(5) [[PTR]] to ptr
32; CHECK-NEXT:    br i1 [[PRED]], label [[L1:%.*]], label [[L2:%.*]]
33; CHECK:       l1:
34; CHECK-NEXT:    [[V1:%.*]] = load i64, ptr addrspace(5) [[PTR]], align 8
35; CHECK-NEXT:    ret i64 [[V1]]
36; CHECK:       l2:
37; CHECK-NEXT:    [[V2:%.*]] = load i64, ptr [[PTR_CAST]], align 8
38; CHECK-NEXT:    ret i64 [[V2]]
39;
40  %ptr_cast = addrspacecast ptr addrspace(5) %ptr to ptr
41  br i1 %pred, label %l1, label %l2
42
43l1:
44  %v1 = load i64, ptr addrspace(5) %ptr
45  ret i64 %v1
46
47l2:
48  %v2 = load i64, ptr %ptr_cast
49  ret i64 %v2
50}
51
52
53define i64 @sink_global_to_flat(i1 %pred, ptr addrspace(1) %ptr) {
54; CHECK-LABEL: define i64 @sink_global_to_flat(
55; CHECK-SAME: i1 [[PRED:%.*]], ptr addrspace(1) [[PTR:%.*]]) {
56; CHECK-NEXT:    br i1 [[PRED]], label [[L1:%.*]], label [[L2:%.*]]
57; CHECK:       l1:
58; CHECK-NEXT:    [[V1:%.*]] = load i64, ptr addrspace(1) [[PTR]], align 8
59; CHECK-NEXT:    ret i64 [[V1]]
60; CHECK:       l2:
61; CHECK-NEXT:    [[TMP1:%.*]] = addrspacecast ptr addrspace(1) [[PTR]] to ptr
62; CHECK-NEXT:    [[V2:%.*]] = load i64, ptr [[TMP1]], align 8
63; CHECK-NEXT:    ret i64 [[V2]]
64;
65  %ptr_cast = addrspacecast ptr addrspace(1) %ptr to ptr
66  br i1 %pred, label %l1, label %l2
67
68l1:
69  %v1 = load i64, ptr addrspace(1) %ptr
70  ret i64 %v1
71
72l2:
73  %v2 = load i64, ptr %ptr_cast
74  ret i64 %v2
75}
76
77define i64 @sink_flat_to_global(i1 %pred, ptr %ptr) {
78; CHECK-LABEL: define i64 @sink_flat_to_global(
79; CHECK-SAME: i1 [[PRED:%.*]], ptr [[PTR:%.*]]) {
80; CHECK-NEXT:    br i1 [[PRED]], label [[L1:%.*]], label [[L2:%.*]]
81; CHECK:       l1:
82; CHECK-NEXT:    [[V1:%.*]] = load i64, ptr [[PTR]], align 8
83; CHECK-NEXT:    ret i64 [[V1]]
84; CHECK:       l2:
85; CHECK-NEXT:    [[TMP1:%.*]] = addrspacecast ptr [[PTR]] to ptr addrspace(1)
86; CHECK-NEXT:    [[V2:%.*]] = load i64, ptr addrspace(1) [[TMP1]], align 8
87; CHECK-NEXT:    ret i64 [[V2]]
88;
89  %ptr_cast = addrspacecast ptr %ptr to ptr addrspace(1)
90  br i1 %pred, label %l1, label %l2
91
92l1:
93  %v1 = load i64, ptr %ptr
94  ret i64 %v1
95
96l2:
97  %v2 = load i64, ptr addrspace(1) %ptr_cast
98  ret i64 %v2
99}
100
101define i64 @sink_flat_to_constant(i1 %pred, ptr %ptr) {
102; CHECK-LABEL: define i64 @sink_flat_to_constant(
103; CHECK-SAME: i1 [[PRED:%.*]], ptr [[PTR:%.*]]) {
104; CHECK-NEXT:    br i1 [[PRED]], label [[L1:%.*]], label [[L2:%.*]]
105; CHECK:       l1:
106; CHECK-NEXT:    [[V1:%.*]] = load i64, ptr [[PTR]], align 8
107; CHECK-NEXT:    ret i64 [[V1]]
108; CHECK:       l2:
109; CHECK-NEXT:    [[TMP1:%.*]] = addrspacecast ptr [[PTR]] to ptr addrspace(4)
110; CHECK-NEXT:    [[V2:%.*]] = load i64, ptr addrspace(4) [[TMP1]], align 8
111; CHECK-NEXT:    ret i64 [[V2]]
112;
113  %ptr_cast = addrspacecast ptr %ptr to ptr addrspace(4)
114  br i1 %pred, label %l1, label %l2
115
116l1:
117  %v1 = load i64, ptr %ptr
118  ret i64 %v1
119
120l2:
121  %v2 = load i64, ptr addrspace(4) %ptr_cast
122  ret i64 %v2
123}
124
125define i64 @sink_flat_to_local(i1 %pred, ptr %ptr) {
126; CHECK-LABEL: define i64 @sink_flat_to_local(
127; CHECK-SAME: i1 [[PRED:%.*]], ptr [[PTR:%.*]]) {
128; CHECK-NEXT:    [[PTR_CAST:%.*]] = addrspacecast ptr [[PTR]] to ptr addrspace(3)
129; CHECK-NEXT:    br i1 [[PRED]], label [[L1:%.*]], label [[L2:%.*]]
130; CHECK:       l1:
131; CHECK-NEXT:    [[V1:%.*]] = load i64, ptr [[PTR]], align 8
132; CHECK-NEXT:    ret i64 [[V1]]
133; CHECK:       l2:
134; CHECK-NEXT:    [[V2:%.*]] = load i64, ptr addrspace(3) [[PTR_CAST]], align 8
135; CHECK-NEXT:    ret i64 [[V2]]
136;
137  %ptr_cast = addrspacecast ptr %ptr to ptr addrspace(3)
138  br i1 %pred, label %l1, label %l2
139
140l1:
141  %v1 = load i64, ptr %ptr
142  ret i64 %v1
143
144l2:
145  %v2 = load i64, ptr addrspace(3) %ptr_cast
146  ret i64 %v2
147}
148
149define i64 @sink_flat_to_private(i1 %pred, ptr %ptr) {
150; CHECK-LABEL: define i64 @sink_flat_to_private(
151; CHECK-SAME: i1 [[PRED:%.*]], ptr [[PTR:%.*]]) {
152; CHECK-NEXT:    [[PTR_CAST:%.*]] = addrspacecast ptr [[PTR]] to ptr addrspace(5)
153; CHECK-NEXT:    br i1 [[PRED]], label [[L1:%.*]], label [[L2:%.*]]
154; CHECK:       l1:
155; CHECK-NEXT:    [[V1:%.*]] = load i64, ptr [[PTR]], align 8
156; CHECK-NEXT:    ret i64 [[V1]]
157; CHECK:       l2:
158; CHECK-NEXT:    [[V2:%.*]] = load i64, ptr addrspace(5) [[PTR_CAST]], align 8
159; CHECK-NEXT:    ret i64 [[V2]]
160;
161  %ptr_cast = addrspacecast ptr %ptr to ptr addrspace(5)
162  br i1 %pred, label %l1, label %l2
163
164l1:
165  %v1 = load i64, ptr %ptr
166  ret i64 %v1
167
168l2:
169  %v2 = load i64, ptr addrspace(5) %ptr_cast
170  ret i64 %v2
171}
172