@@ -10,12 +10,13 @@ define ptr addrspace(7) @gep(ptr addrspace(7) %in, i32 %idx) {
10
10
; CHECK-SAME: ({ ptr addrspace(8), i32 } [[IN:%.*]], i32 [[IDX:%.*]]) #[[ATTR0:[0-9]+]] {
11
11
; CHECK-NEXT: [[IN_RSRC:%.*]] = extractvalue { ptr addrspace(8), i32 } [[IN]], 0
12
12
; CHECK-NEXT: [[IN_OFF:%.*]] = extractvalue { ptr addrspace(8), i32 } [[IN]], 1
13
- ; CHECK-NEXT: [[TMP1:%.*]] = mul nuw nsw i32 [[IDX]], 40
14
- ; CHECK-NEXT: [[TMP2:%.*]] = add nuw nsw i32 [[TMP1]], 32
15
- ; CHECK-NEXT: [[RET:%.*]] = add i32 [[IN_OFF]], [[TMP2]]
16
- ; CHECK-NEXT: [[TMP3:%.*]] = insertvalue { ptr addrspace(8), i32 } poison, ptr addrspace(8) [[IN_RSRC]], 0
17
- ; CHECK-NEXT: [[TMP4:%.*]] = insertvalue { ptr addrspace(8), i32 } [[TMP3]], i32 [[RET]], 1
18
- ; CHECK-NEXT: ret { ptr addrspace(8), i32 } [[TMP4]]
13
+ ; CHECK-NEXT: [[RET_IDX:%.*]] = mul nsw i32 [[IDX]], 40
14
+ ; CHECK-NEXT: [[RET_OFFS:%.*]] = add nsw i32 [[RET_IDX]], 8
15
+ ; CHECK-NEXT: [[RET_OFFS1:%.*]] = add nsw i32 [[RET_OFFS]], 24
16
+ ; CHECK-NEXT: [[RET:%.*]] = add i32 [[IN_OFF]], [[RET_OFFS1]]
17
+ ; CHECK-NEXT: [[TMP1:%.*]] = insertvalue { ptr addrspace(8), i32 } poison, ptr addrspace(8) [[IN_RSRC]], 0
18
+ ; CHECK-NEXT: [[TMP2:%.*]] = insertvalue { ptr addrspace(8), i32 } [[TMP1]], i32 [[RET]], 1
19
+ ; CHECK-NEXT: ret { ptr addrspace(8), i32 } [[TMP2]]
19
20
;
20
21
%ret = getelementptr inbounds {i32 , [4 x ptr ]}, ptr addrspace (7 ) %in , i32 %idx , i32 1 , i32 3
21
22
ret ptr addrspace (7 ) %ret
@@ -26,12 +27,13 @@ define <2 x ptr addrspace(7)> @gep_vectors(<2 x ptr addrspace(7)> %in, <2 x i32>
26
27
; CHECK-SAME: ({ <2 x ptr addrspace(8)>, <2 x i32> } [[IN:%.*]], <2 x i32> [[IDX:%.*]]) #[[ATTR0]] {
27
28
; CHECK-NEXT: [[IN_RSRC:%.*]] = extractvalue { <2 x ptr addrspace(8)>, <2 x i32> } [[IN]], 0
28
29
; CHECK-NEXT: [[IN_OFF:%.*]] = extractvalue { <2 x ptr addrspace(8)>, <2 x i32> } [[IN]], 1
29
- ; CHECK-NEXT: [[TMP1:%.*]] = mul nuw nsw <2 x i32> [[IDX]], <i32 40, i32 40>
30
- ; CHECK-NEXT: [[TMP2:%.*]] = add nuw nsw <2 x i32> [[TMP1]], <i32 32, i32 32>
31
- ; CHECK-NEXT: [[RET:%.*]] = add <2 x i32> [[IN_OFF]], [[TMP2]]
32
- ; CHECK-NEXT: [[TMP3:%.*]] = insertvalue { <2 x ptr addrspace(8)>, <2 x i32> } poison, <2 x ptr addrspace(8)> [[IN_RSRC]], 0
33
- ; CHECK-NEXT: [[TMP4:%.*]] = insertvalue { <2 x ptr addrspace(8)>, <2 x i32> } [[TMP3]], <2 x i32> [[RET]], 1
34
- ; CHECK-NEXT: ret { <2 x ptr addrspace(8)>, <2 x i32> } [[TMP4]]
30
+ ; CHECK-NEXT: [[RET_IDX:%.*]] = mul nsw <2 x i32> [[IDX]], <i32 40, i32 40>
31
+ ; CHECK-NEXT: [[RET_OFFS:%.*]] = add nsw <2 x i32> [[RET_IDX]], <i32 8, i32 8>
32
+ ; CHECK-NEXT: [[RET_OFFS1:%.*]] = add nsw <2 x i32> [[RET_OFFS]], <i32 24, i32 24>
33
+ ; CHECK-NEXT: [[RET:%.*]] = add <2 x i32> [[IN_OFF]], [[RET_OFFS1]]
34
+ ; CHECK-NEXT: [[TMP1:%.*]] = insertvalue { <2 x ptr addrspace(8)>, <2 x i32> } poison, <2 x ptr addrspace(8)> [[IN_RSRC]], 0
35
+ ; CHECK-NEXT: [[TMP2:%.*]] = insertvalue { <2 x ptr addrspace(8)>, <2 x i32> } [[TMP1]], <2 x i32> [[RET]], 1
36
+ ; CHECK-NEXT: ret { <2 x ptr addrspace(8)>, <2 x i32> } [[TMP2]]
35
37
;
36
38
%ret = getelementptr inbounds {i32 , [4 x ptr ]}, <2 x ptr addrspace (7 )> %in , <2 x i32 > %idx , i32 1 , i32 3
37
39
ret <2 x ptr addrspace (7 )> %ret
@@ -44,13 +46,14 @@ define <2 x ptr addrspace(7)> @gep_vector_scalar(<2 x ptr addrspace(7)> %in, i64
44
46
; CHECK-NEXT: [[IN_OFF:%.*]] = extractvalue { <2 x ptr addrspace(8)>, <2 x i32> } [[IN]], 1
45
47
; CHECK-NEXT: [[DOTSPLATINSERT:%.*]] = insertelement <2 x i64> poison, i64 [[IDX]], i64 0
46
48
; CHECK-NEXT: [[DOTSPLAT:%.*]] = shufflevector <2 x i64> [[DOTSPLATINSERT]], <2 x i64> poison, <2 x i32> zeroinitializer
47
- ; CHECK-NEXT: [[TMP1:%.*]] = trunc <2 x i64> [[DOTSPLAT]] to <2 x i32>
48
- ; CHECK-NEXT: [[TMP2:%.*]] = mul nuw nsw <2 x i32> [[TMP1]], <i32 40, i32 40>
49
- ; CHECK-NEXT: [[TMP3:%.*]] = add nuw nsw <2 x i32> [[TMP2]], <i32 32, i32 32>
50
- ; CHECK-NEXT: [[RET:%.*]] = add <2 x i32> [[IN_OFF]], [[TMP3]]
51
- ; CHECK-NEXT: [[TMP4:%.*]] = insertvalue { <2 x ptr addrspace(8)>, <2 x i32> } poison, <2 x ptr addrspace(8)> [[IN_RSRC]], 0
52
- ; CHECK-NEXT: [[TMP5:%.*]] = insertvalue { <2 x ptr addrspace(8)>, <2 x i32> } [[TMP4]], <2 x i32> [[RET]], 1
53
- ; CHECK-NEXT: ret { <2 x ptr addrspace(8)>, <2 x i32> } [[TMP5]]
49
+ ; CHECK-NEXT: [[DOTSPLAT_C:%.*]] = trunc <2 x i64> [[DOTSPLAT]] to <2 x i32>
50
+ ; CHECK-NEXT: [[RET_IDX:%.*]] = mul nsw <2 x i32> [[DOTSPLAT_C]], <i32 40, i32 40>
51
+ ; CHECK-NEXT: [[RET_OFFS:%.*]] = add nsw <2 x i32> [[RET_IDX]], <i32 8, i32 8>
52
+ ; CHECK-NEXT: [[RET_OFFS1:%.*]] = add nsw <2 x i32> [[RET_OFFS]], <i32 24, i32 24>
53
+ ; CHECK-NEXT: [[RET:%.*]] = add <2 x i32> [[IN_OFF]], [[RET_OFFS1]]
54
+ ; CHECK-NEXT: [[TMP1:%.*]] = insertvalue { <2 x ptr addrspace(8)>, <2 x i32> } poison, <2 x ptr addrspace(8)> [[IN_RSRC]], 0
55
+ ; CHECK-NEXT: [[TMP2:%.*]] = insertvalue { <2 x ptr addrspace(8)>, <2 x i32> } [[TMP1]], <2 x i32> [[RET]], 1
56
+ ; CHECK-NEXT: ret { <2 x ptr addrspace(8)>, <2 x i32> } [[TMP2]]
54
57
;
55
58
%ret = getelementptr inbounds {i32 , [4 x ptr ]}, <2 x ptr addrspace (7 )> %in , i64 %idx , i32 1 , i32 3
56
59
ret <2 x ptr addrspace (7 )> %ret
@@ -61,11 +64,11 @@ define ptr addrspace(7) @simple_gep(ptr addrspace(7) %ptr, i32 %off) {
61
64
; CHECK-SAME: ({ ptr addrspace(8), i32 } [[PTR:%.*]], i32 [[OFF:%.*]]) #[[ATTR0]] {
62
65
; CHECK-NEXT: [[PTR_RSRC:%.*]] = extractvalue { ptr addrspace(8), i32 } [[PTR]], 0
63
66
; CHECK-NEXT: [[PTR_OFF:%.*]] = extractvalue { ptr addrspace(8), i32 } [[PTR]], 1
64
- ; CHECK-NEXT: [[TMP1 :%.*]] = shl i32 [[OFF]], 2
65
- ; CHECK-NEXT: [[RET:%.*]] = add i32 [[PTR_OFF]], [[TMP1 ]]
66
- ; CHECK-NEXT: [[TMP2 :%.*]] = insertvalue { ptr addrspace(8), i32 } poison, ptr addrspace(8) [[PTR_RSRC]], 0
67
- ; CHECK-NEXT: [[TMP3 :%.*]] = insertvalue { ptr addrspace(8), i32 } [[TMP2 ]], i32 [[RET]], 1
68
- ; CHECK-NEXT: ret { ptr addrspace(8), i32 } [[TMP3 ]]
67
+ ; CHECK-NEXT: [[RET_IDX :%.*]] = mul i32 [[OFF]], 4
68
+ ; CHECK-NEXT: [[RET:%.*]] = add i32 [[PTR_OFF]], [[RET_IDX ]]
69
+ ; CHECK-NEXT: [[TMP1 :%.*]] = insertvalue { ptr addrspace(8), i32 } poison, ptr addrspace(8) [[PTR_RSRC]], 0
70
+ ; CHECK-NEXT: [[TMP2 :%.*]] = insertvalue { ptr addrspace(8), i32 } [[TMP1 ]], i32 [[RET]], 1
71
+ ; CHECK-NEXT: ret { ptr addrspace(8), i32 } [[TMP2 ]]
69
72
;
70
73
%ret = getelementptr i32 , ptr addrspace (7 ) %ptr , i32 %off
71
74
ret ptr addrspace (7 ) %ret
@@ -76,11 +79,11 @@ define ptr addrspace(7) @simple_inbounds_gep(ptr addrspace(7) %ptr, i32 %off) {
76
79
; CHECK-SAME: ({ ptr addrspace(8), i32 } [[PTR:%.*]], i32 [[OFF:%.*]]) #[[ATTR0]] {
77
80
; CHECK-NEXT: [[PTR_RSRC:%.*]] = extractvalue { ptr addrspace(8), i32 } [[PTR]], 0
78
81
; CHECK-NEXT: [[PTR_OFF:%.*]] = extractvalue { ptr addrspace(8), i32 } [[PTR]], 1
79
- ; CHECK-NEXT: [[TMP1 :%.*]] = shl nuw nsw i32 [[OFF]], 2
80
- ; CHECK-NEXT: [[RET:%.*]] = add i32 [[PTR_OFF]], [[TMP1 ]]
81
- ; CHECK-NEXT: [[TMP2 :%.*]] = insertvalue { ptr addrspace(8), i32 } poison, ptr addrspace(8) [[PTR_RSRC]], 0
82
- ; CHECK-NEXT: [[TMP3 :%.*]] = insertvalue { ptr addrspace(8), i32 } [[TMP2 ]], i32 [[RET]], 1
83
- ; CHECK-NEXT: ret { ptr addrspace(8), i32 } [[TMP3 ]]
82
+ ; CHECK-NEXT: [[RET_IDX :%.*]] = mul nsw i32 [[OFF]], 4
83
+ ; CHECK-NEXT: [[RET:%.*]] = add i32 [[PTR_OFF]], [[RET_IDX ]]
84
+ ; CHECK-NEXT: [[TMP1 :%.*]] = insertvalue { ptr addrspace(8), i32 } poison, ptr addrspace(8) [[PTR_RSRC]], 0
85
+ ; CHECK-NEXT: [[TMP2 :%.*]] = insertvalue { ptr addrspace(8), i32 } [[TMP1 ]], i32 [[RET]], 1
86
+ ; CHECK-NEXT: ret { ptr addrspace(8), i32 } [[TMP2 ]]
84
87
;
85
88
%ret = getelementptr inbounds i32 , ptr addrspace (7 ) %ptr , i32 %off
86
89
ret ptr addrspace (7 ) %ret
@@ -91,9 +94,10 @@ define ptr addrspace(7) @zero_gep(ptr addrspace(7) %ptr) {
91
94
; CHECK-SAME: ({ ptr addrspace(8), i32 } [[PTR:%.*]]) #[[ATTR0]] {
92
95
; CHECK-NEXT: [[PTR_RSRC:%.*]] = extractvalue { ptr addrspace(8), i32 } [[PTR]], 0
93
96
; CHECK-NEXT: [[PTR_OFF:%.*]] = extractvalue { ptr addrspace(8), i32 } [[PTR]], 1
97
+ ; CHECK-NEXT: [[RET:%.*]] = add i32 [[PTR_OFF]], 0
94
98
; CHECK-NEXT: [[TMP1:%.*]] = insertvalue { ptr addrspace(8), i32 } poison, ptr addrspace(8) [[PTR_RSRC]], 0
95
- ; CHECK-NEXT: [[RET :%.*]] = insertvalue { ptr addrspace(8), i32 } [[TMP1]], i32 [[PTR_OFF ]], 1
96
- ; CHECK-NEXT: ret { ptr addrspace(8), i32 } [[RET ]]
99
+ ; CHECK-NEXT: [[TMP2 :%.*]] = insertvalue { ptr addrspace(8), i32 } [[TMP1]], i32 [[RET ]], 1
100
+ ; CHECK-NEXT: ret { ptr addrspace(8), i32 } [[TMP2 ]]
97
101
;
98
102
%ret = getelementptr i8 , ptr addrspace (7 ) %ptr , i32 0
99
103
ret ptr addrspace (7 ) %ret
@@ -105,9 +109,10 @@ define ptr addrspace(7) @zero_gep_goes_second(ptr addrspace(7) %v0, i32 %arg) {
105
109
; CHECK-NEXT: [[V0_RSRC:%.*]] = extractvalue { ptr addrspace(8), i32 } [[V0]], 0
106
110
; CHECK-NEXT: [[V0_OFF:%.*]] = extractvalue { ptr addrspace(8), i32 } [[V0]], 1
107
111
; CHECK-NEXT: [[V1:%.*]] = add i32 [[V0_OFF]], [[ARG]]
112
+ ; CHECK-NEXT: [[V2:%.*]] = add i32 [[V1]], 0
108
113
; CHECK-NEXT: [[TMP1:%.*]] = insertvalue { ptr addrspace(8), i32 } poison, ptr addrspace(8) [[V0_RSRC]], 0
109
- ; CHECK-NEXT: [[V2 :%.*]] = insertvalue { ptr addrspace(8), i32 } [[TMP1]], i32 [[V1 ]], 1
110
- ; CHECK-NEXT: ret { ptr addrspace(8), i32 } [[V2 ]]
114
+ ; CHECK-NEXT: [[TMP2 :%.*]] = insertvalue { ptr addrspace(8), i32 } [[TMP1]], i32 [[V2 ]], 1
115
+ ; CHECK-NEXT: ret { ptr addrspace(8), i32 } [[TMP2 ]]
111
116
;
112
117
%v1 = getelementptr i8 , ptr addrspace (7 ) %v0 , i32 %arg
113
118
%v2 = getelementptr i8 , ptr addrspace (7 ) %v1 , i32 0
@@ -119,7 +124,8 @@ define ptr addrspace(7) @zero_gep_goes_first(ptr addrspace(7) %v0, i32 %arg) {
119
124
; CHECK-SAME: ({ ptr addrspace(8), i32 } [[V0:%.*]], i32 [[ARG:%.*]]) #[[ATTR0]] {
120
125
; CHECK-NEXT: [[V0_RSRC:%.*]] = extractvalue { ptr addrspace(8), i32 } [[V0]], 0
121
126
; CHECK-NEXT: [[V0_OFF:%.*]] = extractvalue { ptr addrspace(8), i32 } [[V0]], 1
122
- ; CHECK-NEXT: [[V2:%.*]] = add i32 [[V0_OFF]], [[ARG]]
127
+ ; CHECK-NEXT: [[V1:%.*]] = add i32 [[V0_OFF]], 0
128
+ ; CHECK-NEXT: [[V2:%.*]] = add i32 [[V1]], [[ARG]]
123
129
; CHECK-NEXT: [[TMP1:%.*]] = insertvalue { ptr addrspace(8), i32 } poison, ptr addrspace(8) [[V0_RSRC]], 0
124
130
; CHECK-NEXT: [[TMP2:%.*]] = insertvalue { ptr addrspace(8), i32 } [[TMP1]], i32 [[V2]], 1
125
131
; CHECK-NEXT: ret { ptr addrspace(8), i32 } [[TMP2]]
0 commit comments