https://github.com/nikic created 
https://github.com/llvm/llvm-project/pull/184127

This will use ptrtoaddr instead of ptrtoint in the pointer difference 
calculation, avoiding unnecessary provenance exposure.

Add an IsNUW flag to allow specifying nuw on the subtraction.

>From 5d192b2ec7c21bc9cae661ba3b6baa283bdd95a0 Mon Sep 17 00:00:00 2001
From: Nikita Popov <[email protected]>
Date: Mon, 2 Mar 2026 14:52:46 +0100
Subject: [PATCH] [OpenMP] Use CreatePtrDiff()

This will use ptrtoaddr instead of ptrtoint in the pointer
difference calculation.

Add a IsNUW flag to allow specifying nuw on the subtraction.
---
 clang/lib/CodeGen/CGOpenMPRuntime.cpp         |   4 +-
 .../OpenMP/target_task_affinity_codegen.cpp   |  48 ++--
 clang/test/OpenMP/task_codegen.cpp            | 234 +++++++++---------
 llvm/include/llvm/IR/IRBuilder.h              |   3 +-
 llvm/lib/IR/IRBuilder.cpp                     |   5 +-
 5 files changed, 147 insertions(+), 147 deletions(-)

diff --git a/clang/lib/CodeGen/CGOpenMPRuntime.cpp 
b/clang/lib/CodeGen/CGOpenMPRuntime.cpp
index dececc079953d..09cc8c25538e2 100644
--- a/clang/lib/CodeGen/CGOpenMPRuntime.cpp
+++ b/clang/lib/CodeGen/CGOpenMPRuntime.cpp
@@ -3729,9 +3729,7 @@ getPointerAndSize(CodeGenFunction &CGF, const Expr *E) {
     llvm::Value *UpAddr = CGF.Builder.CreateConstGEP1_32(
         UpAddrAddress.getElementType(), UpAddrAddress.emitRawPointer(CGF),
         /*Idx0=*/1);
-    llvm::Value *LowIntPtr = CGF.Builder.CreatePtrToInt(Addr, CGF.SizeTy);
-    llvm::Value *UpIntPtr = CGF.Builder.CreatePtrToInt(UpAddr, CGF.SizeTy);
-    SizeVal = CGF.Builder.CreateNUWSub(UpIntPtr, LowIntPtr);
+    SizeVal = CGF.Builder.CreatePtrDiff(UpAddr, Addr, "", /*IsNUW=*/true);
   } else {
     SizeVal = CGF.getTypeSize(Ty);
   }
diff --git a/clang/test/OpenMP/target_task_affinity_codegen.cpp 
b/clang/test/OpenMP/target_task_affinity_codegen.cpp
index 7bc1acb245388..4f8d709ece04d 100644
--- a/clang/test/OpenMP/target_task_affinity_codegen.cpp
+++ b/clang/test/OpenMP/target_task_affinity_codegen.cpp
@@ -204,23 +204,23 @@ int main() {
 // CHECK1-NEXT:    [[B_ADDR:%.*]] = alloca ptr, align 8
 // CHECK1-NEXT:    [[A_ADDR:%.*]] = alloca ptr, align 8
 // CHECK1-NEXT:    [[AGG_CAPTURED:%.*]] = alloca [[STRUCT_ANON:%.*]], align 8
-// CHECK1-NEXT:    [[DOTAFFS_ARR_ADDR:%.*]] = alloca [1 x 
%struct.kmp_task_affinity_info_t], align 8
+// CHECK1-NEXT:    [[DOTAFFS_ARR_ADDR:%.*]] = alloca [1 x 
[[STRUCT_KMP_TASK_AFFINITY_INFO_T:%.*]]], align 8
 // CHECK1-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr 
@[[GLOB1]])
 // CHECK1-NEXT:    store ptr [[B]], ptr [[B_ADDR]], align 8
 // CHECK1-NEXT:    store ptr [[A]], ptr [[A_ADDR]], align 8
 // CHECK1-NEXT:    [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON]], 
ptr [[AGG_CAPTURED]], i32 0, i32 0
 // CHECK1-NEXT:    store ptr [[B_ADDR]], ptr [[TMP1]], align 8
 // CHECK1-NEXT:    [[TMP2:%.*]] = call ptr @__kmpc_omp_task_alloc(ptr 
@[[GLOB1]], i32 [[TMP0]], i32 1, i64 48, i64 8, ptr @.omp_task_entry.)
-// CHECK1-NEXT:    [[TMP3:%.*]] = getelementptr inbounds [1 x 
%struct.kmp_task_affinity_info_t], ptr [[DOTAFFS_ARR_ADDR]], i64 0, i64 0
+// CHECK1-NEXT:    [[TMP3:%.*]] = getelementptr inbounds [1 x 
[[STRUCT_KMP_TASK_AFFINITY_INFO_T]]], ptr [[DOTAFFS_ARR_ADDR]], i64 0, i64 0
 // CHECK1-NEXT:    [[TMP4:%.*]] = load ptr, ptr [[A_ADDR]], align 8
 // CHECK1-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds nuw i32, ptr 
[[TMP4]], i64 0
 // CHECK1-NEXT:    [[TMP5:%.*]] = load ptr, ptr [[A_ADDR]], align 8
 // CHECK1-NEXT:    [[ARRAYIDX1:%.*]] = getelementptr inbounds nuw i32, ptr 
[[TMP5]], i64 1023
 // CHECK1-NEXT:    [[TMP6:%.*]] = getelementptr i32, ptr [[ARRAYIDX1]], i32 1
-// CHECK1-NEXT:    [[TMP7:%.*]] = ptrtoint ptr [[ARRAYIDX]] to i64
-// CHECK1-NEXT:    [[TMP8:%.*]] = ptrtoint ptr [[TMP6]] to i64
-// CHECK1-NEXT:    [[TMP9:%.*]] = sub nuw i64 [[TMP8]], [[TMP7]]
-// CHECK1-NEXT:    [[TMP10:%.*]] = getelementptr 
[[STRUCT_KMP_TASK_AFFINITY_INFO_T:%.*]], ptr [[TMP3]], i64 0
+// CHECK1-NEXT:    [[TMP7:%.*]] = ptrtoaddr ptr [[TMP6]] to i64
+// CHECK1-NEXT:    [[TMP8:%.*]] = ptrtoaddr ptr [[ARRAYIDX]] to i64
+// CHECK1-NEXT:    [[TMP9:%.*]] = sub nuw i64 [[TMP7]], [[TMP8]]
+// CHECK1-NEXT:    [[TMP10:%.*]] = getelementptr 
[[STRUCT_KMP_TASK_AFFINITY_INFO_T]], ptr [[TMP3]], i64 0
 // CHECK1-NEXT:    [[TMP11:%.*]] = getelementptr inbounds nuw 
[[STRUCT_KMP_TASK_AFFINITY_INFO_T]], ptr [[TMP10]], i32 0, i32 0
 // CHECK1-NEXT:    [[TMP12:%.*]] = ptrtoint ptr [[ARRAYIDX]] to i64
 // CHECK1-NEXT:    store i64 [[TMP12]], ptr [[TMP11]], align 8
@@ -439,23 +439,23 @@ int main() {
 // CHECK3-NEXT:    [[B_ADDR:%.*]] = alloca ptr, align 4
 // CHECK3-NEXT:    [[A_ADDR:%.*]] = alloca ptr, align 4
 // CHECK3-NEXT:    [[AGG_CAPTURED:%.*]] = alloca [[STRUCT_ANON:%.*]], align 4
-// CHECK3-NEXT:    [[DOTAFFS_ARR_ADDR:%.*]] = alloca [1 x 
%struct.kmp_task_affinity_info_t], align 4
+// CHECK3-NEXT:    [[DOTAFFS_ARR_ADDR:%.*]] = alloca [1 x 
[[STRUCT_KMP_TASK_AFFINITY_INFO_T:%.*]]], align 4
 // CHECK3-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr 
@[[GLOB1]])
 // CHECK3-NEXT:    store ptr [[B]], ptr [[B_ADDR]], align 4
 // CHECK3-NEXT:    store ptr [[A]], ptr [[A_ADDR]], align 4
 // CHECK3-NEXT:    [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON]], 
ptr [[AGG_CAPTURED]], i32 0, i32 0
 // CHECK3-NEXT:    store ptr [[B_ADDR]], ptr [[TMP1]], align 4
 // CHECK3-NEXT:    [[TMP2:%.*]] = call ptr @__kmpc_omp_task_alloc(ptr 
@[[GLOB1]], i32 [[TMP0]], i32 1, i32 24, i32 4, ptr @.omp_task_entry.)
-// CHECK3-NEXT:    [[TMP3:%.*]] = getelementptr inbounds [1 x 
%struct.kmp_task_affinity_info_t], ptr [[DOTAFFS_ARR_ADDR]], i32 0, i32 0
+// CHECK3-NEXT:    [[TMP3:%.*]] = getelementptr inbounds [1 x 
[[STRUCT_KMP_TASK_AFFINITY_INFO_T]]], ptr [[DOTAFFS_ARR_ADDR]], i32 0, i32 0
 // CHECK3-NEXT:    [[TMP4:%.*]] = load ptr, ptr [[A_ADDR]], align 4
 // CHECK3-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds nuw i32, ptr 
[[TMP4]], i32 0
 // CHECK3-NEXT:    [[TMP5:%.*]] = load ptr, ptr [[A_ADDR]], align 4
 // CHECK3-NEXT:    [[ARRAYIDX1:%.*]] = getelementptr inbounds nuw i32, ptr 
[[TMP5]], i32 1023
 // CHECK3-NEXT:    [[TMP6:%.*]] = getelementptr i32, ptr [[ARRAYIDX1]], i32 1
-// CHECK3-NEXT:    [[TMP7:%.*]] = ptrtoint ptr [[ARRAYIDX]] to i32
-// CHECK3-NEXT:    [[TMP8:%.*]] = ptrtoint ptr [[TMP6]] to i32
-// CHECK3-NEXT:    [[TMP9:%.*]] = sub nuw i32 [[TMP8]], [[TMP7]]
-// CHECK3-NEXT:    [[TMP10:%.*]] = getelementptr 
[[STRUCT_KMP_TASK_AFFINITY_INFO_T:%.*]], ptr [[TMP3]], i32 0
+// CHECK3-NEXT:    [[TMP7:%.*]] = ptrtoaddr ptr [[TMP6]] to i32
+// CHECK3-NEXT:    [[TMP8:%.*]] = ptrtoaddr ptr [[ARRAYIDX]] to i32
+// CHECK3-NEXT:    [[TMP9:%.*]] = sub nuw i32 [[TMP7]], [[TMP8]]
+// CHECK3-NEXT:    [[TMP10:%.*]] = getelementptr 
[[STRUCT_KMP_TASK_AFFINITY_INFO_T]], ptr [[TMP3]], i32 0
 // CHECK3-NEXT:    [[TMP11:%.*]] = getelementptr inbounds nuw 
[[STRUCT_KMP_TASK_AFFINITY_INFO_T]], ptr [[TMP10]], i32 0, i32 0
 // CHECK3-NEXT:    [[TMP12:%.*]] = ptrtoint ptr [[ARRAYIDX]] to i32
 // CHECK3-NEXT:    store i32 [[TMP12]], ptr [[TMP11]], align 4
