@@ -261,3 +261,51 @@ define i32 @ptrtoaddr_of_ptrmask_addrsize(ptr addrspace(1) %p, i32 %mask) {
261261 %addr = ptr toaddr ptr addrspace (1 ) %masked to i32
262262 ret i32 %addr
263263}
264+
265+ define i64 @ptrtoaddr_of_gep_of_inttoptr (i64 %int , i64 %offset ) {
266+ ; CHECK-LABEL: define i64 @ptrtoaddr_of_gep_of_inttoptr(
267+ ; CHECK-SAME: i64 [[INT:%.*]], i64 [[OFFSET:%.*]]) {
268+ ; CHECK-NEXT: [[ADDR:%.*]] = add i64 [[INT]], [[OFFSET]]
269+ ; CHECK-NEXT: ret i64 [[ADDR]]
270+ ;
271+ %ptr = inttoptr i64 %int to ptr
272+ %gep = getelementptr i8 , ptr %ptr , i64 %offset
273+ %addr = ptr toaddr ptr %gep to i64
274+ ret i64 %addr
275+ }
276+
277+ ; FIXME: This could be supported by truncating %int before performing the
278+ ; arithmetic.
279+ define i32 @ptrtoaddr_of_gep_of_inttoptr_addrsize (i64 %int , i32 %offset ) {
280+ ; CHECK-LABEL: define i32 @ptrtoaddr_of_gep_of_inttoptr_addrsize(
281+ ; CHECK-SAME: i64 [[INT:%.*]], i32 [[OFFSET:%.*]]) {
282+ ; CHECK-NEXT: [[PTR:%.*]] = inttoptr i64 [[INT]] to ptr addrspace(1)
283+ ; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr addrspace(1) [[PTR]], i32 [[OFFSET]]
284+ ; CHECK-NEXT: [[ADDR:%.*]] = ptrtoaddr ptr addrspace(1) [[GEP]] to i32
285+ ; CHECK-NEXT: ret i32 [[ADDR]]
286+ ;
287+ %ptr = inttoptr i64 %int to ptr addrspace (1 )
288+ %gep = getelementptr i8 , ptr addrspace (1 ) %ptr , i32 %offset
289+ %addr = ptr toaddr ptr addrspace (1 ) %gep to i32
290+ ret i32 %addr
291+ }
292+
293+ define i64 @ptrtoaddr_of_gep_of_null (i64 %offset ) {
294+ ; CHECK-LABEL: define i64 @ptrtoaddr_of_gep_of_null(
295+ ; CHECK-SAME: i64 [[OFFSET:%.*]]) {
296+ ; CHECK-NEXT: ret i64 [[OFFSET]]
297+ ;
298+ %gep = getelementptr i8 , ptr null , i64 %offset
299+ %addr = ptr toaddr ptr %gep to i64
300+ ret i64 %addr
301+ }
302+
303+ define i32 @ptrtoaddr_of_gep_of_null_addrsize (i32 %offset ) {
304+ ; CHECK-LABEL: define i32 @ptrtoaddr_of_gep_of_null_addrsize(
305+ ; CHECK-SAME: i32 [[OFFSET:%.*]]) {
306+ ; CHECK-NEXT: ret i32 [[OFFSET]]
307+ ;
308+ %gep = getelementptr i8 , ptr addrspace (1 ) null , i32 %offset
309+ %addr = ptr toaddr ptr addrspace (1 ) %gep to i32
310+ ret i32 %addr
311+ }
0 commit comments