[AMDGPUCtorDtorLowering] Remove unnecessary pointer arithmetic (#182869)
This code was computing `begin + ((end - begin) exact/ 8) * 8`, which is a very complicated way to spell end. This is the AMDGPU edition of https://github.com/llvm/llvm-project/pull/182269.
This commit is contained in:
parent
1237bd6df0
commit
13530d4470
@ -109,19 +109,8 @@ static void createInitOrFiniCalls(Function &F, bool IsCtor) {
|
||||
// The destructor array must be called in reverse order. Get a constant
|
||||
// expression to the end of the array and iterate backwards instead.
|
||||
if (!IsCtor) {
|
||||
Type *Int64Ty = IntegerType::getInt64Ty(C);
|
||||
auto *EndPtr = IRB.CreatePtrToInt(End, Int64Ty);
|
||||
auto *BeginPtr = IRB.CreatePtrToInt(Begin, Int64Ty);
|
||||
auto *ByteSize = IRB.CreateSub(EndPtr, BeginPtr, "", /*HasNUW=*/true,
|
||||
/*HasNSW=*/true);
|
||||
auto *Size = IRB.CreateAShr(ByteSize, ConstantInt::get(Int64Ty, 3), "",
|
||||
/*isExact=*/true);
|
||||
auto *Offset =
|
||||
IRB.CreateSub(Size, ConstantInt::get(Int64Ty, 1), "", /*HasNUW=*/true,
|
||||
/*HasNSW=*/true);
|
||||
Start = IRB.CreateInBoundsGEP(
|
||||
PtrArrayTy, Begin,
|
||||
ArrayRef<Value *>({ConstantInt::get(Int64Ty, 0), Offset}));
|
||||
PtrTy, End, ConstantInt::getAllOnesValue(IRB.getInt64Ty()));
|
||||
Stop = Begin;
|
||||
}
|
||||
|
||||
|
||||
@ -64,13 +64,10 @@ define void @bar() addrspace(1) {
|
||||
; CHECK-LABEL: define weak_odr amdgpu_kernel void @amdgcn.device.fini(
|
||||
; CHECK-SAME: ) #[[ATTR2:[0-9]+]] {
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[TMP0:%.*]] = ashr exact i64 sub nuw nsw (i64 ptrtoint (ptr addrspace(1) @__fini_array_end to i64), i64 ptrtoint (ptr addrspace(1) @__fini_array_start to i64)), 3
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = sub nuw nsw i64 [[TMP0]], 1
|
||||
; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds [0 x ptr addrspace(1)], ptr addrspace(1) @__fini_array_start, i64 0, i64 [[TMP1]]
|
||||
; CHECK-NEXT: [[TMP3:%.*]] = icmp uge ptr addrspace(1) [[TMP2]], @__fini_array_start
|
||||
; CHECK-NEXT: [[TMP3:%.*]] = icmp uge ptr addrspace(1) getelementptr inbounds (ptr addrspace(1), ptr addrspace(1) @__fini_array_end, i64 -1), @__fini_array_start
|
||||
; CHECK-NEXT: br i1 [[TMP3]], label [[WHILE_ENTRY:%.*]], label [[WHILE_END:%.*]]
|
||||
; CHECK: while.entry:
|
||||
; CHECK-NEXT: [[PTR:%.*]] = phi ptr addrspace(1) [ [[TMP2]], [[ENTRY:%.*]] ], [ [[NEXT:%.*]], [[WHILE_ENTRY]] ]
|
||||
; CHECK-NEXT: [[PTR:%.*]] = phi ptr addrspace(1) [ getelementptr inbounds (ptr addrspace(1), ptr addrspace(1) @__fini_array_end, i64 -1), [[ENTRY:%.*]] ], [ [[NEXT:%.*]], [[WHILE_ENTRY]] ]
|
||||
; CHECK-NEXT: [[CALLBACK:%.*]] = load ptr, ptr addrspace(1) [[PTR]], align 8
|
||||
; CHECK-NEXT: call void [[CALLBACK]]()
|
||||
; CHECK-NEXT: [[NEXT]] = getelementptr ptr addrspace(1), ptr addrspace(1) [[PTR]], i64 -1
|
||||
|
||||
@ -79,13 +79,10 @@ define internal void @bar() {
|
||||
; CHECK-LABEL: define weak_odr amdgpu_kernel void @amdgcn.device.fini(
|
||||
; CHECK-SAME: ) #[[ATTR1:[0-9]+]] {
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[TMP0:%.*]] = ashr exact i64 sub nuw nsw (i64 ptrtoint (ptr addrspace(1) @__fini_array_end to i64), i64 ptrtoint (ptr addrspace(1) @__fini_array_start to i64)), 3
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = sub nuw nsw i64 [[TMP0]], 1
|
||||
; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds [0 x ptr addrspace(1)], ptr addrspace(1) @__fini_array_start, i64 0, i64 [[TMP1]]
|
||||
; CHECK-NEXT: [[TMP3:%.*]] = icmp uge ptr addrspace(1) [[TMP2]], @__fini_array_start
|
||||
; CHECK-NEXT: [[TMP3:%.*]] = icmp uge ptr addrspace(1) getelementptr inbounds (ptr addrspace(1), ptr addrspace(1) @__fini_array_end, i64 -1), @__fini_array_start
|
||||
; CHECK-NEXT: br i1 [[TMP3]], label [[WHILE_ENTRY:%.*]], label [[WHILE_END:%.*]]
|
||||
; CHECK: while.entry:
|
||||
; CHECK-NEXT: [[PTR:%.*]] = phi ptr addrspace(1) [ [[TMP2]], [[ENTRY:%.*]] ], [ [[NEXT:%.*]], [[WHILE_ENTRY]] ]
|
||||
; CHECK-NEXT: [[PTR:%.*]] = phi ptr addrspace(1) [ getelementptr inbounds (ptr addrspace(1), ptr addrspace(1) @__fini_array_end, i64 -1), [[ENTRY:%.*]] ], [ [[NEXT:%.*]], [[WHILE_ENTRY]] ]
|
||||
; CHECK-NEXT: [[CALLBACK:%.*]] = load ptr, ptr addrspace(1) [[PTR]], align 8
|
||||
; CHECK-NEXT: call void [[CALLBACK]]()
|
||||
; CHECK-NEXT: [[NEXT]] = getelementptr ptr addrspace(1), ptr addrspace(1) [[PTR]], i64 -1
|
||||
|
||||
@ -71,13 +71,10 @@ define internal void @bar.5() {
|
||||
; CHECK-LABEL: define weak_odr amdgpu_kernel void @amdgcn.device.fini(
|
||||
; CHECK-SAME: ) #[[ATTR1:[0-9]+]] {
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[TMP0:%.*]] = ashr exact i64 sub nuw nsw (i64 ptrtoint (ptr addrspace(1) @__fini_array_end to i64), i64 ptrtoint (ptr addrspace(1) @__fini_array_start to i64)), 3
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = sub nuw nsw i64 [[TMP0]], 1
|
||||
; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds [0 x ptr addrspace(1)], ptr addrspace(1) @__fini_array_start, i64 0, i64 [[TMP1]]
|
||||
; CHECK-NEXT: [[TMP3:%.*]] = icmp uge ptr addrspace(1) [[TMP2]], @__fini_array_start
|
||||
; CHECK-NEXT: [[TMP3:%.*]] = icmp uge ptr addrspace(1) getelementptr inbounds (ptr addrspace(1), ptr addrspace(1) @__fini_array_end, i64 -1), @__fini_array_start
|
||||
; CHECK-NEXT: br i1 [[TMP3]], label [[WHILE_ENTRY:%.*]], label [[WHILE_END:%.*]]
|
||||
; CHECK: while.entry:
|
||||
; CHECK-NEXT: [[PTR:%.*]] = phi ptr addrspace(1) [ [[TMP2]], [[ENTRY:%.*]] ], [ [[NEXT:%.*]], [[WHILE_ENTRY]] ]
|
||||
; CHECK-NEXT: [[PTR:%.*]] = phi ptr addrspace(1) [ getelementptr inbounds (ptr addrspace(1), ptr addrspace(1) @__fini_array_end, i64 -1), [[ENTRY:%.*]] ], [ [[NEXT:%.*]], [[WHILE_ENTRY]] ]
|
||||
; CHECK-NEXT: [[CALLBACK:%.*]] = load ptr, ptr addrspace(1) [[PTR]], align 8
|
||||
; CHECK-NEXT: call void [[CALLBACK]]()
|
||||
; CHECK-NEXT: [[NEXT]] = getelementptr ptr addrspace(1), ptr addrspace(1) [[PTR]], i64 -1
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user