[LLVMdev] Assert in BlockFrequency pass

Ivan Baev ibaev at codeaurora.org
Fri Jun 5 18:08:44 PDT 2015


>
>> On 2015-Jun-04, at 12:45, Duncan P. N. Exon Smith <dexonsmith at apple.com>
>> wrote:
>>
>>> On 2015-Jun-04, at 12:28, Ivan Baev <ibaev at codeaurora.org> wrote:
>>>
>>> Hi, we got the following assert:
>>>
>>> assert(!Working[0].isLoopHeader() && "entry block is a loop header");
>>>
>>> [in BlockFrequencyInfoImpl<BT>::tryToComputeMassInFunction(),
>>> BlockFrequencyInfoImpl.h] on a Hexagon target - the entry block is a
>>> loop
>>> header. Has someone seen this assert on other targets?
>>>
>>> What would be a preferable way to fix it:
>>> - extend BlockFrequency pass to handle this case, e.g. by inserting a
>>> dummy entry block, or
>>> - make this BlockFrequncy's assumption/requirement more clearly
>>> articulated and avoid creating this situation in a preceding pass (in
>>> the
>>> particular case, a machine-level loop rotation)?
>>
>> This is unlikely to be a bug in BFI.  BFI assumes that LoopInfo is
>> correct.  This has come up before when a pass promised (but failed) to
>> preserve LoopInfo.  I think it's well enough documented -- in that BFI
>> "requires" LoopInfo -- but if you have an idea of how to make it more
>> clear that BFI requires LoopInfo go ahead :).
>>
>> Last time this came up it was suggested that we should have a better
>> way of testing/verifying that analyses have been correctly preserved,
>> and I think that would be the best way of improving the diagnostic
>> (since it would catch the problem right after machine-level loop
>> rotation fails to preserve it).
>>
>> (Of course, it's possible there *is* a bug in BFI... let me know what
>> you find.)
>>
>
> Reading the assertion, maybe there is a bug.  In LLVM IR, it's illegal
> to have a backedge to the entry block.  When I rewrote BFI I assumed
> the same was true of Machine IR.  Was I wrong?  Is it legal to have a
> backedge to the entry block?  (Or, as I assumed in my previous mail,
> did machine-level loop rotation fail to preserve LoopInfo?)
>
> If it *is* legal to have a backedge to the entry block, then we should
> update BFI to expect it.


For LLVM IR it is not legal to have a backedge to the entry block - this
is from Verifier.cpp
    // Check the entry node
    const BasicBlock *Entry = &F.getEntryBlock();
    Assert1(pred_empty(Entry),
            "Entry block to function must not have predecessors!", Entry);

Not sure about such requirement for Machine IR.

For the test case with the assert, MBB below is the entry BB.
[Loop rotate transformation in HexagonCFGOptimizer.cpp]
// We are looking for the commonly occuring patterns.
// MBB ---------
//  |           |
// (Optional    |
//  Preheader)  |
//  |           |
// MBB1 <---    |
//  |       |   |
// ...(Loop)|   |
//  |       |   |
// MBB2 ----    |
//  |           |
// MBBExit <----
//
// This pattern will be transformed into the following loop.
// i.e. the predecessor will be included in the loop.
//   ,<---------
//  |           |
// MBB ->------- -
//  |           | |
// (Optional    | |
//  Preheader)  | |
//  |           | |
// MBB1         | |
//  |           | |
// ...(Loop)    | |
//  |           | |
// MBB2 ->------  |
//  |             |
// MBBExit <------

HexagonCFGOptimizer pass does not promise to preserve LoopInfo.

Ivan





More information about the llvm-dev mailing list