[llvm] r215343 - In LVI(Lazy Value Info), originally value on a BB can only be caculated once,
Pete Cooper
peter_cooper at apple.com
Thu Nov 20 16:39:11 PST 2014
> On Nov 20, 2014, at 4:27 PM, Hans Wennborg <hans at chromium.org> wrote:
>
> On Thu, Nov 20, 2014 at 11:27 AM, Pete Cooper <peter_cooper at apple.com> wrote:
>> I came across this independently a few days ago. My example was similar. I
>> had
>>
>> if (x == 0) {
>> if (…) { … } else { … }
>> ++x
>> }
>
> I'm still not very familiar with this analysis and its interaction
> with jump threading. Could you turn your example into a compilable
> function that I can experiment with?
I was looking at correlated-value-propagation actually, but I guess this would apply to jump threading too.
I’ll get you a testcase shortly, and a real patch.
>
>
>> The problem here is that as we walk from ++x up, we visit the BBs on the
>> inner if statement. Their predecessors haven’t been processed yet so we
>> return out from solveBlockValueNonLocal which leaves them in the
>> ‘overdefined’ state. We eventually get to ‘x == 0’ and start the walk back
>> down the CFG. But on the walk back down we do the following check and
>> immediately bail. So intermediate BBs get set to overdefined because of
>> unvisited predecessors and never leave that state.
>>
>> if (!BBLV.isUndefined()) {
>> DEBUG(dbgs() << " reuse BB '" << BB->getName() << "' val=" << BBLV
>> <<'\n');
>>
>>
>>
>> // Since we're reusing a cached value here, we don't need to update the
>> // OverDefinedCahce. The cache will have been properly updated
>> // whenever the cached value was inserted.
>> ODCacheUpdater.markResult(false);
>> return true;
>> }
>>
>> So, here’s the patch I have to fix the problem. I believe it has no
>> algorithmic complexity issues as we do the same walk up the CFG from before,
>> but as we walk back down we will retry calling solveBlockValueNonLocal now
>> that all predecessors have a state. I don’t have an IR test case this
>> minute, but I can get one tonight if needed.
>>
>> @@ -672,8 +672,16 @@ bool
>> LazyValueInfoCache::solveBlockValueNonLocal(LVILatticeVal &BBLV,
>> return true;
>> }
>> }
>> - if (EdgesMissing)
>> + if (EdgesMissing) {
>> + // If we haven't yet processed all the predecessors, then put this
>> + // value back to undefined so that we'll revisit it again. Otherwise
>> it
>> + // will be 'overdefined' once we return from here and we'll think that
>> + // this is its final state, while in fact we don't know the state of
>> this
>> + // value in this BB yet.
>> + LVILatticeVal Result;
>> + BBLV = Result;
>> return false;
>> + }
>
> I applied your patch, but it seems to be causing miscompiles, as one
> of the programs got into an infinite loop and consumed all my memory.
Damn. When I thought about the algorithm I convinced myself that it would terminate as you’ll always eventually chase the BBs up to a loop preheader or the function entry BB. Perhaps I got that wrong.
Pete
>
> - Hans
More information about the llvm-commits
mailing list