File: multi-size-address-space-pointer.ll

package info (click to toggle)
llvm-toolchain-17 1%3A17.0.6-22
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,799,624 kB
  • sloc: cpp: 6,428,607; ansic: 1,383,196; asm: 793,408; python: 223,504; objc: 75,364; f90: 60,502; lisp: 33,869; pascal: 15,282; sh: 9,684; perl: 7,453; ml: 4,937; awk: 3,523; makefile: 2,889; javascript: 2,149; xml: 888; fortran: 619; cs: 573
file content (139 lines) | stat: -rw-r--r-- 5,256 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt -S -passes=instcombine %s -o - | FileCheck %s
target 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"


define i32 @test_as0(ptr addrspace(0) %a) {
; CHECK-LABEL: @test_as0(
; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr i32, ptr [[A:%.*]], i32 1
; CHECK-NEXT:    [[Y:%.*]] = load i32, ptr [[ARRAYIDX]], align 4
; CHECK-NEXT:    ret i32 [[Y]]
;
  %arrayidx = getelementptr i32, ptr addrspace(0) %a, i64 1
  %y = load i32, ptr addrspace(0) %arrayidx, align 4
  ret i32 %y
}

define i32 @test_as1(ptr addrspace(1) %a) {
; CHECK-LABEL: @test_as1(
; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr i32, ptr addrspace(1) [[A:%.*]], i64 1
; CHECK-NEXT:    [[Y:%.*]] = load i32, ptr addrspace(1) [[ARRAYIDX]], align 4
; CHECK-NEXT:    ret i32 [[Y]]
;
  %arrayidx = getelementptr i32, ptr addrspace(1) %a, i32 1
  %y = load i32, ptr addrspace(1) %arrayidx, align 4
  ret i32 %y
}

define i32 @test_as2(ptr addrspace(2) %a) {
; CHECK-LABEL: @test_as2(
; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr i32, ptr addrspace(2) [[A:%.*]], i8 1
; CHECK-NEXT:    [[Y:%.*]] = load i32, ptr addrspace(2) [[ARRAYIDX]], align 4
; CHECK-NEXT:    ret i32 [[Y]]
;
  %arrayidx = getelementptr i32, ptr addrspace(2) %a, i32 1
  %y = load i32, ptr addrspace(2) %arrayidx, align 4
  ret i32 %y
}

define i32 @test_as3(ptr addrspace(3) %a) {
; CHECK-LABEL: @test_as3(
; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr i32, ptr addrspace(3) [[A:%.*]], i16 1
; CHECK-NEXT:    [[Y:%.*]] = load i32, ptr addrspace(3) [[ARRAYIDX]], align 4
; CHECK-NEXT:    ret i32 [[Y]]
;
  %arrayidx = getelementptr i32, ptr addrspace(3) %a, i32 1
  %y = load i32, ptr addrspace(3) %arrayidx, align 4
  ret i32 %y
}

define i32 @test_combine_ptrtoint(ptr addrspace(2) %a) {
; CHECK-LABEL: @test_combine_ptrtoint(
; CHECK-NEXT:    [[Y:%.*]] = load i32, ptr addrspace(2) [[A:%.*]], align 4
; CHECK-NEXT:    ret i32 [[Y]]
;
  %cast = ptrtoint ptr addrspace(2) %a to i8
  %castback = inttoptr i8 %cast to ptr addrspace(2)
  %y = load i32, ptr addrspace(2) %castback, align 4
  ret i32 %y
}

define i8 @test_combine_inttoptr(i8 %a) {
; CHECK-LABEL: @test_combine_inttoptr(
; CHECK-NEXT:    ret i8 [[A:%.*]]
;
  %cast = inttoptr i8 %a to ptr addrspace(2)
  %castback = ptrtoint ptr addrspace(2) %cast to i8
  ret i8 %castback
}

define i32 @test_combine_vector_ptrtoint(<2 x ptr addrspace(2)> %a) {
; CHECK-LABEL: @test_combine_vector_ptrtoint(
; CHECK-NEXT:    [[P:%.*]] = extractelement <2 x ptr addrspace(2)> [[A:%.*]], i64 0
; CHECK-NEXT:    [[Y:%.*]] = load i32, ptr addrspace(2) [[P]], align 4
; CHECK-NEXT:    ret i32 [[Y]]
;
  %cast = ptrtoint <2 x ptr addrspace(2)> %a to <2 x i8>
  %castback = inttoptr <2 x i8> %cast to <2 x ptr addrspace(2)>
  %p = extractelement <2 x ptr addrspace(2)> %castback, i32 0
  %y = load i32, ptr addrspace(2) %p, align 4
  ret i32 %y
}

define <2 x i8> @test_combine_vector_inttoptr(<2 x i8> %a) {
; CHECK-LABEL: @test_combine_vector_inttoptr(
; CHECK-NEXT:    ret <2 x i8> [[A:%.*]]
;
  %cast = inttoptr <2 x i8> %a to <2 x ptr addrspace(2)>
  %castback = ptrtoint <2 x ptr addrspace(2)> %cast to <2 x i8>
  ret <2 x i8> %castback
}

; Check that the GEP index is changed to the address space integer type (i64 -> i8)
define ptr addrspace(2) @shrink_gep_constant_index_64_as2(ptr addrspace(2) %p) {
; CHECK-LABEL: @shrink_gep_constant_index_64_as2(
; CHECK-NEXT:    [[RET:%.*]] = getelementptr i32, ptr addrspace(2) [[P:%.*]], i8 1
; CHECK-NEXT:    ret ptr addrspace(2) [[RET]]
;
  %ret = getelementptr i32, ptr addrspace(2) %p, i64 1
  ret ptr addrspace(2) %ret
}

define ptr addrspace(2) @shrink_gep_constant_index_32_as2(ptr addrspace(2) %p) {
; CHECK-LABEL: @shrink_gep_constant_index_32_as2(
; CHECK-NEXT:    [[RET:%.*]] = getelementptr i32, ptr addrspace(2) [[P:%.*]], i8 1
; CHECK-NEXT:    ret ptr addrspace(2) [[RET]]
;
  %ret = getelementptr i32, ptr addrspace(2) %p, i32 1
  ret ptr addrspace(2) %ret
}

define ptr addrspace(3) @shrink_gep_constant_index_64_as3(ptr addrspace(3) %p) {
; CHECK-LABEL: @shrink_gep_constant_index_64_as3(
; CHECK-NEXT:    [[RET:%.*]] = getelementptr i32, ptr addrspace(3) [[P:%.*]], i16 1
; CHECK-NEXT:    ret ptr addrspace(3) [[RET]]
;
  %ret = getelementptr i32, ptr addrspace(3) %p, i64 1
  ret ptr addrspace(3) %ret
}

define ptr addrspace(2) @shrink_gep_variable_index_64_as2(ptr addrspace(2) %p, i64 %idx) {
; CHECK-LABEL: @shrink_gep_variable_index_64_as2(
; CHECK-NEXT:    [[TMP1:%.*]] = trunc i64 [[IDX:%.*]] to i8
; CHECK-NEXT:    [[RET:%.*]] = getelementptr i32, ptr addrspace(2) [[P:%.*]], i8 [[TMP1]]
; CHECK-NEXT:    ret ptr addrspace(2) [[RET]]
;
  %ret = getelementptr i32, ptr addrspace(2) %p, i64 %idx
  ret ptr addrspace(2) %ret
}

define ptr addrspace(1) @grow_gep_variable_index_8_as1(ptr addrspace(1) %p, i8 %idx) {
; CHECK-LABEL: @grow_gep_variable_index_8_as1(
; CHECK-NEXT:    [[TMP1:%.*]] = sext i8 [[IDX:%.*]] to i64
; CHECK-NEXT:    [[RET:%.*]] = getelementptr i32, ptr addrspace(1) [[P:%.*]], i64 [[TMP1]]
; CHECK-NEXT:    ret ptr addrspace(1) [[RET]]
;
  %ret = getelementptr i32, ptr addrspace(1) %p, i8 %idx
  ret ptr addrspace(1) %ret
}