@@ -628,7 +628,7 @@ int main() {
 // CHECK9-NEXT:    [[B_ADDR:%.*]] = alloca ptr, align 8
 // CHECK9-NEXT:    [[A_ADDR:%.*]] = alloca ptr, align 8
 // CHECK9-NEXT:    [[AGG_CAPTURED:%.*]] = alloca [[STRUCT_ANON:%.*]], align 8
-// CHECK9-NEXT:    [[DOTAFFS_ARR_ADDR:%.*]] = alloca [1 x 
%struct.kmp_task_affinity_info_t], align 8
+// CHECK9-NEXT:    [[DOTAFFS_ARR_ADDR:%.*]] = alloca [1 x 
[[STRUCT_KMP_TASK_AFFINITY_INFO_T:%.*]]], align 8
 // CHECK9-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr 
@[[GLOB1:[0-9]+]])
 // CHECK9-NEXT:    store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 8
 // CHECK9-NEXT:    store ptr [[B]], ptr [[B_ADDR]], align 8
@@ -636,16 +636,16 @@ int main() {
 // CHECK9-NEXT:    [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON]], 
ptr [[AGG_CAPTURED]], i32 0, i32 0
 // CHECK9-NEXT:    store ptr [[B_ADDR]], ptr [[TMP1]], align 8
 // CHECK9-NEXT:    [[TMP2:%.*]] = call ptr @__kmpc_omp_task_alloc(ptr 
@[[GLOB1]], i32 [[TMP0]], i32 1, i64 48, i64 8, ptr @.omp_task_entry.)
-// CHECK9-NEXT:    [[TMP3:%.*]] = getelementptr inbounds [1 x 
%struct.kmp_task_affinity_info_t], ptr [[DOTAFFS_ARR_ADDR]], i64 0, i64 0
+// CHECK9-NEXT:    [[TMP3:%.*]] = getelementptr inbounds [1 x 
[[STRUCT_KMP_TASK_AFFINITY_INFO_T]]], ptr [[DOTAFFS_ARR_ADDR]], i64 0, i64 0
 // CHECK9-NEXT:    [[TMP4:%.*]] = load ptr, ptr [[A_ADDR]], align 8
 // CHECK9-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds nuw i32, ptr 
[[TMP4]], i64 0
 // CHECK9-NEXT:    [[TMP5:%.*]] = load ptr, ptr [[A_ADDR]], align 8
 // CHECK9-NEXT:    [[ARRAYIDX1:%.*]] = getelementptr inbounds nuw i32, ptr 
[[TMP5]], i64 1023
 // CHECK9-NEXT:    [[TMP6:%.*]] = getelementptr i32, ptr [[ARRAYIDX1]], i32 1
-// CHECK9-NEXT:    [[TMP7:%.*]] = ptrtoint ptr [[ARRAYIDX]] to i64
-// CHECK9-NEXT:    [[TMP8:%.*]] = ptrtoint ptr [[TMP6]] to i64
-// CHECK9-NEXT:    [[TMP9:%.*]] = sub nuw i64 [[TMP8]], [[TMP7]]
-// CHECK9-NEXT:    [[TMP10:%.*]] = getelementptr 
[[STRUCT_KMP_TASK_AFFINITY_INFO_T:%.*]], ptr [[TMP3]], i64 0
+// CHECK9-NEXT:    [[TMP7:%.*]] = ptrtoaddr ptr [[TMP6]] to i64
+// CHECK9-NEXT:    [[TMP8:%.*]] = ptrtoaddr ptr [[ARRAYIDX]] to i64
+// CHECK9-NEXT:    [[TMP9:%.*]] = sub nuw i64 [[TMP7]], [[TMP8]]
+// CHECK9-NEXT:    [[TMP10:%.*]] = getelementptr 
[[STRUCT_KMP_TASK_AFFINITY_INFO_T]], ptr [[TMP3]], i64 0
 // CHECK9-NEXT:    [[TMP11:%.*]] = getelementptr inbounds nuw 
[[STRUCT_KMP_TASK_AFFINITY_INFO_T]], ptr [[TMP10]], i32 0, i32 0
 // CHECK9-NEXT:    [[TMP12:%.*]] = ptrtoint ptr [[ARRAYIDX]] to i64
 // CHECK9-NEXT:    store i64 [[TMP12]], ptr [[TMP11]], align 8
@@ -750,7 +750,7 @@ int main() {
 // CHECK11-NEXT:    [[B_ADDR:%.*]] = alloca ptr, align 4
 // CHECK11-NEXT:    [[A_ADDR:%.*]] = alloca ptr, align 4
 // CHECK11-NEXT:    [[AGG_CAPTURED:%.*]] = alloca [[STRUCT_ANON:%.*]], align 4
-// CHECK11-NEXT:    [[DOTAFFS_ARR_ADDR:%.*]] = alloca [1 x 
%struct.kmp_task_affinity_info_t], align 4
+// CHECK11-NEXT:    [[DOTAFFS_ARR_ADDR:%.*]] = alloca [1 x 
[[STRUCT_KMP_TASK_AFFINITY_INFO_T:%.*]]], align 4
 // CHECK11-NEXT:    [[TMP0:%.*]] = call i32 @__kmpc_global_thread_num(ptr 
@[[GLOB1:[0-9]+]])
 // CHECK11-NEXT:    store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 4
 // CHECK11-NEXT:    store ptr [[B]], ptr [[B_ADDR]], align 4
@@ -758,16 +758,16 @@ int main() {
 // CHECK11-NEXT:    [[TMP1:%.*]] = getelementptr inbounds nuw [[STRUCT_ANON]], 
ptr [[AGG_CAPTURED]], i32 0, i32 0
 // CHECK11-NEXT:    store ptr [[B_ADDR]], ptr [[TMP1]], align 4
 // CHECK11-NEXT:    [[TMP2:%.*]] = call ptr @__kmpc_omp_task_alloc(ptr 
@[[GLOB1]], i32 [[TMP0]], i32 1, i32 24, i32 4, ptr @.omp_task_entry.)
-// CHECK11-NEXT:    [[TMP3:%.*]] = getelementptr inbounds [1 x 
%struct.kmp_task_affinity_info_t], ptr [[DOTAFFS_ARR_ADDR]], i32 0, i32 0
+// CHECK11-NEXT:    [[TMP3:%.*]] = getelementptr inbounds [1 x 
[[STRUCT_KMP_TASK_AFFINITY_INFO_T]]], ptr [[DOTAFFS_ARR_ADDR]], i32 0, i32 0
 // CHECK11-NEXT:    [[TMP4:%.*]] = load ptr, ptr [[A_ADDR]], align 4
 // CHECK11-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds nuw i32, ptr 
[[TMP4]], i32 0
 // CHECK11-NEXT:    [[TMP5:%.*]] = load ptr, ptr [[A_ADDR]], align 4
 // CHECK11-NEXT:    [[ARRAYIDX1:%.*]] = getelementptr inbounds nuw i32, ptr 
[[TMP5]], i32 1023
 // CHECK11-NEXT:    [[TMP6:%.*]] = getelementptr i32, ptr [[ARRAYIDX1]], i32 1
-// CHECK11-NEXT:    [[TMP7:%.*]] = ptrtoint ptr [[ARRAYIDX]] to i32
-// CHECK11-NEXT:    [[TMP8:%.*]] = ptrtoint ptr [[TMP6]] to i32
-// CHECK11-NEXT:    [[TMP9:%.*]] = sub nuw i32 [[TMP8]], [[TMP7]]
-// CHECK11-NEXT:    [[TMP10:%.*]] = getelementptr 
[[STRUCT_KMP_TASK_AFFINITY_INFO_T:%.*]], ptr [[TMP3]], i32 0
+// CHECK11-NEXT:    [[TMP7:%.*]] = ptrtoaddr ptr [[TMP6]] to i32
+// CHECK11-NEXT:    [[TMP8:%.*]] = ptrtoaddr ptr [[ARRAYIDX]] to i32
+// CHECK11-NEXT:    [[TMP9:%.*]] = sub nuw i32 [[TMP7]], [[TMP8]]
+// CHECK11-NEXT:    [[TMP10:%.*]] = getelementptr 
[[STRUCT_KMP_TASK_AFFINITY_INFO_T]], ptr [[TMP3]], i32 0
 // CHECK11-NEXT:    [[TMP11:%.*]] = getelementptr inbounds nuw 
[[STRUCT_KMP_TASK_AFFINITY_INFO_T]], ptr [[TMP10]], i32 0, i32 0
 // CHECK11-NEXT:    [[TMP12:%.*]] = ptrtoint ptr [[ARRAYIDX]] to i32
 // CHECK11-NEXT:    store i32 [[TMP12]], ptr [[TMP11]], align 4
diff --git a/clang/test/OpenMP/task_codegen.cpp 
b/clang/test/OpenMP/task_codegen.cpp
index f428265aec0e5..6690559764ab7 100644
--- a/clang/test/OpenMP/task_codegen.cpp
+++ b/clang/test/OpenMP/task_codegen.cpp
@@ -367,9 +367,9 @@ void test_transparent()
 // CHECK1-NEXT:    [[TMP35:%.*]] = mul nsw i64 9, [[TMP2]]
 // CHECK1-NEXT:    [[ARRAYIDX2:%.*]] = getelementptr inbounds nuw i32, ptr 
[[VLA]], i64 [[TMP35]]
 // CHECK1-NEXT:    [[TMP36:%.*]] = getelementptr i32, ptr [[ARRAYIDX2]], i32 1
-// CHECK1-NEXT:    [[TMP37:%.*]] = ptrtoint ptr [[ARRAYIDX]] to i64
-// CHECK1-NEXT:    [[TMP38:%.*]] = ptrtoint ptr [[TMP36]] to i64
-// CHECK1-NEXT:    [[TMP39:%.*]] = sub nuw i64 [[TMP38]], [[TMP37]]
+// CHECK1-NEXT:    [[TMP37:%.*]] = ptrtoaddr ptr [[TMP36]] to i64
+// CHECK1-NEXT:    [[TMP38:%.*]] = ptrtoaddr ptr [[ARRAYIDX]] to i64
+// CHECK1-NEXT:    [[TMP39:%.*]] = sub nuw i64 [[TMP37]], [[TMP38]]
 // CHECK1-NEXT:    [[TMP40:%.*]] = ptrtoint ptr [[ARRAYIDX]] to i64
 // CHECK1-NEXT:    [[TMP41:%.*]] = getelementptr [[STRUCT_KMP_DEPEND_INFO]], 
ptr [[TMP19]], i64 3
 // CHECK1-NEXT:    [[TMP42:%.*]] = getelementptr inbounds nuw 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP41]], i32 0, i32 0
@@ -408,9 +408,9 @@ void test_transparent()
 // CHECK1-NEXT:    [[ARRAYIDX9:%.*]] = getelementptr inbounds nuw i32, ptr 
[[VLA]], i64 [[TMP63]]
 // CHECK1-NEXT:    [[ARRAYIDX10:%.*]] = getelementptr inbounds nuw i32, ptr 
[[ARRAYIDX9]], i64 [[TMP62]]
 // CHECK1-NEXT:    [[TMP64:%.*]] = getelementptr i32, ptr [[ARRAYIDX10]], i32 1
