@@ -272,12 +272,13 @@ define i64 @test25(ptr %P, i64 %A){
272272
273273define i64 @zext_ptrtoint_sub_ptrtoint (ptr %p , i32 %offset ) {
274274; CHECK-LABEL: @zext_ptrtoint_sub_ptrtoint(
275- ; CHECK-NEXT: %1 = sext i32 %offset to i64
276- ; CHECK-NEXT: %A = getelementptr bfloat, ptr @Arr, i64 %1
277- ; CHECK-NEXT: %2 = ptrtoint ptr %A to i64
278- ; CHECK-NEXT: %C = and i64 %2, 4294967294
279- ; CHECK-NEXT: %D = sub i64 %C, ptrtoint (ptr @Arr to i64)
280- ; CHECK-NEXT: ret i64 %D
275+ ; CHECK-NEXT: [[TMP1:%.*]] = sext i32 [[OFFSET:%.*]] to i64
276+ ; CHECK-NEXT: [[A:%.*]] = getelementptr bfloat, ptr @Arr, i64 [[TMP1]]
277+ ; CHECK-NEXT: [[TMP2:%.*]] = ptrtoint ptr [[A]] to i64
278+ ; CHECK-NEXT: [[C:%.*]] = and i64 [[TMP2]], 4294967294
279+ ; CHECK-NEXT: [[D:%.*]] = sub i64 [[C]], ptrtoint (ptr @Arr to i64)
280+ ; CHECK-NEXT: ret i64 [[D]]
281+ ;
281282 %A = getelementptr bfloat, ptr @Arr , i32 %offset
282283 %B = ptrtoint ptr %A to i32
283284 %C = zext i32 %B to i64
@@ -287,19 +288,52 @@ define i64 @zext_ptrtoint_sub_ptrtoint(ptr %p, i32 %offset) {
287288
288289define i64 @ptrtoint_sub_zext_ptrtoint (ptr %p , i32 %offset ) {
289290; CHECK-LABEL: @ptrtoint_sub_zext_ptrtoint(
290- ; CHECK-NEXT: %1 = sext i32 %offset to i64
291- ; CHECK-NEXT: %A = getelementptr bfloat, ptr @Arr, i64 %1
292- ; CHECK-NEXT: %2 = ptrtoint ptr %A to i64
293- ; CHECK-NEXT: %C = and i64 %2, 4294967294
294- ; CHECK-NEXT: %D = sub i64 ptrtoint (ptr @Arr to i64), %C
295- ; CHECK-NEXT: ret i64 %D
291+ ; CHECK-NEXT: [[TMP1:%.*]] = sext i32 [[OFFSET:%.*]] to i64
292+ ; CHECK-NEXT: [[A:%.*]] = getelementptr bfloat, ptr @Arr, i64 [[TMP1]]
293+ ; CHECK-NEXT: [[TMP2:%.*]] = ptrtoint ptr [[A]] to i64
294+ ; CHECK-NEXT: [[C:%.*]] = and i64 [[TMP2]], 4294967294
295+ ; CHECK-NEXT: [[D:%.*]] = sub i64 ptrtoint (ptr @Arr to i64), [[C]]
296+ ; CHECK-NEXT: ret i64 [[D]]
297+ ;
296298 %A = getelementptr bfloat, ptr @Arr , i32 %offset
297299 %B = ptrtoint ptr %A to i32
298300 %C = zext i32 %B to i64
299301 %D = sub i64 ptrtoint (ptr @Arr to i64 ), %C
300302 ret i64 %D
301303}
302304
305+ define i64 @negative_zext_ptrtoint_sub_ptrtoint (ptr %p , i32 %offset ) {
306+ ; CHECK-LABEL: @negative_zext_ptrtoint_sub_ptrtoint(
307+ ; CHECK-NEXT: [[TMP1:%.*]] = sext i32 [[OFFSET:%.*]] to i64
308+ ; CHECK-NEXT: [[A:%.*]] = getelementptr bfloat, ptr @Arr, i64 [[TMP1]]
309+ ; CHECK-NEXT: [[TMP2:%.*]] = ptrtoint ptr [[A]] to i64
310+ ; CHECK-NEXT: [[C:%.*]] = and i64 [[TMP2]], 65534
311+ ; CHECK-NEXT: [[D:%.*]] = sub i64 [[C]], ptrtoint (ptr @Arr to i64)
312+ ; CHECK-NEXT: ret i64 [[D]]
313+ ;
314+ %A = getelementptr bfloat, ptr @Arr , i32 %offset
315+ %B = ptrtoint ptr %A to i16
316+ %C = zext i16 %B to i64
317+ %D = sub i64 %C , ptrtoint (ptr @Arr to i64 )
318+ ret i64 %D
319+ }
320+
321+ define i64 @negative_ptrtoint_sub_zext_ptrtoint (ptr %p , i32 %offset ) {
322+ ; CHECK-LABEL: @negative_ptrtoint_sub_zext_ptrtoint(
323+ ; CHECK-NEXT: [[TMP1:%.*]] = sext i32 [[OFFSET:%.*]] to i64
324+ ; CHECK-NEXT: [[A:%.*]] = getelementptr bfloat, ptr @Arr, i64 [[TMP1]]
325+ ; CHECK-NEXT: [[TMP2:%.*]] = ptrtoint ptr [[A]] to i64
326+ ; CHECK-NEXT: [[C:%.*]] = and i64 [[TMP2]], 65534
327+ ; CHECK-NEXT: [[D:%.*]] = sub i64 ptrtoint (ptr @Arr to i64), [[C]]
328+ ; CHECK-NEXT: ret i64 [[D]]
329+ ;
330+ %A = getelementptr bfloat, ptr @Arr , i32 %offset
331+ %B = ptrtoint ptr %A to i16
332+ %C = zext i16 %B to i64
333+ %D = sub i64 ptrtoint (ptr @Arr to i64 ), %C
334+ ret i64 %D
335+ }
336+
303337@Arr_as1 = external addrspace (1 ) global [42 x i16 ]
304338
305339define i16 @test25_as1 (ptr addrspace (1 ) %P , i64 %A ) {
@@ -316,11 +350,28 @@ define i16 @test25_as1(ptr addrspace(1) %P, i64 %A) {
316350}
317351
318352@Arr_as2 = external addrspace (2 ) global [42 x i16 ]
319- define i64 @zext_ptrtoint_sub_ptrtoint_as2 (i32 %offset ) {
320- ; CHECK-LABEL: @zext_ptrtoint_sub_ptrtoint_as2(
321- ; CHECK-NEXT: %A.idx = shl nsw i32 %offset, 1
322- ; CHECK-NEXT: %D = sext i32 %A.idx to i64
323- ; CHECK-NEXT: ret i64 %D
353+
354+ define i64 @ptrtoint_sub_zext_ptrtoint_as2_inbounds (i32 %offset ) {
355+ ; CHECK-LABEL: @ptrtoint_sub_zext_ptrtoint_as2_inbounds(
356+ ; CHECK-NEXT: [[A:%.*]] = getelementptr inbounds bfloat, ptr addrspace(2) @Arr_as2, i32 [[OFFSET:%.*]]
357+ ; CHECK-NEXT: [[B:%.*]] = ptrtoint ptr addrspace(2) [[A]] to i32
358+ ; CHECK-NEXT: [[C:%.*]] = zext i32 [[B]] to i64
359+ ; CHECK-NEXT: [[D:%.*]] = sub nsw i64 ptrtoint (ptr addrspace(2) @Arr_as2 to i64), [[C]]
360+ ; CHECK-NEXT: ret i64 [[D]]
361+ ;
362+ %A = getelementptr inbounds bfloat, ptr addrspace (2 ) @Arr_as2 , i32 %offset
363+ %B = ptrtoint ptr addrspace (2 ) %A to i32
364+ %C = zext i32 %B to i64
365+ %D = sub i64 ptrtoint (ptr addrspace (2 ) @Arr_as2 to i64 ), %C
366+ ret i64 %D
367+ }
368+
369+ define i64 @zext_ptrtoint_sub_ptrtoint_as2_nusw (i32 %offset ) {
370+ ; CHECK-LABEL: @zext_ptrtoint_sub_ptrtoint_as2_nusw(
371+ ; CHECK-NEXT: [[A_IDX:%.*]] = shl nsw i32 [[OFFSET:%.*]], 1
372+ ; CHECK-NEXT: [[D:%.*]] = sext i32 [[A_IDX]] to i64
373+ ; CHECK-NEXT: ret i64 [[D]]
374+ ;
324375 %A = getelementptr nusw bfloat, ptr addrspace (2 ) @Arr_as2 , i32 %offset
325376 %B = ptrtoint ptr addrspace (2 ) %A to i32
326377 %C = zext i32 %B to i64
@@ -330,9 +381,10 @@ define i64 @zext_ptrtoint_sub_ptrtoint_as2(i32 %offset) {
330381
331382define i64 @zext_ptrtoint_sub_ptrtoint_as2_nuw (i32 %offset ) {
332383; CHECK-LABEL: @zext_ptrtoint_sub_ptrtoint_as2_nuw(
333- ; CHECK-NEXT: %A.idx = shl nuw i32 %offset, 1
334- ; CHECK-NEXT: %D = zext i32 %A.idx to i64
335- ; CHECK-NEXT: ret i64 %D
384+ ; CHECK-NEXT: [[A_IDX:%.*]] = shl nuw i32 [[OFFSET:%.*]], 1
385+ ; CHECK-NEXT: [[D:%.*]] = zext i32 [[A_IDX]] to i64
386+ ; CHECK-NEXT: ret i64 [[D]]
387+ ;
336388 %A = getelementptr nuw bfloat, ptr addrspace (2 ) @Arr_as2 , i32 %offset
337389 %B = ptrtoint ptr addrspace (2 ) %A to i32
338390 %C = zext i32 %B to i64
@@ -342,21 +394,23 @@ define i64 @zext_ptrtoint_sub_ptrtoint_as2_nuw(i32 %offset) {
342394
343395define i64 @zext_ptrtoint_sub_ptrtoint_as2_nusw_nuw (i32 %offset ) {
344396; CHECK-LABEL: @zext_ptrtoint_sub_ptrtoint_as2_nusw_nuw(
345- ; CHECK-NEXT: %A.idx = shl nuw nsw i32 %offset, 1
346- ; CHECK-NEXT: %D = zext nneg i32 %A.idx to i64
347- ; CHECK-NEXT: ret i64 %D
397+ ; CHECK-NEXT: [[A_IDX:%.*]] = shl nuw nsw i32 [[OFFSET:%.*]], 1
398+ ; CHECK-NEXT: [[D:%.*]] = zext nneg i32 [[A_IDX]] to i64
399+ ; CHECK-NEXT: ret i64 [[D]]
400+ ;
348401 %A = getelementptr nusw nuw bfloat, ptr addrspace (2 ) @Arr_as2 , i32 %offset
349402 %B = ptrtoint ptr addrspace (2 ) %A to i32
350403 %C = zext i32 %B to i64
351404 %D = sub i64 %C , ptrtoint (ptr addrspace (2 ) @Arr_as2 to i64 )
352405 ret i64 %D
353406}
354407
355- define i64 @zext_ptrtoint_sub_zext_ptrtoint_as2 (i32 %offset ) {
356- ; CHECK-LABEL: @zext_ptrtoint_sub_zext_ptrtoint_as2(
357- ; CHECK-NEXT: %A.idx = shl nsw i32 %offset, 1
358- ; CHECK-NEXT: %E = sext i32 %A.idx to i64
359- ; CHECK-NEXT: ret i64 %E
408+ define i64 @zext_ptrtoint_sub_zext_ptrtoint_as2_nusw (i32 %offset ) {
409+ ; CHECK-LABEL: @zext_ptrtoint_sub_zext_ptrtoint_as2_nusw(
410+ ; CHECK-NEXT: [[A_IDX:%.*]] = shl nsw i32 [[OFFSET:%.*]], 1
411+ ; CHECK-NEXT: [[E:%.*]] = sext i32 [[A_IDX]] to i64
412+ ; CHECK-NEXT: ret i64 [[E]]
413+ ;
360414 %A = getelementptr nusw bfloat, ptr addrspace (2 ) @Arr_as2 , i32 %offset
361415 %B = ptrtoint ptr addrspace (2 ) %A to i32
362416 %C = zext i32 %B to i64
@@ -367,9 +421,10 @@ define i64 @zext_ptrtoint_sub_zext_ptrtoint_as2(i32 %offset) {
367421
368422define i64 @zext_ptrtoint_sub_zext_ptrtoint_as2_nuw (i32 %offset ) {
369423; CHECK-LABEL: @zext_ptrtoint_sub_zext_ptrtoint_as2_nuw(
370- ; CHECK-NEXT: %A.idx = shl nuw i32 %offset, 1
371- ; CHECK-NEXT: %E = zext i32 %A.idx to i64
372- ; CHECK-NEXT: ret i64 %E
424+ ; CHECK-NEXT: [[A_IDX:%.*]] = shl nuw i32 [[OFFSET:%.*]], 1
425+ ; CHECK-NEXT: [[E:%.*]] = zext i32 [[A_IDX]] to i64
426+ ; CHECK-NEXT: ret i64 [[E]]
427+ ;
373428 %A = getelementptr nuw bfloat, ptr addrspace (2 ) @Arr_as2 , i32 %offset
374429 %B = ptrtoint ptr addrspace (2 ) %A to i32
375430 %C = zext i32 %B to i64
@@ -379,34 +434,21 @@ define i64 @zext_ptrtoint_sub_zext_ptrtoint_as2_nuw(i32 %offset) {
379434}
380435
381436define i64 @negative_zext_ptrtoint_sub_ptrtoint_as2_nuw (i32 %offset ) {
382- ; CHECK-LABEL: @negative_zext_ptrtoint_sub_ptrtoint_as2_nuw(
383- ; CHECK-NEXT: %A = getelementptr nuw bfloat, ptr addrspace(2) @Arr_as2, i32 %offset
384- ; CHECK-NEXT: %1 = ptrtoint ptr addrspace(2) %A to i32
385- ; CHECK-NEXT: %B.mask = and i32 %1, 65534
386- ; CHECK-NEXT: %C = zext nneg i32 %B.mask to i64
387- ; CHECK-NEXT: %D = sub nsw i64 %C, ptrtoint (ptr addrspace(2) @Arr_as2 to i64)
388- ; CHECK-NEXT: ret i64 %D
437+ ; CHECK-LABEL: @negative_zext_ptrtoint_sub_ptrtoint_as2_nuw(
438+ ; CHECK-NEXT: [[A:%.*]] = getelementptr nuw bfloat, ptr addrspace(2) @Arr_as2, i32 [[OFFSET:%.*]]
439+ ; CHECK-NEXT: [[TMP1:%.*]] = ptrtoint ptr addrspace(2) [[A]] to i32
440+ ; CHECK-NEXT: [[B_MASK:%.*]] = and i32 [[TMP1]], 65534
441+ ; CHECK-NEXT: [[C:%.*]] = zext nneg i32 [[B_MASK]] to i64
442+ ; CHECK-NEXT: [[D:%.*]] = sub nsw i64 [[C]], ptrtoint (ptr addrspace(2) @Arr_as2 to i64)
443+ ; CHECK-NEXT: ret i64 [[D]]
444+ ;
389445 %A = getelementptr nuw bfloat, ptr addrspace (2 ) @Arr_as2 , i32 %offset
390446 %B = ptrtoint ptr addrspace (2 ) %A to i16
391447 %C = zext i16 %B to i64
392448 %D = sub i64 %C , ptrtoint (ptr addrspace (2 ) @Arr_as2 to i64 )
393449 ret i64 %D
394450}
395451
396- define i64 @ptrtoint_sub_zext_ptrtoint_as2 (i32 %offset ) {
397- ; CHECK-LABEL: @ptrtoint_sub_zext_ptrtoint_as2(
398- ; CHECK-NEXT: %A = getelementptr inbounds bfloat, ptr addrspace(2) @Arr_as2, i32 %offset
399- ; CHECK-NEXT: %B = ptrtoint ptr addrspace(2) %A to i32
400- ; CHECK-NEXT: %C = zext i32 %B to i64
401- ; CHECK-NEXT: %D = sub nsw i64 ptrtoint (ptr addrspace(2) @Arr_as2 to i64), %C
402- ; CHECK-NEXT: ret i64 %D
403- %A = getelementptr inbounds bfloat, ptr addrspace (2 ) @Arr_as2 , i32 %offset
404- %B = ptrtoint ptr addrspace (2 ) %A to i32
405- %C = zext i32 %B to i64
406- %D = sub i64 ptrtoint (ptr addrspace (2 ) @Arr_as2 to i64 ), %C
407- ret i64 %D
408- }
409-
410452define i64 @test30 (ptr %foo , i64 %i , i64 %j ) {
411453; CHECK-LABEL: @test30(
412454; CHECK-NEXT: [[GEP1_IDX:%.*]] = shl nsw i64 [[I:%.*]], 2
0 commit comments