From: Artur Pilipenko Date: Fri, 21 Oct 2016 15:02:21 +0000 (+0000) Subject: [LVI] Fix a bug with a guard being the very first instruction in a BB not taken into... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d193fb545735b24e280bfa1046cb904e0809bcf0;p=llvm [LVI] Fix a bug with a guard being the very first instruction in a BB not taken into account While looking for guards use reverse iterator and scan up to rend() not to begin() git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@284827 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Analysis/LazyValueInfo.cpp b/lib/Analysis/LazyValueInfo.cpp index 880adacdc5a..c3329d19115 100644 --- a/lib/Analysis/LazyValueInfo.cpp +++ b/lib/Analysis/LazyValueInfo.cpp @@ -978,12 +978,11 @@ void LazyValueInfoImpl::intersectAssumeOrGuardBlockValueConstantRange( if (!GuardDecl || GuardDecl->use_empty()) return; - for (BasicBlock::iterator I = BBI->getIterator(), - E = BBI->getParent()->begin(); I != E; I--) { + for (Instruction &I : make_range(BBI->getIterator().getReverse(), + BBI->getParent()->rend())) { Value *Cond = nullptr; - if (!match(&*I, m_Intrinsic(m_Value(Cond)))) - continue; - BBLV = intersect(BBLV, getValueFromCondition(Val, Cond)); + if (match(&I, m_Intrinsic(m_Value(Cond)))) + BBLV = intersect(BBLV, getValueFromCondition(Val, Cond)); } } diff --git a/test/Transforms/CorrelatedValuePropagation/guards.ll b/test/Transforms/CorrelatedValuePropagation/guards.ll index 401cb2549dd..d62e512c522 100644 --- a/test/Transforms/CorrelatedValuePropagation/guards.ll +++ b/test/Transforms/CorrelatedValuePropagation/guards.ll @@ -93,3 +93,20 @@ continue: %result = or i1 %dead, %alive ret i1 %result } + +; Check that we handle the case when the guard is the very first instruction in +; a basic block. +define i1 @test6(i32 %a) { +; CHECK-LABEL: @test6( +; CHECK: %alive = icmp eq i32 %a, 8 +; CHECK-NEXT: %result = or i1 false, %alive + %cmp = icmp ult i32 %a, 16 + br label %continue + +continue: + call void(i1,...) @llvm.experimental.guard(i1 %cmp) [ "deopt"() ] + %dead = icmp eq i32 %a, 16 + %alive = icmp eq i32 %a, 8 + %result = or i1 %dead, %alive + ret i1 %result +}