-// CHECK1-NEXT:    [[TMP65:%.*]] = ptrtoint ptr [[ARRAYIDX8]] to i64
-// CHECK1-NEXT:    [[TMP66:%.*]] = ptrtoint ptr [[TMP64]] to i64
-// CHECK1-NEXT:    [[TMP67:%.*]] = sub nuw i64 [[TMP66]], [[TMP65]]
+// CHECK1-NEXT:    [[TMP65:%.*]] = ptrtoaddr ptr [[TMP64]] to i64
+// CHECK1-NEXT:    [[TMP66:%.*]] = ptrtoaddr ptr [[ARRAYIDX8]] to i64
+// CHECK1-NEXT:    [[TMP67:%.*]] = sub nuw i64 [[TMP65]], [[TMP66]]
 // CHECK1-NEXT:    [[TMP68:%.*]] = ptrtoint ptr [[ARRAYIDX8]] to i64
 // CHECK1-NEXT:    [[TMP69:%.*]] = getelementptr [[STRUCT_KMP_DEPEND_INFO]], 
ptr [[TMP52]], i64 1
 // CHECK1-NEXT:    [[TMP70:%.*]] = getelementptr inbounds nuw 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP69]], i32 0, i32 0
@@ -446,9 +446,9 @@ void test_transparent()
 // CHECK1-NEXT:    [[ARRAYIDX17:%.*]] = getelementptr inbounds nuw i32, ptr 
[[VLA]], i64 [[TMP88]]
 // CHECK1-NEXT:    [[ARRAYIDX18:%.*]] = getelementptr inbounds nuw i32, ptr 
[[ARRAYIDX17]], i64 [[TMP87]]
 // CHECK1-NEXT:    [[TMP89:%.*]] = getelementptr i32, ptr [[ARRAYIDX18]], i32 1
-// CHECK1-NEXT:    [[TMP90:%.*]] = ptrtoint ptr [[ARRAYIDX16]] to i64
-// CHECK1-NEXT:    [[TMP91:%.*]] = ptrtoint ptr [[TMP89]] to i64
-// CHECK1-NEXT:    [[TMP92:%.*]] = sub nuw i64 [[TMP91]], [[TMP90]]
+// CHECK1-NEXT:    [[TMP90:%.*]] = ptrtoaddr ptr [[TMP89]] to i64
+// CHECK1-NEXT:    [[TMP91:%.*]] = ptrtoaddr ptr [[ARRAYIDX16]] to i64
+// CHECK1-NEXT:    [[TMP92:%.*]] = sub nuw i64 [[TMP90]], [[TMP91]]
 // CHECK1-NEXT:    [[TMP93:%.*]] = ptrtoint ptr [[ARRAYIDX16]] to i64
 // CHECK1-NEXT:    [[TMP94:%.*]] = getelementptr [[STRUCT_KMP_DEPEND_INFO]], 
ptr [[TMP77]], i64 1
 // CHECK1-NEXT:    [[TMP95:%.*]] = getelementptr inbounds nuw 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP94]], i32 0, i32 0
@@ -493,9 +493,9 @@ void test_transparent()
 // CHECK1-NEXT:    [[ARRAYIDX25:%.*]] = getelementptr inbounds nuw i32, ptr 
[[VLA]], i64 [[TMP117]]
 // CHECK1-NEXT:    [[ARRAYIDX26:%.*]] = getelementptr inbounds nuw i32, ptr 
[[ARRAYIDX25]], i64 [[LEN_SUB_1]]
 // CHECK1-NEXT:    [[TMP118:%.*]] = getelementptr i32, ptr [[ARRAYIDX26]], i32 
1
-// CHECK1-NEXT:    [[TMP119:%.*]] = ptrtoint ptr [[ARRAYIDX24]] to i64
-// CHECK1-NEXT:    [[TMP120:%.*]] = ptrtoint ptr [[TMP118]] to i64
-// CHECK1-NEXT:    [[TMP121:%.*]] = sub nuw i64 [[TMP120]], [[TMP119]]
+// CHECK1-NEXT:    [[TMP119:%.*]] = ptrtoaddr ptr [[TMP118]] to i64
+// CHECK1-NEXT:    [[TMP120:%.*]] = ptrtoaddr ptr [[ARRAYIDX24]] to i64
+// CHECK1-NEXT:    [[TMP121:%.*]] = sub nuw i64 [[TMP119]], [[TMP120]]
 // CHECK1-NEXT:    [[TMP122:%.*]] = ptrtoint ptr [[ARRAYIDX24]] to i64
 // CHECK1-NEXT:    [[TMP123:%.*]] = getelementptr [[STRUCT_KMP_DEPEND_INFO]], 
ptr [[TMP102]], i64 2
 // CHECK1-NEXT:    [[TMP124:%.*]] = getelementptr inbounds nuw 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP123]], i32 0, i32 0
@@ -1490,9 +1490,9 @@ void test_transparent()
 // CHECK1-51-NEXT:    [[TMP35:%.*]] = mul nsw i64 9, [[TMP2]]
 // CHECK1-51-NEXT:    [[ARRAYIDX2:%.*]] = getelementptr inbounds nuw i32, ptr 
[[VLA]], i64 [[TMP35]]
 // CHECK1-51-NEXT:    [[TMP36:%.*]] = getelementptr i32, ptr [[ARRAYIDX2]], 
i32 1
-// CHECK1-51-NEXT:    [[TMP37:%.*]] = ptrtoint ptr [[ARRAYIDX]] to i64
-// CHECK1-51-NEXT:    [[TMP38:%.*]] = ptrtoint ptr [[TMP36]] to i64
-// CHECK1-51-NEXT:    [[TMP39:%.*]] = sub nuw i64 [[TMP38]], [[TMP37]]
+// CHECK1-51-NEXT:    [[TMP37:%.*]] = ptrtoaddr ptr [[TMP36]] to i64
+// CHECK1-51-NEXT:    [[TMP38:%.*]] = ptrtoaddr ptr [[ARRAYIDX]] to i64
+// CHECK1-51-NEXT:    [[TMP39:%.*]] = sub nuw i64 [[TMP37]], [[TMP38]]
 // CHECK1-51-NEXT:    [[TMP40:%.*]] = ptrtoint ptr [[ARRAYIDX]] to i64
 // CHECK1-51-NEXT:    [[TMP41:%.*]] = getelementptr 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP19]], i64 3
 // CHECK1-51-NEXT:    [[TMP42:%.*]] = getelementptr inbounds nuw 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP41]], i32 0, i32 0
@@ -1531,9 +1531,9 @@ void test_transparent()
 // CHECK1-51-NEXT:    [[ARRAYIDX9:%.*]] = getelementptr inbounds nuw i32, ptr 
[[VLA]], i64 [[TMP63]]
 // CHECK1-51-NEXT:    [[ARRAYIDX10:%.*]] = getelementptr inbounds nuw i32, ptr 
[[ARRAYIDX9]], i64 [[TMP62]]
 // CHECK1-51-NEXT:    [[TMP64:%.*]] = getelementptr i32, ptr [[ARRAYIDX10]], 
i32 1
-// CHECK1-51-NEXT:    [[TMP65:%.*]] = ptrtoint ptr [[ARRAYIDX8]] to i64
-// CHECK1-51-NEXT:    [[TMP66:%.*]] = ptrtoint ptr [[TMP64]] to i64
-// CHECK1-51-NEXT:    [[TMP67:%.*]] = sub nuw i64 [[TMP66]], [[TMP65]]
+// CHECK1-51-NEXT:    [[TMP65:%.*]] = ptrtoaddr ptr [[TMP64]] to i64
+// CHECK1-51-NEXT:    [[TMP66:%.*]] = ptrtoaddr ptr [[ARRAYIDX8]] to i64
+// CHECK1-51-NEXT:    [[TMP67:%.*]] = sub nuw i64 [[TMP65]], [[TMP66]]
 // CHECK1-51-NEXT:    [[TMP68:%.*]] = ptrtoint ptr [[ARRAYIDX8]] to i64
 // CHECK1-51-NEXT:    [[TMP69:%.*]] = getelementptr 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP52]], i64 1
 // CHECK1-51-NEXT:    [[TMP70:%.*]] = getelementptr inbounds nuw 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP69]], i32 0, i32 0
@@ -1569,9 +1569,9 @@ void test_transparent()
 // CHECK1-51-NEXT:    [[ARRAYIDX17:%.*]] = getelementptr inbounds nuw i32, ptr 
[[VLA]], i64 [[TMP88]]
 // CHECK1-51-NEXT:    [[ARRAYIDX18:%.*]] = getelementptr inbounds nuw i32, ptr 
[[ARRAYIDX17]], i64 [[TMP87]]
 // CHECK1-51-NEXT:    [[TMP89:%.*]] = getelementptr i32, ptr [[ARRAYIDX18]], 
i32 1
-// CHECK1-51-NEXT:    [[TMP90:%.*]] = ptrtoint ptr [[ARRAYIDX16]] to i64
-// CHECK1-51-NEXT:    [[TMP91:%.*]] = ptrtoint ptr [[TMP89]] to i64
-// CHECK1-51-NEXT:    [[TMP92:%.*]] = sub nuw i64 [[TMP91]], [[TMP90]]
+// CHECK1-51-NEXT:    [[TMP90:%.*]] = ptrtoaddr ptr [[TMP89]] to i64
+// CHECK1-51-NEXT:    [[TMP91:%.*]] = ptrtoaddr ptr [[ARRAYIDX16]] to i64
+// CHECK1-51-NEXT:    [[TMP92:%.*]] = sub nuw i64 [[TMP90]], [[TMP91]]
 // CHECK1-51-NEXT:    [[TMP93:%.*]] = ptrtoint ptr [[ARRAYIDX16]] to i64
 // CHECK1-51-NEXT:    [[TMP94:%.*]] = getelementptr 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP77]], i64 1
 // CHECK1-51-NEXT:    [[TMP95:%.*]] = getelementptr inbounds nuw 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP94]], i32 0, i32 0
@@ -1616,9 +1616,9 @@ void test_transparent()
 // CHECK1-51-NEXT:    [[ARRAYIDX25:%.*]] = getelementptr inbounds nuw i32, ptr 
[[VLA]], i64 [[TMP117]]
 // CHECK1-51-NEXT:    [[ARRAYIDX26:%.*]] = getelementptr inbounds nuw i32, ptr 
[[ARRAYIDX25]], i64 [[LEN_SUB_1]]
 // CHECK1-51-NEXT:    [[TMP118:%.*]] = getelementptr i32, ptr [[ARRAYIDX26]], 
i32 1
-// CHECK1-51-NEXT:    [[TMP119:%.*]] = ptrtoint ptr [[ARRAYIDX24]] to i64
-// CHECK1-51-NEXT:    [[TMP120:%.*]] = ptrtoint ptr [[TMP118]] to i64
-// CHECK1-51-NEXT:    [[TMP121:%.*]] = sub nuw i64 [[TMP120]], [[TMP119]]
+// CHECK1-51-NEXT:    [[TMP119:%.*]] = ptrtoaddr ptr [[TMP118]] to i64
+// CHECK1-51-NEXT:    [[TMP120:%.*]] = ptrtoaddr ptr [[ARRAYIDX24]] to i64
+// CHECK1-51-NEXT:    [[TMP121:%.*]] = sub nuw i64 [[TMP119]], [[TMP120]]
 // CHECK1-51-NEXT:    [[TMP122:%.*]] = ptrtoint ptr [[ARRAYIDX24]] to i64
 // CHECK1-51-NEXT:    [[TMP123:%.*]] = getelementptr 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP102]], i64 2
 // CHECK1-51-NEXT:    [[TMP124:%.*]] = getelementptr inbounds nuw 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP123]], i32 0, i32 0
