[llvm] r272703 - [ValueTracking] Calls to @llvm.assume always return
Sanjoy Das via llvm-commits
llvm-commits at lists.llvm.org
Tue Jun 14 13:23:16 PDT 2016
Author: sanjoy
Date: Tue Jun 14 15:23:16 2016
New Revision: 272703
URL: http://llvm.org/viewvc/llvm-project?rev=272703&view=rev
Log:
[ValueTracking] Calls to @llvm.assume always return
This change teaches llvm::isGuaranteedToTransferExecutionToSuccessor
that calls to @llvm.assume always terminate. Most other relevant
intrinsics should be covered by the "CS.onlyReadsMemory() ||
CS.onlyAccessesArgMemory()" bit but we were missing @llvm.assumes
because we state that it clobbers memory.
Added an LICM test case, but this change is not specific to LICM.
Modified:
llvm/trunk/lib/Analysis/ValueTracking.cpp
llvm/trunk/test/Transforms/LICM/assume.ll
Modified: llvm/trunk/lib/Analysis/ValueTracking.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ValueTracking.cpp?rev=272703&r1=272702&r2=272703&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/ValueTracking.cpp (original)
+++ llvm/trunk/lib/Analysis/ValueTracking.cpp Tue Jun 14 15:23:16 2016
@@ -3478,7 +3478,8 @@ bool llvm::isGuaranteedToTransferExecuti
// but it's consistent with other passes. See http://llvm.org/PR965 .
// FIXME: This isn't aggressive enough; a call which only writes to a
// global is guaranteed to return.
- return CS.onlyReadsMemory() || CS.onlyAccessesArgMemory();
+ return CS.onlyReadsMemory() || CS.onlyAccessesArgMemory() ||
+ match(I, m_Intrinsic<Intrinsic::assume>());
}
// Other instructions return normally.
Modified: llvm/trunk/test/Transforms/LICM/assume.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LICM/assume.ll?rev=272703&r1=272702&r2=272703&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/LICM/assume.ll (original)
+++ llvm/trunk/test/Transforms/LICM/assume.ll Tue Jun 14 15:23:16 2016
@@ -1,6 +1,7 @@
; RUN: opt -licm -basicaa < %s -S | FileCheck %s
-define void @f(i1 %p) nounwind ssp {
+define void @f_0(i1 %p) nounwind ssp {
+; CHECK-LABEL: @f_0(
entry:
br label %for.body
@@ -31,4 +32,20 @@ for.end104:
ret void
}
+define void @f_1(i1 %cond, i32* %ptr) {
+; CHECK-LABEL: @f_1(
+; CHECK: %val = load i32, i32* %ptr
+; CHECK-NEXT: br label %loop
+
+entry:
+ br label %loop
+
+loop:
+ %x = phi i32 [ 0, %entry ], [ %x.inc, %loop ]
+ call void @llvm.assume(i1 %cond)
+ %val = load i32, i32* %ptr
+ %x.inc = add i32 %x, %val
+ br label %loop
+}
+
declare void @llvm.assume(i1)
More information about the llvm-commits
mailing list