Index: llvm/lib/IR/AutoUpgrade.cpp =================================================================== --- llvm/lib/IR/AutoUpgrade.cpp +++ llvm/lib/IR/AutoUpgrade.cpp @@ -773,7 +773,8 @@ Intrinsic::lifetime_start : Intrinsic::invariant_start; auto Args = F->getFunctionType()->params(); Type* ObjectPtr[1] = {Args[1]}; - if (F->getName() != Intrinsic::getName(ID, ObjectPtr)) { + if (F->getName() != + Intrinsic::getName(ID, ObjectPtr, F->getParent(), nullptr)) { rename(F); NewFn = Intrinsic::getDeclaration(F->getParent(), ID, ObjectPtr); return true; @@ -787,7 +788,8 @@ auto Args = F->getFunctionType()->params(); Type* ObjectPtr[1] = {Args[IsLifetimeEnd ? 1 : 2]}; - if (F->getName() != Intrinsic::getName(ID, ObjectPtr)) { + if (F->getName() != + Intrinsic::getName(ID, ObjectPtr, F->getParent(), nullptr)) { rename(F); NewFn = Intrinsic::getDeclaration(F->getParent(), ID, ObjectPtr); return true; @@ -923,7 +925,8 @@ if (Name.startswith("objectsize.")) { Type *Tys[2] = { F->getReturnType(), F->arg_begin()->getType() }; if (F->arg_size() == 2 || F->arg_size() == 3 || - F->getName() != Intrinsic::getName(Intrinsic::objectsize, Tys)) { + F->getName() != Intrinsic::getName(Intrinsic::objectsize, Tys, + F->getParent(), nullptr)) { rename(F); NewFn = Intrinsic::getDeclaration(F->getParent(), Intrinsic::objectsize, Tys); Index: llvm/test/Assembler/auto_upgrade_intrinsics.ll =================================================================== --- llvm/test/Assembler/auto_upgrade_intrinsics.ll +++ llvm/test/Assembler/auto_upgrade_intrinsics.ll @@ -2,15 +2,14 @@ ; RUN: llvm-as < %s | llvm-dis | FileCheck %s ; RUN: verify-uselistorder %s +%0 = type opaque; + declare i8 @llvm.ctlz.i8(i8) declare i16 @llvm.ctlz.i16(i16) declare i32 @llvm.ctlz.i32(i32) declare i42 @llvm.ctlz.i42(i42) ; Not a power-of-2 -declare i32 @llvm.objectsize.i32(i8*, i1) nounwind readonly - - define void @test.ctlz(i8 %a, i16 %b, i32 %c, i42 %d) { ; CHECK: @test.ctlz @@ -51,6 +50,7 @@ @a = private global [60 x i8] zeroinitializer, align 1 +declare i32 @llvm.objectsize.i32(i8*, i1) nounwind readonly define i32 @test.objectsize() { ; CHECK-LABEL: @test.objectsize( ; CHECK: @llvm.objectsize.i32.p0i8(i8* getelementptr inbounds ([60 x i8], [60 x i8]* @a, i32 0, i32 0), i1 false, i1 false, i1 false) @@ -66,6 +66,24 @@ ret i64 %s } +@u = private global [60 x %0*] zeroinitializer, align 1 + +declare i32 @llvm.objectsize.i32.unnamed(%0**, i1) nounwind readonly +define i32 @test.objectsize.unnamed() { +; CHECK-LABEL: @test.objectsize.unnamed( +; CHECK: @llvm.objectsize.i32.p0p0s_s.0(%0** getelementptr inbounds ([60 x %0*], [60 x %0*]* @u, i32 0, i32 0), i1 false, i1 false, i1 false) + %s = call i32 @llvm.objectsize.i32.unnamed(%0** getelementptr inbounds ([60 x %0*], [60 x %0*]* @u, i32 0, i32 0), i1 false) + ret i32 %s +} + +declare i64 @llvm.objectsize.i64.p0p0s_s.0(%0**, i1) nounwind readonly +define i64 @test.objectsize.unnamed.2() { +; CHECK-LABEL: @test.objectsize.unnamed.2( +; CHECK: @llvm.objectsize.i64.p0p0s_s.0(%0** getelementptr inbounds ([60 x %0*], [60 x %0*]* @u, i32 0, i32 0), i1 false, i1 false, i1 false) + %s = call i64 @llvm.objectsize.i64.p0p0s_s.0(%0** getelementptr inbounds ([60 x %0*], [60 x %0*]* @u, i32 0, i32 0), i1 false) + ret i64 %s +} + declare <2 x double> @llvm.masked.load.v2f64(<2 x double>* %ptrs, i32, <2 x i1> %mask, <2 x double> %src0) define <2 x double> @tests.masked.load(<2 x double>* %ptr, <2 x i1> %mask, <2 x double> %passthru) { @@ -116,6 +134,20 @@ ret void } +declare {}* @llvm.invariant.start.unnamed(i64, %0** nocapture) nounwind readonly +declare void @llvm.invariant.end.unnamed({}*, i64, %0** nocapture) nounwind + +define void @tests.invariant.start.end.unnamed() { + ; CHECK-LABEL: @tests.invariant.start.end.unnamed( + %a = alloca %0* + %i = call {}* @llvm.invariant.start.unnamed(i64 1, %0** %a) + ; CHECK: call {}* @llvm.invariant.start.p0p0s_s.0 + store %0* null, %0** %a + call void @llvm.invariant.end.unnamed({}* %i, i64 1, %0** %a) + ; CHECK: call void @llvm.invariant.end.p0p0s_s.0 + ret void +} + @__stack_chk_guard = external global i8* declare void @llvm.stackprotectorcheck(i8**) @@ -140,6 +172,20 @@ ret void } +declare void @llvm.lifetime.start.unnamed(i64, %0** nocapture) nounwind readonly +declare void @llvm.lifetime.end.unnamed(i64, %0** nocapture) nounwind + +define void @tests.lifetime.start.end.unnamed() { + ; CHECK-LABEL: @tests.lifetime.start.end.unnamed( + %a = alloca %0* + call void @llvm.lifetime.start.unnamed(i64 1, %0** %a) + ; CHECK: call void @llvm.lifetime.start.p0p0s_s.0(i64 1, %0** %a) + store %0* null, %0** %a + call void @llvm.lifetime.end.unnamed(i64 1, %0** %a) + ; CHECK: call void @llvm.lifetime.end.p0p0s_s.0(i64 1, %0** %a) + ret void +} + declare void @llvm.prefetch(i8*, i32, i32, i32) define void @test.prefetch(i8* %ptr) { ; CHECK-LABEL: @test.prefetch( @@ -159,7 +205,9 @@ ; This is part of @test.objectsize(), since llvm.objectsize declaration gets ; emitted at the end. ; CHECK: declare i32 @llvm.objectsize.i32.p0i8 - +; CHECK: declare i32 @llvm.objectsize.i32.p0p0s_s.0 ; CHECK: declare void @llvm.lifetime.start.p0i8(i64 immarg, i8* nocapture) ; CHECK: declare void @llvm.lifetime.end.p0i8(i64 immarg, i8* nocapture) +; CHECK: declare void @llvm.lifetime.start.p0p0s_s.0(i64 immarg, %0** nocapture) +; CHECK: declare void @llvm.lifetime.end.p0p0s_s.0(i64 immarg, %0** nocapture)