@@ -1661,9 +1661,9 @@ void test_transparent()
 // CHECK1-51-NEXT:    [[ARRAYIDX35:%.*]] = getelementptr inbounds nuw i32, ptr 
[[VLA]], i64 [[TMP145]]
 // CHECK1-51-NEXT:    [[ARRAYIDX36:%.*]] = getelementptr inbounds nuw i32, ptr 
[[ARRAYIDX35]], i64 [[LEN_SUB_133]]
 // CHECK1-51-NEXT:    [[TMP146:%.*]] = getelementptr i32, ptr [[ARRAYIDX36]], 
i32 1
-// CHECK1-51-NEXT:    [[TMP147:%.*]] = ptrtoint ptr [[ARRAYIDX32]] to i64
-// CHECK1-51-NEXT:    [[TMP148:%.*]] = ptrtoint ptr [[TMP146]] to i64
-// CHECK1-51-NEXT:    [[TMP149:%.*]] = sub nuw i64 [[TMP148]], [[TMP147]]
+// CHECK1-51-NEXT:    [[TMP147:%.*]] = ptrtoaddr ptr [[TMP146]] to i64
+// CHECK1-51-NEXT:    [[TMP148:%.*]] = ptrtoaddr ptr [[ARRAYIDX32]] to i64
+// CHECK1-51-NEXT:    [[TMP149:%.*]] = sub nuw i64 [[TMP147]], [[TMP148]]
 // CHECK1-51-NEXT:    [[TMP150:%.*]] = ptrtoint ptr [[ARRAYIDX32]] to i64
 // CHECK1-51-NEXT:    [[TMP151:%.*]] = getelementptr 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP130]], i64 2
 // CHECK1-51-NEXT:    [[TMP152:%.*]] = getelementptr inbounds nuw 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP151]], i32 0, i32 0
@@ -3098,9 +3098,9 @@ void test_transparent()
 // CHECK2-NEXT:    [[TMP35:%.*]] = mul nsw i64 9, [[TMP2]]
 // CHECK2-NEXT:    [[ARRAYIDX2:%.*]] = getelementptr inbounds nuw i32, ptr 
[[VLA]], i64 [[TMP35]]
 // CHECK2-NEXT:    [[TMP36:%.*]] = getelementptr i32, ptr [[ARRAYIDX2]], i32 1
-// CHECK2-NEXT:    [[TMP37:%.*]] = ptrtoint ptr [[ARRAYIDX]] to i64
-// CHECK2-NEXT:    [[TMP38:%.*]] = ptrtoint ptr [[TMP36]] to i64
-// CHECK2-NEXT:    [[TMP39:%.*]] = sub nuw i64 [[TMP38]], [[TMP37]]
+// CHECK2-NEXT:    [[TMP37:%.*]] = ptrtoaddr ptr [[TMP36]] to i64
+// CHECK2-NEXT:    [[TMP38:%.*]] = ptrtoaddr ptr [[ARRAYIDX]] to i64
+// CHECK2-NEXT:    [[TMP39:%.*]] = sub nuw i64 [[TMP37]], [[TMP38]]
 // CHECK2-NEXT:    [[TMP40:%.*]] = ptrtoint ptr [[ARRAYIDX]] to i64
 // CHECK2-NEXT:    [[TMP41:%.*]] = getelementptr [[STRUCT_KMP_DEPEND_INFO]], 
ptr [[TMP19]], i64 3
 // CHECK2-NEXT:    [[TMP42:%.*]] = getelementptr inbounds nuw 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP41]], i32 0, i32 0
@@ -3139,9 +3139,9 @@ void test_transparent()
 // CHECK2-NEXT:    [[ARRAYIDX9:%.*]] = getelementptr inbounds nuw i32, ptr 
[[VLA]], i64 [[TMP63]]
 // CHECK2-NEXT:    [[ARRAYIDX10:%.*]] = getelementptr inbounds nuw i32, ptr 
[[ARRAYIDX9]], i64 [[TMP62]]
 // CHECK2-NEXT:    [[TMP64:%.*]] = getelementptr i32, ptr [[ARRAYIDX10]], i32 1
-// CHECK2-NEXT:    [[TMP65:%.*]] = ptrtoint ptr [[ARRAYIDX8]] to i64
-// CHECK2-NEXT:    [[TMP66:%.*]] = ptrtoint ptr [[TMP64]] to i64
-// CHECK2-NEXT:    [[TMP67:%.*]] = sub nuw i64 [[TMP66]], [[TMP65]]
+// CHECK2-NEXT:    [[TMP65:%.*]] = ptrtoaddr ptr [[TMP64]] to i64
+// CHECK2-NEXT:    [[TMP66:%.*]] = ptrtoaddr ptr [[ARRAYIDX8]] to i64
+// CHECK2-NEXT:    [[TMP67:%.*]] = sub nuw i64 [[TMP65]], [[TMP66]]
 // CHECK2-NEXT:    [[TMP68:%.*]] = ptrtoint ptr [[ARRAYIDX8]] to i64
 // CHECK2-NEXT:    [[TMP69:%.*]] = getelementptr [[STRUCT_KMP_DEPEND_INFO]], 
ptr [[TMP52]], i64 1
 // CHECK2-NEXT:    [[TMP70:%.*]] = getelementptr inbounds nuw 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP69]], i32 0, i32 0
@@ -3177,9 +3177,9 @@ void test_transparent()
 // CHECK2-NEXT:    [[ARRAYIDX17:%.*]] = getelementptr inbounds nuw i32, ptr 
[[VLA]], i64 [[TMP88]]
 // CHECK2-NEXT:    [[ARRAYIDX18:%.*]] = getelementptr inbounds nuw i32, ptr 
[[ARRAYIDX17]], i64 [[TMP87]]
 // CHECK2-NEXT:    [[TMP89:%.*]] = getelementptr i32, ptr [[ARRAYIDX18]], i32 1
-// CHECK2-NEXT:    [[TMP90:%.*]] = ptrtoint ptr [[ARRAYIDX16]] to i64
-// CHECK2-NEXT:    [[TMP91:%.*]] = ptrtoint ptr [[TMP89]] to i64
-// CHECK2-NEXT:    [[TMP92:%.*]] = sub nuw i64 [[TMP91]], [[TMP90]]
+// CHECK2-NEXT:    [[TMP90:%.*]] = ptrtoaddr ptr [[TMP89]] to i64
+// CHECK2-NEXT:    [[TMP91:%.*]] = ptrtoaddr ptr [[ARRAYIDX16]] to i64
+// CHECK2-NEXT:    [[TMP92:%.*]] = sub nuw i64 [[TMP90]], [[TMP91]]
 // CHECK2-NEXT:    [[TMP93:%.*]] = ptrtoint ptr [[ARRAYIDX16]] to i64
 // CHECK2-NEXT:    [[TMP94:%.*]] = getelementptr [[STRUCT_KMP_DEPEND_INFO]], 
ptr [[TMP77]], i64 1
 // CHECK2-NEXT:    [[TMP95:%.*]] = getelementptr inbounds nuw 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP94]], i32 0, i32 0
@@ -3224,9 +3224,9 @@ void test_transparent()
 // CHECK2-NEXT:    [[ARRAYIDX25:%.*]] = getelementptr inbounds nuw i32, ptr 
[[VLA]], i64 [[TMP117]]
 // CHECK2-NEXT:    [[ARRAYIDX26:%.*]] = getelementptr inbounds nuw i32, ptr 
[[ARRAYIDX25]], i64 [[LEN_SUB_1]]
 // CHECK2-NEXT:    [[TMP118:%.*]] = getelementptr i32, ptr [[ARRAYIDX26]], i32 
1
-// CHECK2-NEXT:    [[TMP119:%.*]] = ptrtoint ptr [[ARRAYIDX24]] to i64
-// CHECK2-NEXT:    [[TMP120:%.*]] = ptrtoint ptr [[TMP118]] to i64
-// CHECK2-NEXT:    [[TMP121:%.*]] = sub nuw i64 [[TMP120]], [[TMP119]]
+// CHECK2-NEXT:    [[TMP119:%.*]] = ptrtoaddr ptr [[TMP118]] to i64
+// CHECK2-NEXT:    [[TMP120:%.*]] = ptrtoaddr ptr [[ARRAYIDX24]] to i64
+// CHECK2-NEXT:    [[TMP121:%.*]] = sub nuw i64 [[TMP119]], [[TMP120]]
 // CHECK2-NEXT:    [[TMP122:%.*]] = ptrtoint ptr [[ARRAYIDX24]] to i64
 // CHECK2-NEXT:    [[TMP123:%.*]] = getelementptr [[STRUCT_KMP_DEPEND_INFO]], 
ptr [[TMP102]], i64 2
 // CHECK2-NEXT:    [[TMP124:%.*]] = getelementptr inbounds nuw 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP123]], i32 0, i32 0
@@ -4221,9 +4221,9 @@ void test_transparent()
 // CHECK2-51-NEXT:    [[TMP35:%.*]] = mul nsw i64 9, [[TMP2]]
 // CHECK2-51-NEXT:    [[ARRAYIDX2:%.*]] = getelementptr inbounds nuw i32, ptr 
[[VLA]], i64 [[TMP35]]
 // CHECK2-51-NEXT:    [[TMP36:%.*]] = getelementptr i32, ptr [[ARRAYIDX2]], 
i32 1
-// CHECK2-51-NEXT:    [[TMP37:%.*]] = ptrtoint ptr [[ARRAYIDX]] to i64
-// CHECK2-51-NEXT:    [[TMP38:%.*]] = ptrtoint ptr [[TMP36]] to i64
-// CHECK2-51-NEXT:    [[TMP39:%.*]] = sub nuw i64 [[TMP38]], [[TMP37]]
+// CHECK2-51-NEXT:    [[TMP37:%.*]] = ptrtoaddr ptr [[TMP36]] to i64
+// CHECK2-51-NEXT:    [[TMP38:%.*]] = ptrtoaddr ptr [[ARRAYIDX]] to i64
+// CHECK2-51-NEXT:    [[TMP39:%.*]] = sub nuw i64 [[TMP37]], [[TMP38]]
 // CHECK2-51-NEXT:    [[TMP40:%.*]] = ptrtoint ptr [[ARRAYIDX]] to i64
 // CHECK2-51-NEXT:    [[TMP41:%.*]] = getelementptr 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP19]], i64 3
 // CHECK2-51-NEXT:    [[TMP42:%.*]] = getelementptr inbounds nuw 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP41]], i32 0, i32 0
@@ -4262,9 +4262,9 @@ void test_transparent()
 // CHECK2-51-NEXT:    [[ARRAYIDX9:%.*]] = getelementptr inbounds nuw i32, ptr 
[[VLA]], i64 [[TMP63]]
 // CHECK2-51-NEXT:    [[ARRAYIDX10:%.*]] = getelementptr inbounds nuw i32, ptr 
[[ARRAYIDX9]], i64 [[TMP62]]
 // CHECK2-51-NEXT:    [[TMP64:%.*]] = getelementptr i32, ptr [[ARRAYIDX10]], 
