[TTI] getTypeBasedIntrinsicInstrCost - add basic handling for strided load/store...
[llvm-project.git] / llvm / test / Transforms / CodeGenPrepare / AMDGPU / sink-addrspacecast.ll
blob77e79a902f3be44a9d2837e217b91d1ced3ec98f
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:%.*]]
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]]
16   %ptr_cast = addrspacecast ptr addrspace(3) %ptr to ptr
17   br i1 %pred, label %l1, label %l2
19 l1:
20   %v1 = load i64, ptr addrspace(3) %ptr
21   ret i64 %v1
23 l2:
24   %v2 = load i64, ptr %ptr_cast
25   ret i64 %v2
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:%.*]]
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]]
40   %ptr_cast = addrspacecast ptr addrspace(5) %ptr to ptr
41   br i1 %pred, label %l1, label %l2
43 l1:
44   %v1 = load i64, ptr addrspace(5) %ptr
45   ret i64 %v1
47 l2:
48   %v2 = load i64, ptr %ptr_cast
49   ret i64 %v2
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:%.*]]
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]]
65   %ptr_cast = addrspacecast ptr addrspace(1) %ptr to ptr
66   br i1 %pred, label %l1, label %l2
68 l1:
69   %v1 = load i64, ptr addrspace(1) %ptr
70   ret i64 %v1
72 l2:
73   %v2 = load i64, ptr %ptr_cast
74   ret i64 %v2
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:%.*]]
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]]
89   %ptr_cast = addrspacecast ptr %ptr to ptr addrspace(1)
90   br i1 %pred, label %l1, label %l2
92 l1:
93   %v1 = load i64, ptr %ptr
94   ret i64 %v1
96 l2:
97   %v2 = load i64, ptr addrspace(1) %ptr_cast
98   ret i64 %v2
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:%.*]]
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]]
113   %ptr_cast = addrspacecast ptr %ptr to ptr addrspace(4)
114   br i1 %pred, label %l1, label %l2
117   %v1 = load i64, ptr %ptr
118   ret i64 %v1
121   %v2 = load i64, ptr addrspace(4) %ptr_cast
122   ret i64 %v2
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:%.*]]
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]]
137   %ptr_cast = addrspacecast ptr %ptr to ptr addrspace(3)
138   br i1 %pred, label %l1, label %l2
141   %v1 = load i64, ptr %ptr
142   ret i64 %v1
145   %v2 = load i64, ptr addrspace(3) %ptr_cast
146   ret i64 %v2
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:%.*]]
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]]
161   %ptr_cast = addrspacecast ptr %ptr to ptr addrspace(5)
162   br i1 %pred, label %l1, label %l2
165   %v1 = load i64, ptr %ptr
166   ret i64 %v1
169   %v2 = load i64, ptr addrspace(5) %ptr_cast
170   ret i64 %v2