Index: llvm/lib/Transforms/Utils/CodeExtractor.cpp =================================================================== --- llvm/lib/Transforms/Utils/CodeExtractor.cpp +++ llvm/lib/Transforms/Utils/CodeExtractor.cpp @@ -1091,32 +1091,20 @@ Module *M, ArrayRef LifetimesStart, ArrayRef LifetimesEnd, CallInst *TheCall) { LLVMContext &Ctx = M->getContext(); - auto Int8PtrTy = Type::getInt8PtrTy(Ctx); auto NegativeOne = ConstantInt::getSigned(Type::getInt64Ty(Ctx), -1); Instruction *Term = TheCall->getParent()->getTerminator(); - // The memory argument to a lifetime marker must be a i8*. Cache any bitcasts - // needed to satisfy this requirement so they may be reused. - DenseMap Bitcasts; - // Emit lifetime markers for the pointers given in \p Objects. Insert the // markers before the call if \p InsertBefore, and after the call otherwise. - auto insertMarkers = [&](Function *MarkerFunc, ArrayRef Objects, + auto insertMarkers = [&](Intrinsic::ID MarkerFunc, ArrayRef Objects, bool InsertBefore) { for (Value *Mem : Objects) { assert((!isa(Mem) || cast(Mem)->getFunction() == TheCall->getFunction()) && "Input memory not defined in original function"); - Value *&MemAsI8Ptr = Bitcasts[Mem]; - if (!MemAsI8Ptr) { - if (Mem->getType() == Int8PtrTy) - MemAsI8Ptr = Mem; - else - MemAsI8Ptr = - CastInst::CreatePointerCast(Mem, Int8PtrTy, "lt.cast", TheCall); - } - auto Marker = CallInst::Create(MarkerFunc, {NegativeOne, MemAsI8Ptr}); + Function *Func = Intrinsic::getDeclaration(M, MarkerFunc, Mem->getType()); + auto Marker = CallInst::Create(Func, {NegativeOne, Mem}); if (InsertBefore) Marker->insertBefore(TheCall); else @@ -1125,15 +1113,13 @@ }; if (!LifetimesStart.empty()) { - auto StartFn = llvm::Intrinsic::getDeclaration( - M, llvm::Intrinsic::lifetime_start, Int8PtrTy); - insertMarkers(StartFn, LifetimesStart, /*InsertBefore=*/true); + insertMarkers(Intrinsic::lifetime_start, LifetimesStart, + /*InsertBefore=*/true); } if (!LifetimesEnd.empty()) { - auto EndFn = llvm::Intrinsic::getDeclaration( - M, llvm::Intrinsic::lifetime_end, Int8PtrTy); - insertMarkers(EndFn, LifetimesEnd, /*InsertBefore=*/false); + insertMarkers(Intrinsic::lifetime_end, LifetimesEnd, + /*InsertBefore=*/false); } } Index: llvm/test/Transforms/IROutliner/alloca-addrspace-1.ll =================================================================== --- llvm/test/Transforms/IROutliner/alloca-addrspace-1.ll +++ llvm/test/Transforms/IROutliner/alloca-addrspace-1.ll @@ -20,16 +20,14 @@ ; CHECK-NEXT: bb: ; CHECK-NEXT: [[I3_LOC:%.*]] = alloca i32, align 4, addrspace(5) ; CHECK-NEXT: [[I1_LOC:%.*]] = alloca i32, align 4, addrspace(5) -; CHECK-NEXT: [[LT_CAST:%.*]] = addrspacecast ptr addrspace(5) [[I1_LOC]] to ptr -; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 -1, ptr [[LT_CAST]]) +; CHECK-NEXT: call void @llvm.lifetime.start.p5(i64 -1, ptr addrspace(5) [[I1_LOC]]) ; CHECK-NEXT: call void @outlined_ir_func_0(i32 0, i32 1, ptr addrspace(5) [[I1_LOC]]) ; CHECK-NEXT: [[I1_RELOAD:%.*]] = load i32, ptr addrspace(5) [[I1_LOC]], align 4 -; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 -1, ptr [[LT_CAST]]) -; CHECK-NEXT: [[LT_CAST1:%.*]] = addrspacecast ptr addrspace(5) [[I3_LOC]] to ptr -; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 -1, ptr [[LT_CAST1]]) +; CHECK-NEXT: call void @llvm.lifetime.end.p5(i64 -1, ptr addrspace(5) [[I1_LOC]]) +; CHECK-NEXT: call void @llvm.lifetime.start.p5(i64 -1, ptr addrspace(5) [[I3_LOC]]) ; CHECK-NEXT: call void @outlined_ir_func_0(i32 [[I1_RELOAD]], i32 0, ptr addrspace(5) [[I3_LOC]]) ; CHECK-NEXT: [[I3_RELOAD:%.*]] = load i32, ptr addrspace(5) [[I3_LOC]], align 4 -; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 -1, ptr [[LT_CAST1]]) +; CHECK-NEXT: call void @llvm.lifetime.end.p5(i64 -1, ptr addrspace(5) [[I3_LOC]]) ; CHECK-NEXT: [[I4:%.*]] = tail call i32 @llvm.foo(i32 [[I3_RELOAD]], i32 0) ; CHECK-NEXT: ret i32 0 ;