[llvm] r332788 - Propagate nonnull and dereferenceable throught launder
Piotr Padlewski via llvm-commits
llvm-commits at lists.llvm.org
Fri May 18 16:54:34 PDT 2018
Author: prazek
Date: Fri May 18 16:54:33 2018
New Revision: 332788
URL: http://llvm.org/viewvc/llvm-project?rev=332788&view=rev
Log:
Propagate nonnull and dereferenceable throught launder
Summary:
invariant.group.launder should not stop propagation
of nonnull and dereferenceable, because e.g. we would not be
able to hoist loads speculatively.
Reviewers: rsmith, amharc, kuhar, xbolva00, hfinkel
Subscribers: hiraditya, llvm-commits
Differential Revision: https://reviews.llvm.org/D46972
Added:
llvm/trunk/test/Analysis/ValueTracking/invariant.group.ll
Modified:
llvm/trunk/lib/Analysis/Loads.cpp
llvm/trunk/lib/Analysis/ValueTracking.cpp
llvm/trunk/test/Analysis/ValueTracking/deref-bitcast-of-gep.ll
Modified: llvm/trunk/lib/Analysis/Loads.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/Loads.cpp?rev=332788&r1=332787&r2=332788&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/Loads.cpp (original)
+++ llvm/trunk/lib/Analysis/Loads.cpp Fri May 18 16:54:33 2018
@@ -107,11 +107,14 @@ static bool isDereferenceableAndAlignedP
return isDereferenceableAndAlignedPointer(ASC->getOperand(0), Align, Size,
DL, CtxI, DT, Visited);
- if (auto CS = ImmutableCallSite(V))
+ if (auto CS = ImmutableCallSite(V)) {
if (const Value *RV = CS.getReturnedArgOperand())
return isDereferenceableAndAlignedPointer(RV, Align, Size, DL, CtxI, DT,
Visited);
-
+ if (CS.getIntrinsicID() == Intrinsic::launder_invariant_group)
+ return isDereferenceableAndAlignedPointer(CS->getOperand(0), Align, Size,
+ DL, CtxI, DT, Visited);
+ }
// If we don't know, assume the worst.
return false;
}
Modified: llvm/trunk/lib/Analysis/ValueTracking.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ValueTracking.cpp?rev=332788&r1=332787&r2=332788&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/ValueTracking.cpp (original)
+++ llvm/trunk/lib/Analysis/ValueTracking.cpp Fri May 18 16:54:33 2018
@@ -1953,9 +1953,12 @@ bool isKnownNonZero(const Value *V, unsi
if (LI->getMetadata(LLVMContext::MD_nonnull))
return true;
- if (auto CS = ImmutableCallSite(V))
+ if (auto CS = ImmutableCallSite(V)) {
if (CS.isReturnNonNull())
return true;
+ if (CS.getIntrinsicID() == Intrinsic::ID::launder_invariant_group)
+ return isKnownNonZero(CS->getOperand(0), Depth + 1, Q);
+ }
}
// The remaining tests are all recursive, so bail out if we hit the limit.
Modified: llvm/trunk/test/Analysis/ValueTracking/deref-bitcast-of-gep.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/ValueTracking/deref-bitcast-of-gep.ll?rev=332788&r1=332787&r2=332788&view=diff
==============================================================================
--- llvm/trunk/test/Analysis/ValueTracking/deref-bitcast-of-gep.ll (original)
+++ llvm/trunk/test/Analysis/ValueTracking/deref-bitcast-of-gep.ll Fri May 18 16:54:33 2018
@@ -80,3 +80,28 @@ loop:
leave:
ret void
}
+
+define void @checkLaunder(i8* align 4 dereferenceable(1024) %p) {
+; CHECK-LABEL: @checkLaunder(
+; CHECK: entry:
+; CHECK: %l = call i8* @llvm.launder.invariant.group.p0i8(i8* %p)
+; CHECK: %val = load i8, i8* %l
+; CHECK: br label %loop
+; CHECK: loop:
+; CHECK: call void @use(i32 0)
+; CHECK-NEXT: call void @use8(i8 %val)
+
+entry:
+ %l = call i8* @llvm.launder.invariant.group.p0i8(i8* %p)
+ br label %loop
+
+loop:
+ call void @use(i32 0)
+ %val = load i8, i8* %l, !invariant.load !{}
+ call void @use8(i8 %val)
+ br label %loop
+}
+
+declare i8* @llvm.launder.invariant.group.p0i8(i8*)
+
+declare void @use8(i8)
Added: llvm/trunk/test/Analysis/ValueTracking/invariant.group.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/ValueTracking/invariant.group.ll?rev=332788&view=auto
==============================================================================
--- llvm/trunk/test/Analysis/ValueTracking/invariant.group.ll (added)
+++ llvm/trunk/test/Analysis/ValueTracking/invariant.group.ll Fri May 18 16:54:33 2018
@@ -0,0 +1,19 @@
+; RUN: opt -S -instsimplify -instcombine < %s | FileCheck %s
+
+; CHECK-LABEL: define void @checkNonnull()
+define void @checkNonnull() {
+; CHECK: %p = call i8* @llvm.launder.invariant.group.p0i8(i8* nonnull %0)
+; CHECK: %p2 = call i8* @llvm.launder.invariant.group.p0i8(i8* nonnull %p)
+; CHECK: call void @use(i8* nonnull %p2)
+entry:
+ %0 = alloca i8, align 8
+
+ %p = call i8* @llvm.launder.invariant.group.p0i8(i8* %0)
+ %p2 = call i8* @llvm.launder.invariant.group.p0i8(i8* %p)
+ call void @use(i8* %p2)
+
+ ret void
+}
+
+declare i8* @llvm.launder.invariant.group.p0i8(i8*)
+declare void @use(i8*)
More information about the llvm-commits
mailing list