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
4 define 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:%.*]]
10 ; CHECK-NEXT: [[V1:%.*]] = load i64, ptr addrspace(3) [[PTR]], align 8
11 ; CHECK-NEXT: ret i64 [[V1]]
13 ; CHECK-NEXT: [[V2:%.*]] = load i64, ptr [[PTR_CAST]], align 8
14 ; CHECK-NEXT: ret i64 [[V2]]
16 %ptr_cast = addrspacecast ptr addrspace(3) %ptr to ptr
17 br i1 %pred, label %l1, label %l2
20 %v1 = load i64, ptr addrspace(3) %ptr
24 %v2 = load i64, ptr %ptr_cast
28 define 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:%.*]]
34 ; CHECK-NEXT: [[V1:%.*]] = load i64, ptr addrspace(5) [[PTR]], align 8
35 ; CHECK-NEXT: ret i64 [[V1]]
37 ; CHECK-NEXT: [[V2:%.*]] = load i64, ptr [[PTR_CAST]], align 8
38 ; CHECK-NEXT: ret i64 [[V2]]
40 %ptr_cast = addrspacecast ptr addrspace(5) %ptr to ptr
41 br i1 %pred, label %l1, label %l2
44 %v1 = load i64, ptr addrspace(5) %ptr
48 %v2 = load i64, ptr %ptr_cast
53 define 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:%.*]]
58 ; CHECK-NEXT: [[V1:%.*]] = load i64, ptr addrspace(1) [[PTR]], align 8
59 ; CHECK-NEXT: ret i64 [[V1]]
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]]
65 %ptr_cast = addrspacecast ptr addrspace(1) %ptr to ptr
66 br i1 %pred, label %l1, label %l2
69 %v1 = load i64, ptr addrspace(1) %ptr
73 %v2 = load i64, ptr %ptr_cast
77 define 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:%.*]]
82 ; CHECK-NEXT: [[V1:%.*]] = load i64, ptr [[PTR]], align 8
83 ; CHECK-NEXT: ret i64 [[V1]]
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]]
89 %ptr_cast = addrspacecast ptr %ptr to ptr addrspace(1)
90 br i1 %pred, label %l1, label %l2
93 %v1 = load i64, ptr %ptr
97 %v2 = load i64, ptr addrspace(1) %ptr_cast
101 define 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:%.*]]
106 ; CHECK-NEXT: [[V1:%.*]] = load i64, ptr [[PTR]], align 8
107 ; CHECK-NEXT: ret i64 [[V1]]
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]]
113 %ptr_cast = addrspacecast ptr %ptr to ptr addrspace(4)
114 br i1 %pred, label %l1, label %l2
117 %v1 = load i64, ptr %ptr
121 %v2 = load i64, ptr addrspace(4) %ptr_cast
125 define 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:%.*]]
131 ; CHECK-NEXT: [[V1:%.*]] = load i64, ptr [[PTR]], align 8
132 ; CHECK-NEXT: ret i64 [[V1]]
134 ; CHECK-NEXT: [[V2:%.*]] = load i64, ptr addrspace(3) [[PTR_CAST]], align 8
135 ; CHECK-NEXT: ret i64 [[V2]]
137 %ptr_cast = addrspacecast ptr %ptr to ptr addrspace(3)
138 br i1 %pred, label %l1, label %l2
141 %v1 = load i64, ptr %ptr
145 %v2 = load i64, ptr addrspace(3) %ptr_cast
149 define 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:%.*]]
155 ; CHECK-NEXT: [[V1:%.*]] = load i64, ptr [[PTR]], align 8
156 ; CHECK-NEXT: ret i64 [[V1]]
158 ; CHECK-NEXT: [[V2:%.*]] = load i64, ptr addrspace(5) [[PTR_CAST]], align 8
159 ; CHECK-NEXT: ret i64 [[V2]]
161 %ptr_cast = addrspacecast ptr %ptr to ptr addrspace(5)
162 br i1 %pred, label %l1, label %l2
165 %v1 = load i64, ptr %ptr
169 %v2 = load i64, ptr addrspace(5) %ptr_cast