LazyValueInfo: Actually re-visit partially solved block-values in solveBlockValue()
authorHans Wennborg <hans@hanshq.net>
Tue, 25 Nov 2014 17:23:05 +0000 (17:23 +0000)
committerHans Wennborg <hans@hanshq.net>
Tue, 25 Nov 2014 17:23:05 +0000 (17:23 +0000)
commit45172aceb30c5bdc4820776e7b62861526664d66
tree38f3324cb22a8f9e348fc6caff52c1628a0af5ba
parent4af2f121530f93060f5e7dd86b1c8c961ae68092
LazyValueInfo: Actually re-visit partially solved block-values in solveBlockValue()

If solveBlockValue() needs results from predecessors that are not already
computed, it returns false with the intention of resuming when the dependencies
have been resolved. However, the computation would never be resumed since an
'overdefined' result had been placed in the cache, preventing any further
computation.

The point of placing the 'overdefined' result in the cache seems to have been
to break cycles, but we can check for that when inserting work items in the
BlockValue stack instead. This makes the "stop and resume" mechanism of
solveBlockValue() work as intended, unlocking more analysis.

Using this patch shaves 120 KB off a 64-bit Chromium build on Linux.

I benchmarked compiling bzip2.c at -O2 but couldn't measure any difference in
compile time.

Tests by Jiangning Liu from r215343 / PR21238, Pete Cooper, and me.

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

llvm-svn: 222768
llvm/lib/Analysis/LazyValueInfo.cpp
llvm/test/Transforms/CorrelatedValuePropagation/icmp.ll [new file with mode: 0644]
llvm/test/Transforms/JumpThreading/conservative-lvi.ll [new file with mode: 0644]