i32 1
-// CHECK2-51-NEXT:    [[TMP65:%.*]] = ptrtoint ptr [[ARRAYIDX8]] to i64
-// CHECK2-51-NEXT:    [[TMP66:%.*]] = ptrtoint ptr [[TMP64]] to i64
-// CHECK2-51-NEXT:    [[TMP67:%.*]] = sub nuw i64 [[TMP66]], [[TMP65]]
+// CHECK2-51-NEXT:    [[TMP65:%.*]] = ptrtoaddr ptr [[TMP64]] to i64
+// CHECK2-51-NEXT:    [[TMP66:%.*]] = ptrtoaddr ptr [[ARRAYIDX8]] to i64
+// CHECK2-51-NEXT:    [[TMP67:%.*]] = sub nuw i64 [[TMP65]], [[TMP66]]
 // CHECK2-51-NEXT:    [[TMP68:%.*]] = ptrtoint ptr [[ARRAYIDX8]] to i64
 // CHECK2-51-NEXT:    [[TMP69:%.*]] = getelementptr 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP52]], i64 1
 // CHECK2-51-NEXT:    [[TMP70:%.*]] = getelementptr inbounds nuw 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP69]], i32 0, i32 0
@@ -4300,9 +4300,9 @@ void test_transparent()
 // CHECK2-51-NEXT:    [[ARRAYIDX17:%.*]] = getelementptr inbounds nuw i32, ptr 
[[VLA]], i64 [[TMP88]]
 // CHECK2-51-NEXT:    [[ARRAYIDX18:%.*]] = getelementptr inbounds nuw i32, ptr 
[[ARRAYIDX17]], i64 [[TMP87]]
 // CHECK2-51-NEXT:    [[TMP89:%.*]] = getelementptr i32, ptr [[ARRAYIDX18]], 
i32 1
-// CHECK2-51-NEXT:    [[TMP90:%.*]] = ptrtoint ptr [[ARRAYIDX16]] to i64
-// CHECK2-51-NEXT:    [[TMP91:%.*]] = ptrtoint ptr [[TMP89]] to i64
-// CHECK2-51-NEXT:    [[TMP92:%.*]] = sub nuw i64 [[TMP91]], [[TMP90]]
+// CHECK2-51-NEXT:    [[TMP90:%.*]] = ptrtoaddr ptr [[TMP89]] to i64
+// CHECK2-51-NEXT:    [[TMP91:%.*]] = ptrtoaddr ptr [[ARRAYIDX16]] to i64
+// CHECK2-51-NEXT:    [[TMP92:%.*]] = sub nuw i64 [[TMP90]], [[TMP91]]
 // CHECK2-51-NEXT:    [[TMP93:%.*]] = ptrtoint ptr [[ARRAYIDX16]] to i64
 // CHECK2-51-NEXT:    [[TMP94:%.*]] = getelementptr 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP77]], i64 1
 // CHECK2-51-NEXT:    [[TMP95:%.*]] = getelementptr inbounds nuw 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP94]], i32 0, i32 0
@@ -4347,9 +4347,9 @@ void test_transparent()
 // CHECK2-51-NEXT:    [[ARRAYIDX25:%.*]] = getelementptr inbounds nuw i32, ptr 
[[VLA]], i64 [[TMP117]]
 // CHECK2-51-NEXT:    [[ARRAYIDX26:%.*]] = getelementptr inbounds nuw i32, ptr 
[[ARRAYIDX25]], i64 [[LEN_SUB_1]]
 // CHECK2-51-NEXT:    [[TMP118:%.*]] = getelementptr i32, ptr [[ARRAYIDX26]], 
i32 1
-// CHECK2-51-NEXT:    [[TMP119:%.*]] = ptrtoint ptr [[ARRAYIDX24]] to i64
-// CHECK2-51-NEXT:    [[TMP120:%.*]] = ptrtoint ptr [[TMP118]] to i64
-// CHECK2-51-NEXT:    [[TMP121:%.*]] = sub nuw i64 [[TMP120]], [[TMP119]]
+// CHECK2-51-NEXT:    [[TMP119:%.*]] = ptrtoaddr ptr [[TMP118]] to i64
+// CHECK2-51-NEXT:    [[TMP120:%.*]] = ptrtoaddr ptr [[ARRAYIDX24]] to i64
+// CHECK2-51-NEXT:    [[TMP121:%.*]] = sub nuw i64 [[TMP119]], [[TMP120]]
 // CHECK2-51-NEXT:    [[TMP122:%.*]] = ptrtoint ptr [[ARRAYIDX24]] to i64
 // CHECK2-51-NEXT:    [[TMP123:%.*]] = getelementptr 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP102]], i64 2
 // CHECK2-51-NEXT:    [[TMP124:%.*]] = getelementptr inbounds nuw 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP123]], i32 0, i32 0
@@ -4392,9 +4392,9 @@ void test_transparent()
 // CHECK2-51-NEXT:    [[ARRAYIDX35:%.*]] = getelementptr inbounds nuw i32, ptr 
[[VLA]], i64 [[TMP145]]
 // CHECK2-51-NEXT:    [[ARRAYIDX36:%.*]] = getelementptr inbounds nuw i32, ptr 
[[ARRAYIDX35]], i64 [[LEN_SUB_133]]
 // CHECK2-51-NEXT:    [[TMP146:%.*]] = getelementptr i32, ptr [[ARRAYIDX36]], 
i32 1
-// CHECK2-51-NEXT:    [[TMP147:%.*]] = ptrtoint ptr [[ARRAYIDX32]] to i64
-// CHECK2-51-NEXT:    [[TMP148:%.*]] = ptrtoint ptr [[TMP146]] to i64
-// CHECK2-51-NEXT:    [[TMP149:%.*]] = sub nuw i64 [[TMP148]], [[TMP147]]
+// CHECK2-51-NEXT:    [[TMP147:%.*]] = ptrtoaddr ptr [[TMP146]] to i64
+// CHECK2-51-NEXT:    [[TMP148:%.*]] = ptrtoaddr ptr [[ARRAYIDX32]] to i64
+// CHECK2-51-NEXT:    [[TMP149:%.*]] = sub nuw i64 [[TMP147]], [[TMP148]]
 // CHECK2-51-NEXT:    [[TMP150:%.*]] = ptrtoint ptr [[ARRAYIDX32]] to i64
 // CHECK2-51-NEXT:    [[TMP151:%.*]] = getelementptr 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP130]], i64 2
 // CHECK2-51-NEXT:    [[TMP152:%.*]] = getelementptr inbounds nuw 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP151]], i32 0, i32 0
@@ -5831,9 +5831,9 @@ void test_transparent()
 // CHECK3-NEXT:    [[TMP34:%.*]] = mul nsw i64 9, [[TMP1]]
 // CHECK3-NEXT:    [[ARRAYIDX4:%.*]] = getelementptr inbounds nuw i32, ptr 
[[VLA]], i64 [[TMP34]]
 // CHECK3-NEXT:    [[TMP35:%.*]] = getelementptr i32, ptr [[ARRAYIDX4]], i32 1
-// CHECK3-NEXT:    [[TMP36:%.*]] = ptrtoint ptr [[ARRAYIDX]] to i64
-// CHECK3-NEXT:    [[TMP37:%.*]] = ptrtoint ptr [[TMP35]] to i64
-// CHECK3-NEXT:    [[TMP38:%.*]] = sub nuw i64 [[TMP37]], [[TMP36]]
+// CHECK3-NEXT:    [[TMP36:%.*]] = ptrtoaddr ptr [[TMP35]] to i64
+// CHECK3-NEXT:    [[TMP37:%.*]] = ptrtoaddr ptr [[ARRAYIDX]] to i64
+// CHECK3-NEXT:    [[TMP38:%.*]] = sub nuw i64 [[TMP36]], [[TMP37]]
 // CHECK3-NEXT:    [[TMP39:%.*]] = ptrtoint ptr [[ARRAYIDX]] to i64
 // CHECK3-NEXT:    [[TMP40:%.*]] = getelementptr [[STRUCT_KMP_DEPEND_INFO]], 
ptr [[TMP18]], i64 3
 // CHECK3-NEXT:    [[TMP41:%.*]] = getelementptr inbounds nuw 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP40]], i32 0, i32 0
@@ -5876,9 +5876,9 @@ void test_transparent()
 // CHECK3-NEXT:    [[ARRAYIDX15:%.*]] = getelementptr inbounds nuw i32, ptr 
[[VLA]], i64 [[TMP62]]
 // CHECK3-NEXT:    [[ARRAYIDX16:%.*]] = getelementptr inbounds nuw i32, ptr 
[[ARRAYIDX15]], i64 [[TMP61]]
 // CHECK3-NEXT:    [[TMP63:%.*]] = getelementptr i32, ptr [[ARRAYIDX16]], i32 1
-// CHECK3-NEXT:    [[TMP64:%.*]] = ptrtoint ptr [[ARRAYIDX14]] to i64
-// CHECK3-NEXT:    [[TMP65:%.*]] = ptrtoint ptr [[TMP63]] to i64
-// CHECK3-NEXT:    [[TMP66:%.*]] = sub nuw i64 [[TMP65]], [[TMP64]]
+// CHECK3-NEXT:    [[TMP64:%.*]] = ptrtoaddr ptr [[TMP63]] to i64
+// CHECK3-NEXT:    [[TMP65:%.*]] = ptrtoaddr ptr [[ARRAYIDX14]] to i64
+// CHECK3-NEXT:    [[TMP66:%.*]] = sub nuw i64 [[TMP64]], [[TMP65]]
 // CHECK3-NEXT:    [[TMP67:%.*]] = ptrtoint ptr [[ARRAYIDX14]] to i64
 // CHECK3-NEXT:    [[TMP68:%.*]] = getelementptr [[STRUCT_KMP_DEPEND_INFO]], 
ptr [[TMP51]], i64 1
 // CHECK3-NEXT:    [[TMP69:%.*]] = getelementptr inbounds nuw 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP68]], i32 0, i32 0
@@ -5916,9 +5916,9 @@ void test_transparent()
 // CHECK3-NEXT:    [[ARRAYIDX25:%.*]] = getelementptr inbounds nuw i32, ptr 
[[VLA]], i64 [[TMP87]]
 // CHECK3-NEXT:    [[ARRAYIDX26:%.*]] = getelementptr inbounds nuw i32, ptr 
[[ARRAYIDX25]], i64 [[TMP86]]
 // CHECK3-NEXT:    [[TMP88:%.*]] = getelementptr i32, ptr [[ARRAYIDX26]], i32 1
-// CHECK3-NEXT:    [[TMP89:%.*]] = ptrtoint ptr [[ARRAYIDX24]] to i64
-// CHECK3-NEXT:    [[TMP90:%.*]] = ptrtoint ptr [[TMP88]] to i64
-// CHECK3-NEXT:    [[TMP91:%.*]] = sub nuw i64 [[TMP90]], [[TMP89]]
+// CHECK3-NEXT:    [[TMP89:%.*]] = ptrtoaddr ptr [[TMP88]] to i64
+// CHECK3-NEXT:    [[TMP90:%.*]] = ptrtoaddr ptr [[ARRAYIDX24]] to i64
+// CHECK3-NEXT:    [[TMP91:%.*]] = sub nuw i64 [[TMP89]], [[TMP90]]
 // CHECK3-NEXT:    [[TMP92:%.*]] = ptrtoint ptr [[ARRAYIDX24]] to i64
 // CHECK3-NEXT:    [[TMP93:%.*]] = getelementptr [[STRUCT_KMP_DEPEND_INFO]], 
