diff options
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Analysis/ValueTracking.cpp | 3 | ||||
| -rw-r--r-- | llvm/test/Transforms/LICM/assume.ll | 19 | 
2 files changed, 20 insertions, 2 deletions
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp index 7e09ec74bef..7109ff84b8e 100644 --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/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<Intrinsic::assume>());    }    // Other instructions return normally. diff --git a/llvm/test/Transforms/LICM/assume.ll b/llvm/test/Transforms/LICM/assume.ll index 9abf5578287..e426350ce73 100644 --- a/llvm/test/Transforms/LICM/assume.ll +++ b/llvm/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)  | 

