[LLVMdev] Assert in BlockFrequency pass
Duncan P. N. Exon Smith
dexonsmith at apple.com
Thu Jun 11 09:44:18 PDT 2015
> On 2015-Jun-05, at 19:31, Duncan P. N. Exon Smith <dexonsmith at apple.com> wrote:
>
>
>> On 2015 Jun 5, at 18:08, Ivan Baev <ibaev at codeaurora.org> wrote:
>>
>>>
>>>> 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.
>
> I can't find any mention of my assumption in the machine IR
> documentation; it looks like I was just wrong :/.
>
> This shouldn't be hard to fix -- I just need to massage some logic
> here and there -- but I'll need your help coming up with a testcase.
> Please file a PR with the testcase attached and CC me, and I'll fix it
> as soon as I can!
Ping? (Did I miss the PR?)
>
>>
>> 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
>>
>>
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
More information about the llvm-dev
mailing list