Skip to content

Commit

Permalink
[Attributor][FIX] NullPointerIsDefined needs the pointer AS (AANonNull)
Browse files Browse the repository at this point in the history
Also includes a shortcut via AADereferenceable if possible.

llvm-svn: 374737
  • Loading branch information
Johannes Doerfert committed Oct 13, 2019
1 parent 8ee410c commit d82385b
Show file tree
Hide file tree
Showing 5 changed files with 28 additions and 6 deletions.
21 changes: 18 additions & 3 deletions llvm/lib/Transforms/IPO/Attributor.cpp
Expand Up @@ -1588,11 +1588,16 @@ static int64_t getKnownNonNullAndDerefBytesForUse(
}

struct AANonNullImpl : AANonNull {
AANonNullImpl(const IRPosition &IRP) : AANonNull(IRP) {}
AANonNullImpl(const IRPosition &IRP)
: AANonNull(IRP),
NullIsDefined(NullPointerIsDefined(
getAnchorScope(),
getAssociatedValue().getType()->getPointerAddressSpace())) {}

/// See AbstractAttribute::initialize(...).
void initialize(Attributor &A) override {
if (hasAttr({Attribute::NonNull, Attribute::Dereferenceable}))
if (!NullIsDefined &&
hasAttr({Attribute::NonNull, Attribute::Dereferenceable}))
indicateOptimisticFixpoint();
else
AANonNull::initialize(A);
Expand All @@ -1612,6 +1617,10 @@ struct AANonNullImpl : AANonNull {
const std::string getAsStr() const override {
return getAssumed() ? "nonnull" : "may-null";
}

/// Flag to determine if the underlying value can be null and still allow
/// valid accesses.
const bool NullIsDefined;
};

/// NonNull attribute for a floating value.
Expand Down Expand Up @@ -1644,14 +1653,20 @@ struct AANonNullFloating
if (isKnownNonNull())
return Change;

if (!NullIsDefined) {
const auto &DerefAA = A.getAAFor<AADereferenceable>(*this, getIRPosition());
if (DerefAA.getAssumedDereferenceableBytes())
return Change;
}

const DataLayout &DL = A.getDataLayout();

auto VisitValueCB = [&](Value &V, AAAlign::StateType &T,
bool Stripped) -> bool {
const auto &AA = A.getAAFor<AANonNull>(*this, IRPosition::value(V));
if (!Stripped && this == &AA) {
if (!isKnownNonZero(&V, DL, 0, /* TODO: AC */ nullptr,
/* TODO: CtxI */ nullptr,
/* CtxI */ getCtxI(),
/* TODO: DT */ nullptr))
T.indicatePessimisticFixpoint();
} else {
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/Transforms/FunctionAttrs/noalias_returned.ll
@@ -1,4 +1,4 @@
; RUN: opt -S -passes=attributor -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=2 < %s | FileCheck %s
; RUN: opt -S -passes=attributor -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=3 < %s | FileCheck %s

; TEST 1 - negative.

Expand Down
7 changes: 7 additions & 0 deletions llvm/test/Transforms/FunctionAttrs/nonnull.ll
Expand Up @@ -523,6 +523,13 @@ define i32 addrspace(3)* @gep2(i32 addrspace(3)* %p) {
ret i32 addrspace(3)* %q
}

; FNATTR: define i32 addrspace(3)* @as(i32 addrspace(3)* readnone returned dereferenceable(4) %p)
; FIXME: We should propagate dereferenceable here but *not* nonnull
; ATTRIBUTOR: define dereferenceable_or_null(4) i32 addrspace(3)* @as(i32 addrspace(3)* readnone returned dereferenceable(4) dereferenceable_or_null(4) %p)
define i32 addrspace(3)* @as(i32 addrspace(3)* dereferenceable(4) %p) {
ret i32 addrspace(3)* %p
}

; BOTH: define internal nonnull i32* @g2()
define internal i32* @g2() {
ret i32* inttoptr (i64 4 to i32*)
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/Transforms/FunctionAttrs/nounwind.ll
@@ -1,5 +1,5 @@
; RUN: opt < %s -functionattrs -S | FileCheck %s
; RUN: opt < %s -attributor -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=2 -S | FileCheck %s --check-prefix=ATTRIBUTOR
; RUN: opt < %s -attributor -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=3 -S | FileCheck %s --check-prefix=ATTRIBUTOR

; TEST 1
; CHECK: Function Attrs: norecurse nounwind readnone
Expand Down
@@ -1,4 +1,4 @@
; RUN: opt -functionattrs -enable-nonnull-arg-prop -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=6 -S < %s | FileCheck %s
; RUN: opt -functionattrs -enable-nonnull-arg-prop -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=7 -S < %s | FileCheck %s
;
; This is an evolved example to stress test SCC parameter attribute propagation.
; The SCC in this test is made up of the following six function, three of which
Expand Down

0 comments on commit d82385b

Please sign in to comment.