ptr [[TMP76]], i64 1
 // CHECK3-NEXT:    [[TMP94:%.*]] = getelementptr inbounds nuw 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP93]], i32 0, i32 0
@@ -5965,9 +5965,9 @@ void test_transparent()
 // CHECK3-NEXT:    [[ARRAYIDX35:%.*]] = getelementptr inbounds nuw i32, ptr 
[[VLA]], i64 [[TMP116]]
 // CHECK3-NEXT:    [[ARRAYIDX36:%.*]] = getelementptr inbounds nuw i32, ptr 
[[ARRAYIDX35]], i64 [[LEN_SUB_1]]
 // CHECK3-NEXT:    [[TMP117:%.*]] = getelementptr i32, ptr [[ARRAYIDX36]], i32 
1
-// CHECK3-NEXT:    [[TMP118:%.*]] = ptrtoint ptr [[ARRAYIDX34]] to i64
-// CHECK3-NEXT:    [[TMP119:%.*]] = ptrtoint ptr [[TMP117]] to i64
-// CHECK3-NEXT:    [[TMP120:%.*]] = sub nuw i64 [[TMP119]], [[TMP118]]
+// CHECK3-NEXT:    [[TMP118:%.*]] = ptrtoaddr ptr [[TMP117]] to i64
+// CHECK3-NEXT:    [[TMP119:%.*]] = ptrtoaddr ptr [[ARRAYIDX34]] to i64
+// CHECK3-NEXT:    [[TMP120:%.*]] = sub nuw i64 [[TMP118]], [[TMP119]]
 // CHECK3-NEXT:    [[TMP121:%.*]] = ptrtoint ptr [[ARRAYIDX34]] to i64
 // CHECK3-NEXT:    [[TMP122:%.*]] = getelementptr [[STRUCT_KMP_DEPEND_INFO]], 
ptr [[TMP101]], i64 2
 // CHECK3-NEXT:    [[TMP123:%.*]] = getelementptr inbounds nuw 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP122]], i32 0, i32 0
@@ -6847,9 +6847,9 @@ void test_transparent()
 // CHECK4-NEXT:    [[TMP34:%.*]] = mul nsw i64 9, [[TMP1]]
 // CHECK4-NEXT:    [[ARRAYIDX4:%.*]] = getelementptr inbounds nuw i32, ptr 
[[VLA]], i64 [[TMP34]]
 // CHECK4-NEXT:    [[TMP35:%.*]] = getelementptr i32, ptr [[ARRAYIDX4]], i32 1
-// CHECK4-NEXT:    [[TMP36:%.*]] = ptrtoint ptr [[ARRAYIDX]] to i64
-// CHECK4-NEXT:    [[TMP37:%.*]] = ptrtoint ptr [[TMP35]] to i64
-// CHECK4-NEXT:    [[TMP38:%.*]] = sub nuw i64 [[TMP37]], [[TMP36]]
+// CHECK4-NEXT:    [[TMP36:%.*]] = ptrtoaddr ptr [[TMP35]] to i64
+// CHECK4-NEXT:    [[TMP37:%.*]] = ptrtoaddr ptr [[ARRAYIDX]] to i64
+// CHECK4-NEXT:    [[TMP38:%.*]] = sub nuw i64 [[TMP36]], [[TMP37]]
 // CHECK4-NEXT:    [[TMP39:%.*]] = ptrtoint ptr [[ARRAYIDX]] to i64
 // CHECK4-NEXT:    [[TMP40:%.*]] = getelementptr [[STRUCT_KMP_DEPEND_INFO]], 
ptr [[TMP18]], i64 3
 // CHECK4-NEXT:    [[TMP41:%.*]] = getelementptr inbounds nuw 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP40]], i32 0, i32 0
@@ -6892,9 +6892,9 @@ void test_transparent()
 // CHECK4-NEXT:    [[ARRAYIDX15:%.*]] = getelementptr inbounds nuw i32, ptr 
[[VLA]], i64 [[TMP62]]
 // CHECK4-NEXT:    [[ARRAYIDX16:%.*]] = getelementptr inbounds nuw i32, ptr 
[[ARRAYIDX15]], i64 [[TMP61]]
 // CHECK4-NEXT:    [[TMP63:%.*]] = getelementptr i32, ptr [[ARRAYIDX16]], i32 1
-// CHECK4-NEXT:    [[TMP64:%.*]] = ptrtoint ptr [[ARRAYIDX14]] to i64
-// CHECK4-NEXT:    [[TMP65:%.*]] = ptrtoint ptr [[TMP63]] to i64
-// CHECK4-NEXT:    [[TMP66:%.*]] = sub nuw i64 [[TMP65]], [[TMP64]]
+// CHECK4-NEXT:    [[TMP64:%.*]] = ptrtoaddr ptr [[TMP63]] to i64
+// CHECK4-NEXT:    [[TMP65:%.*]] = ptrtoaddr ptr [[ARRAYIDX14]] to i64
+// CHECK4-NEXT:    [[TMP66:%.*]] = sub nuw i64 [[TMP64]], [[TMP65]]
 // CHECK4-NEXT:    [[TMP67:%.*]] = ptrtoint ptr [[ARRAYIDX14]] to i64
 // CHECK4-NEXT:    [[TMP68:%.*]] = getelementptr [[STRUCT_KMP_DEPEND_INFO]], 
ptr [[TMP51]], i64 1
 // CHECK4-NEXT:    [[TMP69:%.*]] = getelementptr inbounds nuw 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP68]], i32 0, i32 0
@@ -6932,9 +6932,9 @@ void test_transparent()
 // CHECK4-NEXT:    [[ARRAYIDX25:%.*]] = getelementptr inbounds nuw i32, ptr 
[[VLA]], i64 [[TMP87]]
 // CHECK4-NEXT:    [[ARRAYIDX26:%.*]] = getelementptr inbounds nuw i32, ptr 
[[ARRAYIDX25]], i64 [[TMP86]]
 // CHECK4-NEXT:    [[TMP88:%.*]] = getelementptr i32, ptr [[ARRAYIDX26]], i32 1
-// CHECK4-NEXT:    [[TMP89:%.*]] = ptrtoint ptr [[ARRAYIDX24]] to i64
-// CHECK4-NEXT:    [[TMP90:%.*]] = ptrtoint ptr [[TMP88]] to i64
-// CHECK4-NEXT:    [[TMP91:%.*]] = sub nuw i64 [[TMP90]], [[TMP89]]
+// CHECK4-NEXT:    [[TMP89:%.*]] = ptrtoaddr ptr [[TMP88]] to i64
+// CHECK4-NEXT:    [[TMP90:%.*]] = ptrtoaddr ptr [[ARRAYIDX24]] to i64
+// CHECK4-NEXT:    [[TMP91:%.*]] = sub nuw i64 [[TMP89]], [[TMP90]]
 // CHECK4-NEXT:    [[TMP92:%.*]] = ptrtoint ptr [[ARRAYIDX24]] to i64
 // CHECK4-NEXT:    [[TMP93:%.*]] = getelementptr [[STRUCT_KMP_DEPEND_INFO]], 
ptr [[TMP76]], i64 1
 // CHECK4-NEXT:    [[TMP94:%.*]] = getelementptr inbounds nuw 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP93]], i32 0, i32 0
@@ -6981,9 +6981,9 @@ void test_transparent()
 // CHECK4-NEXT:    [[ARRAYIDX35:%.*]] = getelementptr inbounds nuw i32, ptr 
[[VLA]], i64 [[TMP116]]
 // CHECK4-NEXT:    [[ARRAYIDX36:%.*]] = getelementptr inbounds nuw i32, ptr 
[[ARRAYIDX35]], i64 [[LEN_SUB_1]]
 // CHECK4-NEXT:    [[TMP117:%.*]] = getelementptr i32, ptr [[ARRAYIDX36]], i32 
1
-// CHECK4-NEXT:    [[TMP118:%.*]] = ptrtoint ptr [[ARRAYIDX34]] to i64
-// CHECK4-NEXT:    [[TMP119:%.*]] = ptrtoint ptr [[TMP117]] to i64
-// CHECK4-NEXT:    [[TMP120:%.*]] = sub nuw i64 [[TMP119]], [[TMP118]]
+// CHECK4-NEXT:    [[TMP118:%.*]] = ptrtoaddr ptr [[TMP117]] to i64
+// CHECK4-NEXT:    [[TMP119:%.*]] = ptrtoaddr ptr [[ARRAYIDX34]] to i64
+// CHECK4-NEXT:    [[TMP120:%.*]] = sub nuw i64 [[TMP118]], [[TMP119]]
 // CHECK4-NEXT:    [[TMP121:%.*]] = ptrtoint ptr [[ARRAYIDX34]] to i64
 // CHECK4-NEXT:    [[TMP122:%.*]] = getelementptr [[STRUCT_KMP_DEPEND_INFO]], 
ptr [[TMP101]], i64 2
 // CHECK4-NEXT:    [[TMP123:%.*]] = getelementptr inbounds nuw 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP122]], i32 0, i32 0
@@ -7866,9 +7866,9 @@ void test_transparent()
 // CHECK3-51-NEXT:    [[TMP34:%.*]] = mul nsw i64 9, [[TMP1]]
 // CHECK3-51-NEXT:    [[ARRAYIDX4:%.*]] = getelementptr inbounds nuw i32, ptr 
[[VLA]], i64 [[TMP34]]
 // CHECK3-51-NEXT:    [[TMP35:%.*]] = getelementptr i32, ptr [[ARRAYIDX4]], 
i32 1
-// CHECK3-51-NEXT:    [[TMP36:%.*]] = ptrtoint ptr [[ARRAYIDX]] to i64
-// CHECK3-51-NEXT:    [[TMP37:%.*]] = ptrtoint ptr [[TMP35]] to i64
-// CHECK3-51-NEXT:    [[TMP38:%.*]] = sub nuw i64 [[TMP37]], [[TMP36]]
+// CHECK3-51-NEXT:    [[TMP36:%.*]] = ptrtoaddr ptr [[TMP35]] to i64
+// CHECK3-51-NEXT:    [[TMP37:%.*]] = ptrtoaddr ptr [[ARRAYIDX]] to i64
+// CHECK3-51-NEXT:    [[TMP38:%.*]] = sub nuw i64 [[TMP36]], [[TMP37]]
 // CHECK3-51-NEXT:    [[TMP39:%.*]] = ptrtoint ptr [[ARRAYIDX]] to i64
 // CHECK3-51-NEXT:    [[TMP40:%.*]] = getelementptr 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP18]], i64 3
 // CHECK3-51-NEXT:    [[TMP41:%.*]] = getelementptr inbounds nuw 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP40]], i32 0, i32 0
@@ -7911,9 +7911,9 @@ void test_transparent()
 // CHECK3-51-NEXT:    [[ARRAYIDX15:%.*]] = getelementptr inbounds nuw i32, ptr 
[[VLA]], i64 [[TMP62]]
 // CHECK3-51-NEXT:    [[ARRAYIDX16:%.*]] = getelementptr inbounds nuw i32, ptr 
[[ARRAYIDX15]], i64 [[TMP61]]
 // CHECK3-51-NEXT:    [[TMP63:%.*]] = getelementptr i32, ptr [[ARRAYIDX16]], 
