Otherwise when we visit all libcalls in
updateCGAndAnalysisManagerForPass(), the old libcall is dead and doesn't
have a node.
We treat libcalls conservatively in LazyCallGraph because any function
may introduce calls to them out of thin air.
It is weird to change the signature of a libcall since introducing calls
to the libcall with a different signature may break, but other passes
like deadargelim already do it, so let's preserve this behavior for now.
Fixes an issue found in D128830.
Reviewed By: psamolysov
Differential Revision: https://reviews.llvm.org/D132764
// Update various call graph maps.
G->NodeMap.erase(&OldF);
G->NodeMap[&NewF] = &N;
+
+ // Update lib functions.
+ if (G->isLibFunction(OldF)) {
+ G->LibFunctions.remove(&OldF);
+ G->LibFunctions.insert(&NewF);
+ }
}
void LazyCallGraph::insertEdge(Node &SourceN, Node &TargetN, Edge::Kind EK) {
--- /dev/null
+; RUN: opt -passes=inline,argpromotion < %s -S | FileCheck %s
+
+; Make sure we update the list of libcalls when we replace a libcall.
+
+; CHECK: define {{.*}}@a
+
+define void @a() {
+entry:
+ %call = call float @strtof(ptr noundef null, ptr noundef null)
+ ret void
+}
+
+define internal float @strtof(ptr noundef %0, ptr noundef %1) nounwind {
+entry:
+ ret float 0.0
+}
+