@@ -11,13 +11,13 @@ define void @only_one_inbounds(ptr %ptr, i1 %c, i32 %arg) {
11
11
; CHECK-SAME: (ptr [[PTR:%.*]], i1 [[C:%.*]], i32 [[ARG:%.*]]) {
12
12
; CHECK-NEXT: entry:
13
13
; CHECK-NEXT: [[ARG_EXT:%.*]] = zext i32 [[ARG]] to i64
14
+ ; CHECK-NEXT: [[INVARIANT_GEP:%.*]] = getelementptr i8, ptr [[PTR]], i64 [[ARG_EXT]]
14
15
; CHECK-NEXT: br label [[LOOP:%.*]]
15
16
; CHECK: loop:
16
17
; CHECK-NEXT: [[VAL:%.*]] = call i32 @get.i32()
17
18
; CHECK-NEXT: [[VAL_EXT:%.*]] = zext i32 [[VAL]] to i64
18
- ; CHECK-NEXT: [[PTR2:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i64 [[VAL_EXT]]
19
- ; CHECK-NEXT: [[PTR3:%.*]] = getelementptr i8, ptr [[PTR2]], i64 [[ARG_EXT]]
20
- ; CHECK-NEXT: call void @use(ptr [[PTR3]])
19
+ ; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[INVARIANT_GEP]], i64 [[VAL_EXT]]
20
+ ; CHECK-NEXT: call void @use(ptr [[GEP]])
21
21
; CHECK-NEXT: br i1 [[C]], label [[LOOP]], label [[EXIT:%.*]]
22
22
; CHECK: exit:
23
23
; CHECK-NEXT: ret void
@@ -42,13 +42,13 @@ define void @both_inbounds_one_neg(ptr %ptr, i1 %c) {
42
42
; CHECK-LABEL: define void @both_inbounds_one_neg
43
43
; CHECK-SAME: (ptr [[PTR:%.*]], i1 [[C:%.*]]) {
44
44
; CHECK-NEXT: entry:
45
+ ; CHECK-NEXT: [[INVARIANT_GEP:%.*]] = getelementptr i8, ptr [[PTR]], i64 -1
45
46
; CHECK-NEXT: br label [[LOOP:%.*]]
46
47
; CHECK: loop:
47
48
; CHECK-NEXT: [[VAL:%.*]] = call i32 @get.i32()
48
49
; CHECK-NEXT: [[VAL_EXT:%.*]] = zext i32 [[VAL]] to i64
49
- ; CHECK-NEXT: [[PTR2:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i64 [[VAL_EXT]]
50
- ; CHECK-NEXT: [[PTR3:%.*]] = getelementptr i8, ptr [[PTR2]], i64 -1
51
- ; CHECK-NEXT: call void @use(ptr [[PTR3]])
50
+ ; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[INVARIANT_GEP]], i64 [[VAL_EXT]]
51
+ ; CHECK-NEXT: call void @use(ptr [[GEP]])
52
52
; CHECK-NEXT: br i1 [[C]], label [[LOOP]], label [[EXIT:%.*]]
53
53
; CHECK: exit:
54
54
; CHECK-NEXT: ret void
@@ -72,13 +72,13 @@ define void @both_inbounds_pos(ptr %ptr, i1 %c) {
72
72
; CHECK-LABEL: define void @both_inbounds_pos
73
73
; CHECK-SAME: (ptr [[PTR:%.*]], i1 [[C:%.*]]) {
74
74
; CHECK-NEXT: entry:
75
+ ; CHECK-NEXT: [[INVARIANT_GEP:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i64 1
75
76
; CHECK-NEXT: br label [[LOOP:%.*]]
76
77
; CHECK: loop:
77
78
; CHECK-NEXT: [[VAL:%.*]] = call i32 @get.i32()
78
79
; CHECK-NEXT: [[VAL_EXT:%.*]] = zext i32 [[VAL]] to i64
79
- ; CHECK-NEXT: [[PTR2:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i64 [[VAL_EXT]]
80
- ; CHECK-NEXT: [[PTR3:%.*]] = getelementptr inbounds i8, ptr [[PTR2]], i64 1
81
- ; CHECK-NEXT: call void @use(ptr [[PTR3]])
80
+ ; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds i8, ptr [[INVARIANT_GEP]], i64 [[VAL_EXT]]
81
+ ; CHECK-NEXT: call void @use(ptr [[GEP]])
82
82
; CHECK-NEXT: br i1 [[C]], label [[LOOP]], label [[EXIT:%.*]]
83
83
; CHECK: exit:
84
84
; CHECK-NEXT: ret void
@@ -102,12 +102,12 @@ define void @different_elem_types(ptr %ptr, i1 %c, i64 %arg) {
102
102
; CHECK-LABEL: define void @different_elem_types
103
103
; CHECK-SAME: (ptr [[PTR:%.*]], i1 [[C:%.*]], i64 [[ARG:%.*]]) {
104
104
; CHECK-NEXT: entry:
105
+ ; CHECK-NEXT: [[INVARIANT_GEP:%.*]] = getelementptr i64, ptr [[PTR]], i64 [[ARG]]
105
106
; CHECK-NEXT: br label [[LOOP:%.*]]
106
107
; CHECK: loop:
107
108
; CHECK-NEXT: [[VAL:%.*]] = call i64 @get.i64()
108
- ; CHECK-NEXT: [[PTR2:%.*]] = getelementptr i32, ptr [[PTR]], i64 [[VAL]]
109
- ; CHECK-NEXT: [[PTR3:%.*]] = getelementptr i64, ptr [[PTR2]], i64 [[ARG]]
110
- ; CHECK-NEXT: call void @use(ptr [[PTR3]])
109
+ ; CHECK-NEXT: [[GEP:%.*]] = getelementptr i32, ptr [[INVARIANT_GEP]], i64 [[VAL]]
110
+ ; CHECK-NEXT: call void @use(ptr [[GEP]])
111
111
; CHECK-NEXT: br i1 [[C]], label [[LOOP]], label [[EXIT:%.*]]
112
112
; CHECK: exit:
113
113
; CHECK-NEXT: ret void
@@ -126,6 +126,62 @@ exit:
126
126
ret void
127
127
}
128
128
129
+ define void @different_index_types (ptr %ptr , i1 %c , i32 %arg ) {
130
+ ; CHECK-LABEL: define void @different_index_types
131
+ ; CHECK-SAME: (ptr [[PTR:%.*]], i1 [[C:%.*]], i32 [[ARG:%.*]]) {
132
+ ; CHECK-NEXT: entry:
133
+ ; CHECK-NEXT: [[INVARIANT_GEP:%.*]] = getelementptr i8, ptr [[PTR]], i32 [[ARG]]
134
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
135
+ ; CHECK: loop:
136
+ ; CHECK-NEXT: [[VAL:%.*]] = call i64 @get.i64()
137
+ ; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[INVARIANT_GEP]], i64 [[VAL]]
138
+ ; CHECK-NEXT: call void @use(ptr [[GEP]])
139
+ ; CHECK-NEXT: br i1 [[C]], label [[LOOP]], label [[EXIT:%.*]]
140
+ ; CHECK: exit:
141
+ ; CHECK-NEXT: ret void
142
+ ;
143
+ entry:
144
+ br label %loop
145
+
146
+ loop:
147
+ %val = call i64 @get.i64 ()
148
+ %ptr2 = getelementptr i8 , ptr %ptr , i64 %val
149
+ %ptr3 = getelementptr i8 , ptr %ptr2 , i32 %arg
150
+ call void @use (ptr %ptr3 )
151
+ br i1 %c , label %loop , label %exit
152
+
153
+ exit:
154
+ ret void
155
+ }
156
+
157
+ define void @different_index_count (ptr %ptr , i1 %c , i64 %arg1 , i64 %arg2 ) {
158
+ ; CHECK-LABEL: define void @different_index_count
159
+ ; CHECK-SAME: (ptr [[PTR:%.*]], i1 [[C:%.*]], i64 [[ARG1:%.*]], i64 [[ARG2:%.*]]) {
160
+ ; CHECK-NEXT: entry:
161
+ ; CHECK-NEXT: [[INVARIANT_GEP:%.*]] = getelementptr [0 x i8], ptr [[PTR]], i64 [[ARG1]], i64 [[ARG2]]
162
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
163
+ ; CHECK: loop:
164
+ ; CHECK-NEXT: [[VAL:%.*]] = call i64 @get.i64()
165
+ ; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[INVARIANT_GEP]], i64 [[VAL]]
166
+ ; CHECK-NEXT: call void @use(ptr [[GEP]])
167
+ ; CHECK-NEXT: br i1 [[C]], label [[LOOP]], label [[EXIT:%.*]]
168
+ ; CHECK: exit:
169
+ ; CHECK-NEXT: ret void
170
+ ;
171
+ entry:
172
+ br label %loop
173
+
174
+ loop:
175
+ %val = call i64 @get.i64 ()
176
+ %ptr2 = getelementptr i8 , ptr %ptr , i64 %val
177
+ %ptr3 = getelementptr [0 x i8 ], ptr %ptr2 , i64 %arg1 , i64 %arg2
178
+ call void @use (ptr %ptr3 )
179
+ br i1 %c , label %loop , label %exit
180
+
181
+ exit:
182
+ ret void
183
+ }
184
+
129
185
define void @src_has_extra_use (ptr %ptr , i1 %c , i64 %arg ) {
130
186
; CHECK-LABEL: define void @src_has_extra_use
131
187
; CHECK-SAME: (ptr [[PTR:%.*]], i1 [[C:%.*]], i64 [[ARG:%.*]]) {
@@ -246,13 +302,13 @@ define void @multiple_indices(ptr %ptr, i1 %c, i64 %arg1, i64 %arg2) {
246
302
; CHECK-LABEL: define void @multiple_indices
247
303
; CHECK-SAME: (ptr [[PTR:%.*]], i1 [[C:%.*]], i64 [[ARG1:%.*]], i64 [[ARG2:%.*]]) {
248
304
; CHECK-NEXT: entry:
305
+ ; CHECK-NEXT: [[INVARIANT_GEP:%.*]] = getelementptr [0 x i8], ptr [[PTR]], i64 [[ARG1]], i64 [[ARG2]]
249
306
; CHECK-NEXT: br label [[LOOP:%.*]]
250
307
; CHECK: loop:
251
308
; CHECK-NEXT: [[VAL1:%.*]] = call i64 @get.i64()
252
309
; CHECK-NEXT: [[VAL2:%.*]] = call i64 @get.i64()
253
- ; CHECK-NEXT: [[PTR2:%.*]] = getelementptr [0 x i8], ptr [[PTR]], i64 [[VAL1]], i64 [[VAL2]]
254
- ; CHECK-NEXT: [[PTR3:%.*]] = getelementptr [0 x i8], ptr [[PTR2]], i64 [[ARG1]], i64 [[ARG2]]
255
- ; CHECK-NEXT: call void @use(ptr [[PTR3]])
310
+ ; CHECK-NEXT: [[GEP:%.*]] = getelementptr [0 x i8], ptr [[INVARIANT_GEP]], i64 [[VAL1]], i64 [[VAL2]]
311
+ ; CHECK-NEXT: call void @use(ptr [[GEP]])
256
312
; CHECK-NEXT: br i1 [[C]], label [[LOOP]], label [[EXIT:%.*]]
257
313
; CHECK: exit:
258
314
; CHECK-NEXT: ret void
@@ -308,12 +364,12 @@ define void @multiple_indices_very_invariant(ptr %ptr, i1 %c, i64 %arg1, i64 %ar
308
364
; CHECK-LABEL: define void @multiple_indices_very_invariant
309
365
; CHECK-SAME: (ptr [[PTR:%.*]], i1 [[C:%.*]], i64 [[ARG1:%.*]], i64 [[ARG2:%.*]], i64 [[ARG3:%.*]]) {
310
366
; CHECK-NEXT: entry:
367
+ ; CHECK-NEXT: [[INVARIANT_GEP:%.*]] = getelementptr [0 x i8], ptr [[PTR]], i64 [[ARG1]], i64 [[ARG2]]
311
368
; CHECK-NEXT: br label [[LOOP:%.*]]
312
369
; CHECK: loop:
313
370
; CHECK-NEXT: [[VAL1:%.*]] = call i64 @get.i64()
314
- ; CHECK-NEXT: [[PTR2:%.*]] = getelementptr [0 x i8], ptr [[PTR]], i64 [[ARG3]], i64 [[VAL1]]
315
- ; CHECK-NEXT: [[PTR3:%.*]] = getelementptr [0 x i8], ptr [[PTR2]], i64 [[ARG1]], i64 [[ARG2]]
316
- ; CHECK-NEXT: call void @use(ptr [[PTR3]])
371
+ ; CHECK-NEXT: [[GEP:%.*]] = getelementptr [0 x i8], ptr [[INVARIANT_GEP]], i64 [[ARG3]], i64 [[VAL1]]
372
+ ; CHECK-NEXT: call void @use(ptr [[GEP]])
317
373
; CHECK-NEXT: br i1 [[C]], label [[LOOP]], label [[EXIT:%.*]]
318
374
; CHECK: exit:
319
375
; CHECK-NEXT: ret void
0 commit comments