i32 1
-// CHECK3-51-NEXT:    [[TMP64:%.*]] = ptrtoint ptr [[ARRAYIDX14]] to i64
-// CHECK3-51-NEXT:    [[TMP65:%.*]] = ptrtoint ptr [[TMP63]] to i64
-// CHECK3-51-NEXT:    [[TMP66:%.*]] = sub nuw i64 [[TMP65]], [[TMP64]]
+// CHECK3-51-NEXT:    [[TMP64:%.*]] = ptrtoaddr ptr [[TMP63]] to i64
+// CHECK3-51-NEXT:    [[TMP65:%.*]] = ptrtoaddr ptr [[ARRAYIDX14]] to i64
+// CHECK3-51-NEXT:    [[TMP66:%.*]] = sub nuw i64 [[TMP64]], [[TMP65]]
 // CHECK3-51-NEXT:    [[TMP67:%.*]] = ptrtoint ptr [[ARRAYIDX14]] to i64
 // CHECK3-51-NEXT:    [[TMP68:%.*]] = getelementptr 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP51]], i64 1
 // CHECK3-51-NEXT:    [[TMP69:%.*]] = getelementptr inbounds nuw 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP68]], i32 0, i32 0
@@ -7951,9 +7951,9 @@ void test_transparent()
 // CHECK3-51-NEXT:    [[ARRAYIDX25:%.*]] = getelementptr inbounds nuw i32, ptr 
[[VLA]], i64 [[TMP87]]
 // CHECK3-51-NEXT:    [[ARRAYIDX26:%.*]] = getelementptr inbounds nuw i32, ptr 
[[ARRAYIDX25]], i64 [[TMP86]]
 // CHECK3-51-NEXT:    [[TMP88:%.*]] = getelementptr i32, ptr [[ARRAYIDX26]], 
i32 1
-// CHECK3-51-NEXT:    [[TMP89:%.*]] = ptrtoint ptr [[ARRAYIDX24]] to i64
-// CHECK3-51-NEXT:    [[TMP90:%.*]] = ptrtoint ptr [[TMP88]] to i64
-// CHECK3-51-NEXT:    [[TMP91:%.*]] = sub nuw i64 [[TMP90]], [[TMP89]]
+// CHECK3-51-NEXT:    [[TMP89:%.*]] = ptrtoaddr ptr [[TMP88]] to i64
+// CHECK3-51-NEXT:    [[TMP90:%.*]] = ptrtoaddr ptr [[ARRAYIDX24]] to i64
+// CHECK3-51-NEXT:    [[TMP91:%.*]] = sub nuw i64 [[TMP89]], [[TMP90]]
 // CHECK3-51-NEXT:    [[TMP92:%.*]] = ptrtoint ptr [[ARRAYIDX24]] to i64
 // CHECK3-51-NEXT:    [[TMP93:%.*]] = getelementptr 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP76]], i64 1
 // CHECK3-51-NEXT:    [[TMP94:%.*]] = getelementptr inbounds nuw 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP93]], i32 0, i32 0
@@ -8000,9 +8000,9 @@ void test_transparent()
 // CHECK3-51-NEXT:    [[ARRAYIDX35:%.*]] = getelementptr inbounds nuw i32, ptr 
[[VLA]], i64 [[TMP116]]
 // CHECK3-51-NEXT:    [[ARRAYIDX36:%.*]] = getelementptr inbounds nuw i32, ptr 
[[ARRAYIDX35]], i64 [[LEN_SUB_1]]
 // CHECK3-51-NEXT:    [[TMP117:%.*]] = getelementptr i32, ptr [[ARRAYIDX36]], 
i32 1
-// CHECK3-51-NEXT:    [[TMP118:%.*]] = ptrtoint ptr [[ARRAYIDX34]] to i64
-// CHECK3-51-NEXT:    [[TMP119:%.*]] = ptrtoint ptr [[TMP117]] to i64
-// CHECK3-51-NEXT:    [[TMP120:%.*]] = sub nuw i64 [[TMP119]], [[TMP118]]
+// CHECK3-51-NEXT:    [[TMP118:%.*]] = ptrtoaddr ptr [[TMP117]] to i64
+// CHECK3-51-NEXT:    [[TMP119:%.*]] = ptrtoaddr ptr [[ARRAYIDX34]] to i64
+// CHECK3-51-NEXT:    [[TMP120:%.*]] = sub nuw i64 [[TMP118]], [[TMP119]]
 // CHECK3-51-NEXT:    [[TMP121:%.*]] = ptrtoint ptr [[ARRAYIDX34]] to i64
 // CHECK3-51-NEXT:    [[TMP122:%.*]] = getelementptr 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP101]], i64 2
 // CHECK3-51-NEXT:    [[TMP123:%.*]] = getelementptr inbounds nuw 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP122]], i32 0, i32 0
@@ -8047,9 +8047,9 @@ void test_transparent()
 // CHECK3-51-NEXT:    [[ARRAYIDX47:%.*]] = getelementptr inbounds nuw i32, ptr 
[[VLA]], i64 [[TMP144]]
 // CHECK3-51-NEXT:    [[ARRAYIDX48:%.*]] = getelementptr inbounds nuw i32, ptr 
[[ARRAYIDX47]], i64 [[LEN_SUB_145]]
 // CHECK3-51-NEXT:    [[TMP145:%.*]] = getelementptr i32, ptr [[ARRAYIDX48]], 
i32 1
-// CHECK3-51-NEXT:    [[TMP146:%.*]] = ptrtoint ptr [[ARRAYIDX44]] to i64
-// CHECK3-51-NEXT:    [[TMP147:%.*]] = ptrtoint ptr [[TMP145]] to i64
-// CHECK3-51-NEXT:    [[TMP148:%.*]] = sub nuw i64 [[TMP147]], [[TMP146]]
+// CHECK3-51-NEXT:    [[TMP146:%.*]] = ptrtoaddr ptr [[TMP145]] to i64
+// CHECK3-51-NEXT:    [[TMP147:%.*]] = ptrtoaddr ptr [[ARRAYIDX44]] to i64
+// CHECK3-51-NEXT:    [[TMP148:%.*]] = sub nuw i64 [[TMP146]], [[TMP147]]
 // CHECK3-51-NEXT:    [[TMP149:%.*]] = ptrtoint ptr [[ARRAYIDX44]] to i64
 // CHECK3-51-NEXT:    [[TMP150:%.*]] = getelementptr 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP129]], i64 2
 // CHECK3-51-NEXT:    [[TMP151:%.*]] = getelementptr inbounds nuw 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP150]], i32 0, i32 0
@@ -9381,9 +9381,9 @@ void test_transparent()
 // CHECK4-51-NEXT:    [[TMP34:%.*]] = mul nsw i64 9, [[TMP1]]
 // CHECK4-51-NEXT:    [[ARRAYIDX4:%.*]] = getelementptr inbounds nuw i32, ptr 
[[VLA]], i64 [[TMP34]]
 // CHECK4-51-NEXT:    [[TMP35:%.*]] = getelementptr i32, ptr [[ARRAYIDX4]], 
i32 1
-// CHECK4-51-NEXT:    [[TMP36:%.*]] = ptrtoint ptr [[ARRAYIDX]] to i64
-// CHECK4-51-NEXT:    [[TMP37:%.*]] = ptrtoint ptr [[TMP35]] to i64
-// CHECK4-51-NEXT:    [[TMP38:%.*]] = sub nuw i64 [[TMP37]], [[TMP36]]
+// CHECK4-51-NEXT:    [[TMP36:%.*]] = ptrtoaddr ptr [[TMP35]] to i64
+// CHECK4-51-NEXT:    [[TMP37:%.*]] = ptrtoaddr ptr [[ARRAYIDX]] to i64
+// CHECK4-51-NEXT:    [[TMP38:%.*]] = sub nuw i64 [[TMP36]], [[TMP37]]
 // CHECK4-51-NEXT:    [[TMP39:%.*]] = ptrtoint ptr [[ARRAYIDX]] to i64
 // CHECK4-51-NEXT:    [[TMP40:%.*]] = getelementptr 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP18]], i64 3
 // CHECK4-51-NEXT:    [[TMP41:%.*]] = getelementptr inbounds nuw 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP40]], i32 0, i32 0
@@ -9426,9 +9426,9 @@ void test_transparent()
 // CHECK4-51-NEXT:    [[ARRAYIDX15:%.*]] = getelementptr inbounds nuw i32, ptr 
[[VLA]], i64 [[TMP62]]
 // CHECK4-51-NEXT:    [[ARRAYIDX16:%.*]] = getelementptr inbounds nuw i32, ptr 
[[ARRAYIDX15]], i64 [[TMP61]]
 // CHECK4-51-NEXT:    [[TMP63:%.*]] = getelementptr i32, ptr [[ARRAYIDX16]], 
i32 1
-// CHECK4-51-NEXT:    [[TMP64:%.*]] = ptrtoint ptr [[ARRAYIDX14]] to i64
-// CHECK4-51-NEXT:    [[TMP65:%.*]] = ptrtoint ptr [[TMP63]] to i64
-// CHECK4-51-NEXT:    [[TMP66:%.*]] = sub nuw i64 [[TMP65]], [[TMP64]]
+// CHECK4-51-NEXT:    [[TMP64:%.*]] = ptrtoaddr ptr [[TMP63]] to i64
+// CHECK4-51-NEXT:    [[TMP65:%.*]] = ptrtoaddr ptr [[ARRAYIDX14]] to i64
+// CHECK4-51-NEXT:    [[TMP66:%.*]] = sub nuw i64 [[TMP64]], [[TMP65]]
 // CHECK4-51-NEXT:    [[TMP67:%.*]] = ptrtoint ptr [[ARRAYIDX14]] to i64
 // CHECK4-51-NEXT:    [[TMP68:%.*]] = getelementptr 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP51]], i64 1
 // CHECK4-51-NEXT:    [[TMP69:%.*]] = getelementptr inbounds nuw 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP68]], i32 0, i32 0
@@ -9466,9 +9466,9 @@ void test_transparent()
 // CHECK4-51-NEXT:    [[ARRAYIDX25:%.*]] = getelementptr inbounds nuw i32, ptr 
[[VLA]], i64 [[TMP87]]
 // CHECK4-51-NEXT:    [[ARRAYIDX26:%.*]] = getelementptr inbounds nuw i32, ptr 
[[ARRAYIDX25]], i64 [[TMP86]]
 // CHECK4-51-NEXT:    [[TMP88:%.*]] = getelementptr i32, ptr [[ARRAYIDX26]], 
i32 1
-// CHECK4-51-NEXT:    [[TMP89:%.*]] = ptrtoint ptr [[ARRAYIDX24]] to i64
-// CHECK4-51-NEXT:    [[TMP90:%.*]] = ptrtoint ptr [[TMP88]] to i64
-// CHECK4-51-NEXT:    [[TMP91:%.*]] = sub nuw i64 [[TMP90]], [[TMP89]]
+// CHECK4-51-NEXT:    [[TMP89:%.*]] = ptrtoaddr ptr [[TMP88]] to i64
+// CHECK4-51-NEXT:    [[TMP90:%.*]] = ptrtoaddr ptr [[ARRAYIDX24]] to i64
+// CHECK4-51-NEXT:    [[TMP91:%.*]] = sub nuw i64 [[TMP89]], [[TMP90]]
 // CHECK4-51-NEXT:    [[TMP92:%.*]] = ptrtoint ptr [[ARRAYIDX24]] to i64
 // CHECK4-51-NEXT:    [[TMP93:%.*]] = getelementptr 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP76]], i64 1
 // CHECK4-51-NEXT:    [[TMP94:%.*]] = getelementptr inbounds nuw 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP93]], i32 0, i32 0
