@@ -125,3 +125,123 @@ define ptr @multipleUses3(ptr %p) {
125125 %3 = getelementptr inbounds i32 , ptr %1 , i64 %2
126126 ret ptr %3
127127}
128+
129+ define ptr @merge_nuw (ptr %p , i64 %a ) {
130+ ; CHECK-LABEL: @merge_nuw(
131+ ; CHECK-NEXT: [[GEP2:%.*]] = getelementptr nuw i32, ptr [[P:%.*]], i64 [[A:%.*]]
132+ ; CHECK-NEXT: [[GEP3:%.*]] = getelementptr nuw i8, ptr [[GEP2]], i64 5
133+ ; CHECK-NEXT: ret ptr [[GEP3]]
134+ ;
135+ %gep1 = getelementptr nuw i8 , ptr %p , i64 1
136+ %gep2 = getelementptr nuw i32 , ptr %gep1 , i64 %a
137+ %gep3 = getelementptr nuw i32 , ptr %gep2 , i64 1
138+ ret ptr %gep3
139+ }
140+
141+ define ptr @merge_nuw_inbounds (ptr %p , i64 %a ) {
142+ ; CHECK-LABEL: @merge_nuw_inbounds(
143+ ; CHECK-NEXT: [[GEP2:%.*]] = getelementptr inbounds nuw i32, ptr [[P:%.*]], i64 [[A:%.*]]
144+ ; CHECK-NEXT: [[GEP3:%.*]] = getelementptr inbounds nuw i8, ptr [[GEP2]], i64 5
145+ ; CHECK-NEXT: ret ptr [[GEP3]]
146+ ;
147+ %gep1 = getelementptr inbounds nuw i8 , ptr %p , i64 1
148+ %gep2 = getelementptr inbounds nuw i32 , ptr %gep1 , i64 %a
149+ %gep3 = getelementptr inbounds nuw i32 , ptr %gep2 , i64 1
150+ ret ptr %gep3
151+ }
152+
153+ define ptr @merge_nuw_nusw (ptr %p , i64 %a ) {
154+ ; CHECK-LABEL: @merge_nuw_nusw(
155+ ; CHECK-NEXT: [[GEP2:%.*]] = getelementptr nusw nuw i32, ptr [[P:%.*]], i64 [[A:%.*]]
156+ ; CHECK-NEXT: [[GEP3:%.*]] = getelementptr nusw nuw i8, ptr [[GEP2]], i64 5
157+ ; CHECK-NEXT: ret ptr [[GEP3]]
158+ ;
159+ %gep1 = getelementptr nusw nuw i8 , ptr %p , i64 1
160+ %gep2 = getelementptr nusw nuw i32 , ptr %gep1 , i64 %a
161+ %gep3 = getelementptr nusw nuw i32 , ptr %gep2 , i64 1
162+ ret ptr %gep3
163+ }
164+
165+ define ptr @merge_missing_nuw1 (ptr %p , i64 %a ) {
166+ ; CHECK-LABEL: @merge_missing_nuw1(
167+ ; CHECK-NEXT: [[GEP2:%.*]] = getelementptr i32, ptr [[P:%.*]], i64 [[A:%.*]]
168+ ; CHECK-NEXT: [[GEP3:%.*]] = getelementptr i8, ptr [[GEP2]], i64 5
169+ ; CHECK-NEXT: ret ptr [[GEP3]]
170+ ;
171+ %gep1 = getelementptr i8 , ptr %p , i64 1
172+ %gep2 = getelementptr nuw i32 , ptr %gep1 , i64 %a
173+ %gep3 = getelementptr nuw i32 , ptr %gep2 , i64 1
174+ ret ptr %gep3
175+ }
176+
177+ define ptr @merge_missing_nuw2 (ptr %p , i64 %a ) {
178+ ; CHECK-LABEL: @merge_missing_nuw2(
179+ ; CHECK-NEXT: [[GEP2:%.*]] = getelementptr i32, ptr [[P:%.*]], i64 [[A:%.*]]
180+ ; CHECK-NEXT: [[GEP3:%.*]] = getelementptr i8, ptr [[GEP2]], i64 5
181+ ; CHECK-NEXT: ret ptr [[GEP3]]
182+ ;
183+ %gep1 = getelementptr nuw i8 , ptr %p , i64 1
184+ %gep2 = getelementptr i32 , ptr %gep1 , i64 %a
185+ %gep3 = getelementptr nuw i32 , ptr %gep2 , i64 1
186+ ret ptr %gep3
187+ }
188+
189+ define ptr @merge_missing_nuw3 (ptr %p , i64 %a ) {
190+ ; CHECK-LABEL: @merge_missing_nuw3(
191+ ; CHECK-NEXT: [[GEP2:%.*]] = getelementptr i32, ptr [[P:%.*]], i64 [[A:%.*]]
192+ ; CHECK-NEXT: [[GEP3:%.*]] = getelementptr i8, ptr [[GEP2]], i64 5
193+ ; CHECK-NEXT: ret ptr [[GEP3]]
194+ ;
195+ %gep1 = getelementptr nuw i8 , ptr %p , i64 1
196+ %gep2 = getelementptr nuw i32 , ptr %gep1 , i64 %a
197+ %gep3 = getelementptr i32 , ptr %gep2 , i64 1
198+ ret ptr %gep3
199+ }
200+
201+ define ptr @merge_nuw_missing_inbounds (ptr %p , i64 %a ) {
202+ ; CHECK-LABEL: @merge_nuw_missing_inbounds(
203+ ; CHECK-NEXT: [[GEP2:%.*]] = getelementptr nuw i32, ptr [[P:%.*]], i64 [[A:%.*]]
204+ ; CHECK-NEXT: [[GEP3:%.*]] = getelementptr nuw i8, ptr [[GEP2]], i64 5
205+ ; CHECK-NEXT: ret ptr [[GEP3]]
206+ ;
207+ %gep1 = getelementptr nuw i8 , ptr %p , i64 1
208+ %gep2 = getelementptr inbounds nuw i32 , ptr %gep1 , i64 %a
209+ %gep3 = getelementptr inbounds nuw i32 , ptr %gep2 , i64 1
210+ ret ptr %gep3
211+ }
212+
213+ define ptr @merge_nuw_missing_nusw (ptr %p , i64 %a ) {
214+ ; CHECK-LABEL: @merge_nuw_missing_nusw(
215+ ; CHECK-NEXT: [[GEP2:%.*]] = getelementptr nuw i32, ptr [[P:%.*]], i64 [[A:%.*]]
216+ ; CHECK-NEXT: [[GEP3:%.*]] = getelementptr nuw i8, ptr [[GEP2]], i64 5
217+ ; CHECK-NEXT: ret ptr [[GEP3]]
218+ ;
219+ %gep1 = getelementptr nusw nuw i8 , ptr %p , i64 1
220+ %gep2 = getelementptr nuw i32 , ptr %gep1 , i64 %a
221+ %gep3 = getelementptr nusw nuw i32 , ptr %gep2 , i64 1
222+ ret ptr %gep3
223+ }
224+
225+ define ptr @merge_inbounds_missing_nuw (ptr %p , i64 %a ) {
226+ ; CHECK-LABEL: @merge_inbounds_missing_nuw(
227+ ; CHECK-NEXT: [[GEP2:%.*]] = getelementptr i32, ptr [[P:%.*]], i64 [[A:%.*]]
228+ ; CHECK-NEXT: [[GEP3:%.*]] = getelementptr i8, ptr [[GEP2]], i64 5
229+ ; CHECK-NEXT: ret ptr [[GEP3]]
230+ ;
231+ %gep1 = getelementptr inbounds nuw i8 , ptr %p , i64 1
232+ %gep2 = getelementptr inbounds i32 , ptr %gep1 , i64 %a
233+ %gep3 = getelementptr inbounds nuw i32 , ptr %gep2 , i64 1
234+ ret ptr %gep3
235+ }
236+
237+ define ptr @merge_nusw_missing_nuw (ptr %p , i64 %a ) {
238+ ; CHECK-LABEL: @merge_nusw_missing_nuw(
239+ ; CHECK-NEXT: [[GEP2:%.*]] = getelementptr i32, ptr [[P:%.*]], i64 [[A:%.*]]
240+ ; CHECK-NEXT: [[GEP3:%.*]] = getelementptr i8, ptr [[GEP2]], i64 5
241+ ; CHECK-NEXT: ret ptr [[GEP3]]
242+ ;
243+ %gep1 = getelementptr nusw nuw i8 , ptr %p , i64 1
244+ %gep2 = getelementptr nusw i32 , ptr %gep1 , i64 %a
245+ %gep3 = getelementptr nusw nuw i32 , ptr %gep2 , i64 1
246+ ret ptr %gep3
247+ }
0 commit comments