[PATCH][CodeGen] Ignoring DBG_VALUEs between terminators?
Matthias Braun
mbraun at apple.com
Mon Jan 19 17:47:48 PST 2015
Just looking at the MachineBasicBlock::terminators() API would imply to me that there is an iterator range that contains all terminators and nothing else. Also a basic block is usually defined as having the terminator at the end of the basic block (I haven't seen a definition with multiple terminators yet though). If there are no good reasons for having DBG_VALUEs between or after terminators I'd disallow them there and enforce the rule with the MachineVerifier...
- Matthias
> On Jan 19, 2015, at 4:53 PM, Ahmed Bougacha <ahmed.bougacha at gmail.com> wrote:
>
> Gentle ping.
>
> -Ahmed
>
> On Mon, Jan 12, 2015 at 2:14 PM, Eric Christopher <echristo at gmail.com> wrote:
>> FWIW this is on my list. A quick glance sounded reasonable, I've not looked
>> at it in detail though.
>
> Thanks Eric!
>
>> Thanks :)
>>
>> -eric
>>
>> On Mon Jan 12 2015 at 12:51:09 PM Ahmed Bougacha <ahmed.bougacha at gmail.com>
>> wrote:
>>>
>>> Ping for opinions!
>>>
>>> Thanks,
>>> - Ahmed
>>>
>>>
>>> On Wed, Jan 7, 2015 at 4:06 AM, Ahmed Bougacha <ahmed.bougacha at gmail.com>
>>> wrote:
>>>> W.r.t. trunk not crashing on the testcase: I bisected it down to
>>>> r221973 making the assertion not fire in some cases where it used to.
>>>> I went ahead and changed the assertion in r225338. Now the attached
>>>> testcase crashes, as it should.
>>>>
>>>> - Ahmed
>>>>
>>>> On Tue, Jan 6, 2015 at 2:49 PM, Ahmed Bougacha
>>>> <ahmed.bougacha at gmail.com> wrote:
>>>>> Hi all,
>>>>>
>>>>> In some situations (see below for testcase explanation), we were
>>>>> crashing in various places, because of a single root problem: a
>>>>> MachineBasicBlock with DBG_VALUEs between the two terminators (a
>>>>> conditional and an unconditional branch).
>>>>>
>>>>> It all goes downhill from there, with at least 4 different places
>>>>> where this breaks code assuming that the terminator before-last is
>>>>> immediately preceding the last one.
>>>>>
>>>>> Now, if the DBG_VALUEs weren't there in the first place, we wouldn't
>>>>> have this problem. However, most code already accepts DBG_VALUEs at
>>>>> the end of a block, after the last terminator. My understanding is,
>>>>> it's not ideal nor well-tested, but we can have them between
>>>>> terminators as well. If not, we should make it explicit.
>>>>>
>>>>> Attached are 5 small patches, the most important being:
>>>>>
>>>>> [CodeGen] Add a MBB::getPreviousTerminator method, ignoring
>>>>> DBG_VALUEs.
>>>>> ...
>>>>> This commit adds a similar method, that returns an iterator to the
>>>>> last terminator preceding the instruction passed as an iterator.
>>>>>
>>>>> The others fix various uses in EarlyIfCvt, MBB, and AArch64, all
>>>>> breaking on my local testcase:
>>>>>
>>>>> [CodeGen] Ignore DBG_VALUEs between terminators when replacing MBB
>>>>> uses.
>>>>> [CodeGen][EarlyIfCvt] Ignore DBG_VALUEs between terminators.
>>>>> [AArch64] Ignore DBG_VALUEs in AnalyzeBranch, by using
>>>>> getPreviousTerminator.
>>>>> [AArch64] Ignore DBG_VALUEs in RemoveBranch, by using
>>>>> getPreviousTerminator.
>>>>>
>>>>> These fix the testcase, but I counted at least 5 other suspicious uses
>>>>> of isTerminator.
>>>>> Also, there are a few innocuous loops that can be replaced by
>>>>> getPreviousTerminator.
>>>>> If the general idea is sound, I'll fix those as well.
>>>>>
>>>>> I'm not sure how to write tests that wouldn't be extremely brittle;
>>>>> ideas welcome. The closest I have is my local testcase (attached,
>>>>> reduced from webkit), breaking some older revisions of clang when
>>>>> targeting AArch64. Because of seemingly unrelated changes (I'm
>>>>> looking into it), the crashes don't happen anymore on trunk, but the
>>>>> problems are still there.
>>>>>
>>>>> Thanks!
>>>>>
>>>>> - Ahmed
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list