From 2d32597cfc6ad7ddfabfb140267755c11a33f468 Mon Sep 17 00:00:00 2001 From: Johannes Doerfert Date: Sun, 16 Feb 2020 23:04:25 -0600 Subject: [PATCH] [Attributor][FIX] Do not create new calls edge we cannot handle If we propagate function pointers across function boundaries we can create new call edges. These need to be represented in the CG if we run as a CGSCC pass. In the new pass manager that is currently not handled by the CallGraphUpdater so we need to prevent the situation for now. --- include/llvm/Transforms/IPO/Attributor.h | 6 ++++++ lib/Transforms/IPO/Attributor.cpp | 12 ++++++++++++ 2 files changed, 18 insertions(+) diff --git a/include/llvm/Transforms/IPO/Attributor.h b/include/llvm/Transforms/IPO/Attributor.h index 54a980523d2..2fd5f59efa6 100644 --- a/include/llvm/Transforms/IPO/Attributor.h +++ b/include/llvm/Transforms/IPO/Attributor.h @@ -775,6 +775,12 @@ struct Attributor { /// Return the internal information cache. InformationCache &getInfoCache() { return InfoCache; } + /// Return true if this is a module pass, false otherwise. + bool isModulePass() const { + return !Functions.empty() && + Functions.size() == Functions.front()->getParent()->size(); + } + /// Determine opportunities to derive 'default' attributes in \p F and create /// abstract attribute objects for them. /// diff --git a/lib/Transforms/IPO/Attributor.cpp b/lib/Transforms/IPO/Attributor.cpp index f089ba7ce93..7d6ea0fa2db 100644 --- a/lib/Transforms/IPO/Attributor.cpp +++ b/lib/Transforms/IPO/Attributor.cpp @@ -4577,6 +4577,17 @@ struct AAValueSimplifyArgument final : AAValueSimplifyImpl { if (hasAttr({Attribute::InAlloca, Attribute::StructRet, Attribute::Nest}, /* IgnoreSubsumingPositions */ true)) indicatePessimisticFixpoint(); + + // FIXME: This is a hack to prevent us from propagating function poiner in + // the new pass manager CGSCC pass as it creates call edges the + // CallGraphUpdater cannot handle yet. + Value &V = getAssociatedValue(); + if (V.getType()->isPointerTy() && + V.getType()->getPointerElementType()->isFunctionTy() && + !A.isModulePass() && + A.getInfoCache().getAnalysisResultForFunction( + *getAnchorScope())) + indicatePessimisticFixpoint(); } /// See AbstractAttribute::updateImpl(...). @@ -4700,6 +4711,7 @@ struct AAValueSimplifyFloating : AAValueSimplifyImpl { /// See AbstractAttribute::initialize(...). void initialize(Attributor &A) override { + AAValueSimplifyImpl::initialize(A); Value &V = getAnchorValue(); // TODO: add other stuffs