xref: /llvm-project/llvm/test/Transforms/InstCombine/multi-size-address-space-pointer.ll (revision 90ba33099cbb17e7c159e9ebc5a512037db99d6d)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -S -passes=instcombine %s -o - | FileCheck %s
3target datalayout = "e-p:32:32:32-p1:64:64:64-p2:8:8:8-p3:16:16:16-p4:16:16:16-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:32"
4
5
6define i32 @test_as0(ptr addrspace(0) %a) {
7; CHECK-LABEL: @test_as0(
8; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr i8, ptr [[A:%.*]], i32 4
9; CHECK-NEXT:    [[Y:%.*]] = load i32, ptr [[ARRAYIDX]], align 4
10; CHECK-NEXT:    ret i32 [[Y]]
11;
12  %arrayidx = getelementptr i32, ptr addrspace(0) %a, i64 1
13  %y = load i32, ptr addrspace(0) %arrayidx, align 4
14  ret i32 %y
15}
16
17define i32 @test_as1(ptr addrspace(1) %a) {
18; CHECK-LABEL: @test_as1(
19; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr i8, ptr addrspace(1) [[A:%.*]], i64 4
20; CHECK-NEXT:    [[Y:%.*]] = load i32, ptr addrspace(1) [[ARRAYIDX]], align 4
21; CHECK-NEXT:    ret i32 [[Y]]
22;
23  %arrayidx = getelementptr i32, ptr addrspace(1) %a, i32 1
24  %y = load i32, ptr addrspace(1) %arrayidx, align 4
25  ret i32 %y
26}
27
28define i32 @test_as2(ptr addrspace(2) %a) {
29; CHECK-LABEL: @test_as2(
30; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr i8, ptr addrspace(2) [[A:%.*]], i8 4
31; CHECK-NEXT:    [[Y:%.*]] = load i32, ptr addrspace(2) [[ARRAYIDX]], align 4
32; CHECK-NEXT:    ret i32 [[Y]]
33;
34  %arrayidx = getelementptr i32, ptr addrspace(2) %a, i32 1
35  %y = load i32, ptr addrspace(2) %arrayidx, align 4
36  ret i32 %y
37}
38
39define i32 @test_as3(ptr addrspace(3) %a) {
40; CHECK-LABEL: @test_as3(
41; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr i8, ptr addrspace(3) [[A:%.*]], i16 4
42; CHECK-NEXT:    [[Y:%.*]] = load i32, ptr addrspace(3) [[ARRAYIDX]], align 4
43; CHECK-NEXT:    ret i32 [[Y]]
44;
45  %arrayidx = getelementptr i32, ptr addrspace(3) %a, i32 1
46  %y = load i32, ptr addrspace(3) %arrayidx, align 4
47  ret i32 %y
48}
49
50define i32 @test_combine_ptrtoint(ptr addrspace(2) %a) {
51; CHECK-LABEL: @test_combine_ptrtoint(
52; CHECK-NEXT:    [[Y:%.*]] = load i32, ptr addrspace(2) [[A:%.*]], align 4
53; CHECK-NEXT:    ret i32 [[Y]]
54;
55  %cast = ptrtoint ptr addrspace(2) %a to i8
56  %castback = inttoptr i8 %cast to ptr addrspace(2)
57  %y = load i32, ptr addrspace(2) %castback, align 4
58  ret i32 %y
59}
60
61define i8 @test_combine_inttoptr(i8 %a) {
62; CHECK-LABEL: @test_combine_inttoptr(
63; CHECK-NEXT:    ret i8 [[A:%.*]]
64;
65  %cast = inttoptr i8 %a to ptr addrspace(2)
66  %castback = ptrtoint ptr addrspace(2) %cast to i8
67  ret i8 %castback
68}
69
70define i32 @test_combine_vector_ptrtoint(<2 x ptr addrspace(2)> %a) {
71; CHECK-LABEL: @test_combine_vector_ptrtoint(
72; CHECK-NEXT:    [[P:%.*]] = extractelement <2 x ptr addrspace(2)> [[A:%.*]], i64 0
73; CHECK-NEXT:    [[Y:%.*]] = load i32, ptr addrspace(2) [[P]], align 4
74; CHECK-NEXT:    ret i32 [[Y]]
75;
76  %cast = ptrtoint <2 x ptr addrspace(2)> %a to <2 x i8>
77  %castback = inttoptr <2 x i8> %cast to <2 x ptr addrspace(2)>
78  %p = extractelement <2 x ptr addrspace(2)> %castback, i32 0
79  %y = load i32, ptr addrspace(2) %p, align 4
80  ret i32 %y
81}
82
83define <2 x i8> @test_combine_vector_inttoptr(<2 x i8> %a) {
84; CHECK-LABEL: @test_combine_vector_inttoptr(
85; CHECK-NEXT:    ret <2 x i8> [[A:%.*]]
86;
87  %cast = inttoptr <2 x i8> %a to <2 x ptr addrspace(2)>
88  %castback = ptrtoint <2 x ptr addrspace(2)> %cast to <2 x i8>
89  ret <2 x i8> %castback
90}
91
92; Check that the GEP index is changed to the address space integer type (i64 -> i8)
93define ptr addrspace(2) @shrink_gep_constant_index_64_as2(ptr addrspace(2) %p) {
94; CHECK-LABEL: @shrink_gep_constant_index_64_as2(
95; CHECK-NEXT:    [[RET:%.*]] = getelementptr i8, ptr addrspace(2) [[P:%.*]], i8 4
96; CHECK-NEXT:    ret ptr addrspace(2) [[RET]]
97;
98  %ret = getelementptr i32, ptr addrspace(2) %p, i64 1
99  ret ptr addrspace(2) %ret
100}
101
102define ptr addrspace(2) @shrink_gep_constant_index_32_as2(ptr addrspace(2) %p) {
103; CHECK-LABEL: @shrink_gep_constant_index_32_as2(
104; CHECK-NEXT:    [[RET:%.*]] = getelementptr i8, ptr addrspace(2) [[P:%.*]], i8 4
105; CHECK-NEXT:    ret ptr addrspace(2) [[RET]]
106;
107  %ret = getelementptr i32, ptr addrspace(2) %p, i32 1
108  ret ptr addrspace(2) %ret
109}
110
111define ptr addrspace(3) @shrink_gep_constant_index_64_as3(ptr addrspace(3) %p) {
112; CHECK-LABEL: @shrink_gep_constant_index_64_as3(
113; CHECK-NEXT:    [[RET:%.*]] = getelementptr i8, ptr addrspace(3) [[P:%.*]], i16 4
114; CHECK-NEXT:    ret ptr addrspace(3) [[RET]]
115;
116  %ret = getelementptr i32, ptr addrspace(3) %p, i64 1
117  ret ptr addrspace(3) %ret
118}
119
120define ptr addrspace(2) @shrink_gep_variable_index_64_as2(ptr addrspace(2) %p, i64 %idx) {
121; CHECK-LABEL: @shrink_gep_variable_index_64_as2(
122; CHECK-NEXT:    [[TMP1:%.*]] = trunc i64 [[IDX:%.*]] to i8
123; CHECK-NEXT:    [[RET:%.*]] = getelementptr i32, ptr addrspace(2) [[P:%.*]], i8 [[TMP1]]
124; CHECK-NEXT:    ret ptr addrspace(2) [[RET]]
125;
126  %ret = getelementptr i32, ptr addrspace(2) %p, i64 %idx
127  ret ptr addrspace(2) %ret
128}
129
130define ptr addrspace(1) @grow_gep_variable_index_8_as1(ptr addrspace(1) %p, i8 %idx) {
131; CHECK-LABEL: @grow_gep_variable_index_8_as1(
132; CHECK-NEXT:    [[TMP1:%.*]] = sext i8 [[IDX:%.*]] to i64
133; CHECK-NEXT:    [[RET:%.*]] = getelementptr i32, ptr addrspace(1) [[P:%.*]], i64 [[TMP1]]
134; CHECK-NEXT:    ret ptr addrspace(1) [[RET]]
135;
136  %ret = getelementptr i32, ptr addrspace(1) %p, i8 %idx
137  ret ptr addrspace(1) %ret
138}
139
140