Index: llvm/trunk/lib/IR/AutoUpgrade.cpp =================================================================== --- llvm/trunk/lib/IR/AutoUpgrade.cpp +++ llvm/trunk/lib/IR/AutoUpgrade.cpp @@ -493,6 +493,12 @@ static bool UpgradeIntrinsicFunction1(Function *F, Function *&NewFn) { assert(F && "Illegal to upgrade a non-existent Function."); + // Upgrade intrinsics "clang.arc.use" which doesn't start with "llvm.". + if (F->getName() == "clang.arc.use") { + NewFn = nullptr; + return true; + } + // Quickly eliminate it, if it's not a candidate. StringRef Name = F->getName(); if (Name.size() <= 8 || !Name.startswith("llvm.")) @@ -1571,6 +1577,14 @@ // Get the Function's name. StringRef Name = F->getName(); + // clang.arc.use is an old name for llvm.arc.clang.arc.use. It is dropped + // from upgrader because the optimizer now only recognizes intrinsics for + // ARC runtime calls. + if (Name == "clang.arc.use") { + CI->eraseFromParent(); + return; + } + assert(Name.startswith("llvm.") && "Intrinsic doesn't start with 'llvm.'"); Name = Name.substr(5); Index: llvm/trunk/test/Bitcode/upgrade-clang-arc-use.ll =================================================================== --- llvm/trunk/test/Bitcode/upgrade-clang-arc-use.ll +++ llvm/trunk/test/Bitcode/upgrade-clang-arc-use.ll @@ -0,0 +1,14 @@ +; Test upgrade of clang.arc.use by removing it. +; Bitcode input generated from llvm 6.0 + +; RUN: llvm-dis %s.bc -o - | FileCheck %s + +%0 = type opaque +define void @foo() { + %1 = tail call %0* @foo0() +; CHECK-NOT: clang.arc.use + call void (...) @clang.arc.use(%0* %1) + ret void +} +declare %0* @foo0() +declare void @clang.arc.use(...)