diff options
Diffstat (limited to 'llvm/lib/Transforms/IPO/Attributor.cpp')
| -rw-r--r-- | llvm/lib/Transforms/IPO/Attributor.cpp | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/llvm/lib/Transforms/IPO/Attributor.cpp b/llvm/lib/Transforms/IPO/Attributor.cpp index a0677c194f1..6f0a4a85890 100644 --- a/llvm/lib/Transforms/IPO/Attributor.cpp +++ b/llvm/lib/Transforms/IPO/Attributor.cpp @@ -3131,7 +3131,16 @@ struct AANoCaptureImpl : public AANoCapture { /// See AbstractAttribute::initialize(...). void initialize(Attributor &A) override { - AANoCapture::initialize(A); + if (hasAttr(getAttrKind(), /* IgnoreSubsumingPositions */ true)) { + indicateOptimisticFixpoint(); + return; + } + Function *AnchorScope = getAnchorScope(); + if (isFnInterfaceKind() && + (!AnchorScope || !AnchorScope->hasExactDefinition())) { + indicatePessimisticFixpoint(); + return; + } // You cannot "capture" null in the default address space. if (isa<ConstantPointerNull>(getAssociatedValue()) && @@ -3140,13 +3149,11 @@ struct AANoCaptureImpl : public AANoCapture { return; } - const IRPosition &IRP = getIRPosition(); - const Function *F = - getArgNo() >= 0 ? IRP.getAssociatedFunction() : IRP.getAnchorScope(); + const Function *F = getArgNo() >= 0 ? getAssociatedFunction() : AnchorScope; // Check what state the associated function can actually capture. if (F) - determineFunctionCaptureCapabilities(IRP, *F, *this); + determineFunctionCaptureCapabilities(getIRPosition(), *F, *this); else indicatePessimisticFixpoint(); } |

