From 84225d2d9e7340e7b37073659d8741c1574bcab0 Mon Sep 17 00:00:00 2001 From: Sanjoy Das Date: Tue, 14 Jun 2016 20:23:16 +0000 Subject: [PATCH] [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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@272703 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/ValueTracking.cpp | 3 ++- test/Transforms/LICM/assume.ll | 19 ++++++++++++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/lib/Analysis/ValueTracking.cpp b/lib/Analysis/ValueTracking.cpp index 7e09ec74bef..7109ff84b8e 100644 --- a/lib/Analysis/ValueTracking.cpp +++ b/lib/Analysis/ValueTracking.cpp @@ -3478,7 +3478,8 @@ bool llvm::isGuaranteedToTransferExecutionToSuccessor(const Instruction *I) { // 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()); } // Other instructions return normally. diff --git a/test/Transforms/LICM/assume.ll b/test/Transforms/LICM/assume.ll index 9abf5578287..e426350ce73 100644 --- a/test/Transforms/LICM/assume.ll +++ b/test/Transforms/LICM/assume.ll @@ -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) -- 2.50.1