forked from OSchip/llvm-project
[Attributor] Handle `null` differently in capture and alias logic
Summary: `null` in the default address space (=AS 0) cannot be captured nor can it alias anything. We make this clear now as it can be important for callbacks and other cases later on. In addition, this patch improves the debug output for noalias deduction. Reviewers: sstefan1, uenoku Subscribers: hiraditya, bollu, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D68624 llvm-svn: 374280
This commit is contained in:
parent
33c59abf5c
commit
72adda1740
|
@ -1907,7 +1907,11 @@ struct AANoAliasFloating final : AANoAliasImpl {
|
|||
/// See AbstractAttribute::initialize(...).
|
||||
void initialize(Attributor &A) override {
|
||||
AANoAliasImpl::initialize(A);
|
||||
if (isa<AllocaInst>(getAnchorValue()))
|
||||
Value &Val = getAssociatedValue();
|
||||
if (isa<AllocaInst>(Val))
|
||||
indicateOptimisticFixpoint();
|
||||
if (isa<ConstantPointerNull>(Val) &&
|
||||
Val.getType()->getPointerAddressSpace() == 0)
|
||||
indicateOptimisticFixpoint();
|
||||
}
|
||||
|
||||
|
@ -1971,8 +1975,12 @@ struct AANoAliasCallSiteArgument final : AANoAliasImpl {
|
|||
// check only uses possibly executed before this callsite.
|
||||
|
||||
auto &NoCaptureAA = A.getAAFor<AANoCapture>(*this, IRP);
|
||||
if (!NoCaptureAA.isAssumedNoCaptureMaybeReturned())
|
||||
if (!NoCaptureAA.isAssumedNoCaptureMaybeReturned()) {
|
||||
LLVM_DEBUG(
|
||||
dbgs() << "[Attributor][AANoAliasCSArg] " << V
|
||||
<< " cannot be noalias as it is potentially captured\n");
|
||||
return indicatePessimisticFixpoint();
|
||||
}
|
||||
|
||||
// (iii) Check there is no other pointer argument which could alias with the
|
||||
// value.
|
||||
|
@ -1986,13 +1994,15 @@ struct AANoAliasCallSiteArgument final : AANoAliasImpl {
|
|||
|
||||
if (const Function *F = getAnchorScope()) {
|
||||
if (AAResults *AAR = A.getInfoCache().getAAResultsForFunction(*F)) {
|
||||
bool IsAliasing = AAR->isNoAlias(&getAssociatedValue(), ArgOp);
|
||||
LLVM_DEBUG(dbgs()
|
||||
<< "[Attributor][NoAliasCSArg] Check alias between "
|
||||
"callsite arguments "
|
||||
<< AAR->isNoAlias(&getAssociatedValue(), ArgOp) << " "
|
||||
<< getAssociatedValue() << " " << *ArgOp << "\n");
|
||||
<< getAssociatedValue() << " " << *ArgOp << " => "
|
||||
<< (IsAliasing ? "" : "no-") << "alias \n");
|
||||
|
||||
if (AAR->isNoAlias(&getAssociatedValue(), ArgOp))
|
||||
if (IsAliasing)
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
@ -2881,6 +2891,13 @@ struct AANoCaptureImpl : public AANoCapture {
|
|||
void initialize(Attributor &A) override {
|
||||
AANoCapture::initialize(A);
|
||||
|
||||
// You cannot "capture" null in the default address space.
|
||||
if (isa<ConstantPointerNull>(getAssociatedValue()) &&
|
||||
getAssociatedValue().getType()->getPointerAddressSpace() == 0) {
|
||||
indicateOptimisticFixpoint();
|
||||
return;
|
||||
}
|
||||
|
||||
const IRPosition &IRP = getIRPosition();
|
||||
const Function *F =
|
||||
getArgNo() >= 0 ? IRP.getAssociatedFunction() : IRP.getAnchorScope();
|
||||
|
|
|
@ -24,7 +24,7 @@ define void @t0_caller(i32* %a) {
|
|||
; CHECK-NEXT: [[TMP0:%.*]] = bitcast i32* [[B]] to i8*
|
||||
; CHECK-NEXT: store i32 42, i32* [[B]], align 32
|
||||
; CHECK-NEXT: store i32* [[B]], i32** [[C]], align 64
|
||||
; CHECK-NEXT: call void (i32*, i32*, void (i32*, i32*, ...)*, ...) @t0_callback_broker(i32* null, i32* nonnull align 128 dereferenceable(4) [[PTR]], void (i32*, i32*, ...)* nonnull bitcast (void (i32*, i32*, i32*, i64, i32**)* @t0_callback_callee to void (i32*, i32*, ...)*), i32* [[A:%.*]], i64 99, i32** nonnull align 64 dereferenceable(8) [[C]])
|
||||
; CHECK-NEXT: call void (i32*, i32*, void (i32*, i32*, ...)*, ...) @t0_callback_broker(i32* noalias null, i32* nonnull align 128 dereferenceable(4) [[PTR]], void (i32*, i32*, ...)* nonnull bitcast (void (i32*, i32*, i32*, i64, i32**)* @t0_callback_callee to void (i32*, i32*, ...)*), i32* [[A:%.*]], i64 99, i32** nonnull align 64 dereferenceable(8) [[C]])
|
||||
; CHECK-NEXT: ret void
|
||||
;
|
||||
entry:
|
||||
|
|
|
@ -320,5 +320,14 @@ define i1 @captureDereferenceableOrNullICmp(i32* dereferenceable_or_null(4) %x)
|
|||
ret i1 %2
|
||||
}
|
||||
|
||||
declare void @unknown(i8*)
|
||||
define void @test_callsite() {
|
||||
entry:
|
||||
; We know that 'null' in AS 0 does not alias anything and cannot be captured
|
||||
; CHECK: call void @unknown(i8* noalias nocapture null)
|
||||
call void @unknown(i8* null)
|
||||
ret void
|
||||
}
|
||||
|
||||
declare i8* @llvm.launder.invariant.group.p0i8(i8*)
|
||||
declare i8* @llvm.strip.invariant.group.p0i8(i8*)
|
||||
|
|
Loading…
Reference in New Issue