[LazyValueInfo] Look through Phi nodes when trying to prove a predicate
authorPhilip Reames <listmail@philipreames.com>
Mon, 31 Aug 2015 18:31:48 +0000 (18:31 +0000)
committerPhilip Reames <listmail@philipreames.com>
Mon, 31 Aug 2015 18:31:48 +0000 (18:31 +0000)
commit9c89f4441e6caad0ba5d43486337bb9712500831
tree05748e7436b8d78638d7ebd4745aebc8c7c647da
parent21b967e3e18a60f119d13c4b8e99b993cef48cbe
[LazyValueInfo] Look through Phi nodes when trying to prove a predicate

If asked to prove a predicate about a value produced by a PHI node, LazyValueInfo was unable to do so even if the predicate was known to be true for each input to the PHI. This prevented JumpThreading from eliminating a provably redundant branch.

The problematic test case looks something like this:
ListNode *p = ...;
while (p != null) {
  if (!p) return;
  x = g->x; // unrelated
  p = p->next
}

The null check at the top of the loop is redundant since the value of 'p' is null checked on entry to the loop and before executing the backedge. This resulted in us a) executing an extra null check per iteration and b) not being able to LICM unrelated loads after the check since we couldn't prove they would execute or that their dereferenceability wasn't effected by the null check on the first iteration.

Differential Revision: http://reviews.llvm.org/D12383

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@246465 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Analysis/LazyValueInfo.cpp
test/Transforms/JumpThreading/phi-known.ll [new file with mode: 0644]