@@ -9515,9 +9515,9 @@ void test_transparent()
 // CHECK4-51-NEXT:    [[ARRAYIDX35:%.*]] = getelementptr inbounds nuw i32, ptr 
[[VLA]], i64 [[TMP116]]
 // CHECK4-51-NEXT:    [[ARRAYIDX36:%.*]] = getelementptr inbounds nuw i32, ptr 
[[ARRAYIDX35]], i64 [[LEN_SUB_1]]
 // CHECK4-51-NEXT:    [[TMP117:%.*]] = getelementptr i32, ptr [[ARRAYIDX36]], 
i32 1
-// CHECK4-51-NEXT:    [[TMP118:%.*]] = ptrtoint ptr [[ARRAYIDX34]] to i64
-// CHECK4-51-NEXT:    [[TMP119:%.*]] = ptrtoint ptr [[TMP117]] to i64
-// CHECK4-51-NEXT:    [[TMP120:%.*]] = sub nuw i64 [[TMP119]], [[TMP118]]
+// CHECK4-51-NEXT:    [[TMP118:%.*]] = ptrtoaddr ptr [[TMP117]] to i64
+// CHECK4-51-NEXT:    [[TMP119:%.*]] = ptrtoaddr ptr [[ARRAYIDX34]] to i64
+// CHECK4-51-NEXT:    [[TMP120:%.*]] = sub nuw i64 [[TMP118]], [[TMP119]]
 // CHECK4-51-NEXT:    [[TMP121:%.*]] = ptrtoint ptr [[ARRAYIDX34]] to i64
 // CHECK4-51-NEXT:    [[TMP122:%.*]] = getelementptr 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP101]], i64 2
 // CHECK4-51-NEXT:    [[TMP123:%.*]] = getelementptr inbounds nuw 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP122]], i32 0, i32 0
@@ -10397,9 +10397,9 @@ void test_transparent()
 // CHECK6-NEXT:    [[TMP34:%.*]] = mul nsw i64 9, [[TMP1]]
 // CHECK6-NEXT:    [[ARRAYIDX4:%.*]] = getelementptr inbounds nuw i32, ptr 
[[VLA]], i64 [[TMP34]]
 // CHECK6-NEXT:    [[TMP35:%.*]] = getelementptr i32, ptr [[ARRAYIDX4]], i32 1
-// CHECK6-NEXT:    [[TMP36:%.*]] = ptrtoint ptr [[ARRAYIDX]] to i64
-// CHECK6-NEXT:    [[TMP37:%.*]] = ptrtoint ptr [[TMP35]] to i64
-// CHECK6-NEXT:    [[TMP38:%.*]] = sub nuw i64 [[TMP37]], [[TMP36]]
+// CHECK6-NEXT:    [[TMP36:%.*]] = ptrtoaddr ptr [[TMP35]] to i64
+// CHECK6-NEXT:    [[TMP37:%.*]] = ptrtoaddr ptr [[ARRAYIDX]] to i64
+// CHECK6-NEXT:    [[TMP38:%.*]] = sub nuw i64 [[TMP36]], [[TMP37]]
 // CHECK6-NEXT:    [[TMP39:%.*]] = ptrtoint ptr [[ARRAYIDX]] to i64
 // CHECK6-NEXT:    [[TMP40:%.*]] = getelementptr [[STRUCT_KMP_DEPEND_INFO]], 
ptr [[TMP18]], i64 3
 // CHECK6-NEXT:    [[TMP41:%.*]] = getelementptr inbounds nuw 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP40]], i32 0, i32 0
@@ -10442,9 +10442,9 @@ void test_transparent()
 // CHECK6-NEXT:    [[ARRAYIDX15:%.*]] = getelementptr inbounds nuw i32, ptr 
[[VLA]], i64 [[TMP62]]
 // CHECK6-NEXT:    [[ARRAYIDX16:%.*]] = getelementptr inbounds nuw i32, ptr 
[[ARRAYIDX15]], i64 [[TMP61]]
 // CHECK6-NEXT:    [[TMP63:%.*]] = getelementptr i32, ptr [[ARRAYIDX16]], i32 1
-// CHECK6-NEXT:    [[TMP64:%.*]] = ptrtoint ptr [[ARRAYIDX14]] to i64
-// CHECK6-NEXT:    [[TMP65:%.*]] = ptrtoint ptr [[TMP63]] to i64
-// CHECK6-NEXT:    [[TMP66:%.*]] = sub nuw i64 [[TMP65]], [[TMP64]]
+// CHECK6-NEXT:    [[TMP64:%.*]] = ptrtoaddr ptr [[TMP63]] to i64
+// CHECK6-NEXT:    [[TMP65:%.*]] = ptrtoaddr ptr [[ARRAYIDX14]] to i64
+// CHECK6-NEXT:    [[TMP66:%.*]] = sub nuw i64 [[TMP64]], [[TMP65]]
 // CHECK6-NEXT:    [[TMP67:%.*]] = ptrtoint ptr [[ARRAYIDX14]] to i64
 // CHECK6-NEXT:    [[TMP68:%.*]] = getelementptr [[STRUCT_KMP_DEPEND_INFO]], 
ptr [[TMP51]], i64 1
 // CHECK6-NEXT:    [[TMP69:%.*]] = getelementptr inbounds nuw 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP68]], i32 0, i32 0
@@ -10482,9 +10482,9 @@ void test_transparent()
 // CHECK6-NEXT:    [[ARRAYIDX25:%.*]] = getelementptr inbounds nuw i32, ptr 
[[VLA]], i64 [[TMP87]]
 // CHECK6-NEXT:    [[ARRAYIDX26:%.*]] = getelementptr inbounds nuw i32, ptr 
[[ARRAYIDX25]], i64 [[TMP86]]
 // CHECK6-NEXT:    [[TMP88:%.*]] = getelementptr i32, ptr [[ARRAYIDX26]], i32 1
-// CHECK6-NEXT:    [[TMP89:%.*]] = ptrtoint ptr [[ARRAYIDX24]] to i64
-// CHECK6-NEXT:    [[TMP90:%.*]] = ptrtoint ptr [[TMP88]] to i64
-// CHECK6-NEXT:    [[TMP91:%.*]] = sub nuw i64 [[TMP90]], [[TMP89]]
+// CHECK6-NEXT:    [[TMP89:%.*]] = ptrtoaddr ptr [[TMP88]] to i64
+// CHECK6-NEXT:    [[TMP90:%.*]] = ptrtoaddr ptr [[ARRAYIDX24]] to i64
+// CHECK6-NEXT:    [[TMP91:%.*]] = sub nuw i64 [[TMP89]], [[TMP90]]
 // CHECK6-NEXT:    [[TMP92:%.*]] = ptrtoint ptr [[ARRAYIDX24]] to i64
 // CHECK6-NEXT:    [[TMP93:%.*]] = getelementptr [[STRUCT_KMP_DEPEND_INFO]], 
ptr [[TMP76]], i64 1
 // CHECK6-NEXT:    [[TMP94:%.*]] = getelementptr inbounds nuw 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP93]], i32 0, i32 0
@@ -10531,9 +10531,9 @@ void test_transparent()
 // CHECK6-NEXT:    [[ARRAYIDX35:%.*]] = getelementptr inbounds nuw i32, ptr 
[[VLA]], i64 [[TMP116]]
 // CHECK6-NEXT:    [[ARRAYIDX36:%.*]] = getelementptr inbounds nuw i32, ptr 
[[ARRAYIDX35]], i64 [[LEN_SUB_1]]
 // CHECK6-NEXT:    [[TMP117:%.*]] = getelementptr i32, ptr [[ARRAYIDX36]], i32 
1
-// CHECK6-NEXT:    [[TMP118:%.*]] = ptrtoint ptr [[ARRAYIDX34]] to i64
-// CHECK6-NEXT:    [[TMP119:%.*]] = ptrtoint ptr [[TMP117]] to i64
-// CHECK6-NEXT:    [[TMP120:%.*]] = sub nuw i64 [[TMP119]], [[TMP118]]
+// CHECK6-NEXT:    [[TMP118:%.*]] = ptrtoaddr ptr [[TMP117]] to i64
+// CHECK6-NEXT:    [[TMP119:%.*]] = ptrtoaddr ptr [[ARRAYIDX34]] to i64
+// CHECK6-NEXT:    [[TMP120:%.*]] = sub nuw i64 [[TMP118]], [[TMP119]]
 // CHECK6-NEXT:    [[TMP121:%.*]] = ptrtoint ptr [[ARRAYIDX34]] to i64
 // CHECK6-NEXT:    [[TMP122:%.*]] = getelementptr [[STRUCT_KMP_DEPEND_INFO]], 
ptr [[TMP101]], i64 2
 // CHECK6-NEXT:    [[TMP123:%.*]] = getelementptr inbounds nuw 
[[STRUCT_KMP_DEPEND_INFO]], ptr [[TMP122]], i32 0, i32 0
diff --git a/llvm/include/llvm/IR/IRBuilder.h b/llvm/include/llvm/IR/IRBuilder.h
index 94d5943522070..5c0d0ab6a5015 100644
--- a/llvm/include/llvm/IR/IRBuilder.h
+++ b/llvm/include/llvm/IR/IRBuilder.h
@@ -2655,7 +2655,8 @@ class IRBuilderBase {
 
   /// Return the difference between two pointer values. The returned value
   /// type is the address type of the pointers.
-  LLVM_ABI Value *CreatePtrDiff(Value *LHS, Value *RHS, const Twine &Name = 
"");
+  LLVM_ABI Value *CreatePtrDiff(Value *LHS, Value *RHS, const Twine &Name = "",
+                                bool IsNUW = false);
 
   /// Return the difference between two pointer values, dividing out the size
   /// of the pointed-to objects. The returned value type is the address type
diff --git a/llvm/lib/IR/IRBuilder.cpp b/llvm/lib/IR/IRBuilder.cpp
index 13e467b05f691..4c6f2326fe149 100644
--- a/llvm/lib/IR/IRBuilder.cpp
+++ b/llvm/lib/IR/IRBuilder.cpp
@@ -1129,12 +1129,13 @@ Value *IRBuilderBase::CreateSelectFMF(Value *C, Value 
*True, Value *False,
   return Insert(Sel, Name);
 }
 
-Value *IRBuilderBase::CreatePtrDiff(Value *LHS, Value *RHS, const Twine &Name) 
{
+Value *IRBuilderBase::CreatePtrDiff(Value *LHS, Value *RHS, const Twine &Name,
+                                    bool IsNUW) {
   assert(LHS->getType() == RHS->getType() &&
          "Pointer subtraction operand types must match!");
   Value *LHSAddr = CreatePtrToAddr(LHS);
   Value *RHSAddr = CreatePtrToAddr(RHS);
-  return CreateSub(LHSAddr, RHSAddr, Name);
+  return CreateSub(LHSAddr, RHSAddr, Name, IsNUW);
 }
 Value *IRBuilderBase::CreatePtrDiff(Type *ElemTy, Value *LHS, Value *RHS,
                                     const Twine &Name) {

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to