[llvm] r190309 - [ARMv8] Prevent generation of deprecated IT blocks on ARMv8 in Thumb mode.

Jim Grosbach grosbach at apple.com
Tue Dec 10 10:47:23 PST 2013


Hi Hal,

I’m not very familiar with the patch this thread is in response to, so I can’t comment very effectively on that aspect of things directly.

Your comment below about multiple branch instructions at the end of a basic block, however, is correct. The IfConversion pass needs to handle those sorts of cases, including degenerate cases where AnalyzeBranch() fails (by punting and not doing if-conversion of that).

There are helper functions in the ARM backend (and I assume others) which deal with getting the inverted condition code for if-converting if/else constructs. Perhaps there’s something wrong   there either in the general pass or the PPC backend? I seem to recall there was a nasty bug in the ARM version a while back that was painful to track down.

-Jim

On Dec 10, 2013, at 10:24 AM, Hal Finkel <hfinkel at anl.gov> wrote:

> Jim, as you probably saw, Bill recommended you as someone who could help clear up the confusion here. I would appreciate your input; I need to get this cleared up this week (given our current release schedule).
> 
> Thanks in advance,
> Hal
> 
> ----- Original Message -----
>> From: "Hal Finkel" <hfinkel at anl.gov>
>> To: "Artyom Skrobov" <Artyom.Skrobov at arm.com>
>> Cc: llvm-commits at cs.uiuc.edu
>> Sent: Tuesday, December 3, 2013 11:02:29 AM
>> Subject: Re: [llvm] r190309 - [ARMv8] Prevent generation of deprecated IT	blocks	on ARMv8 in Thumb mode.
>> 
>> ----- Original Message -----
>>> From: "Artyom Skrobov" <Artyom.Skrobov at arm.com>
>>> To: "Hal Finkel" <hfinkel at anl.gov>
>>> Cc: "Joey Gouly" <Joey.Gouly at arm.com>, llvm-commits at cs.uiuc.edu,
>>> "Tim Northover" <t.p.northover at gmail.com>, "Evan
>>> Cheng" <evan.cheng at apple.com>
>>> Sent: Monday, December 2, 2013 12:23:27 PM
>>> Subject: RE: [llvm] r190309 - [ARMv8] Prevent generation of
>>> deprecated IT	blocks	on ARMv8 in Thumb mode.
>>> 
>>> Hal, could you please clarify why the PPC backend produces
>>> BasicBlocks with several branch instructions sharing the same BB?
>>> 
>>> The doxygen comments in LLVM imply that a BB is a "single entry,
>>> single exit" sequence, and any branch instruction in a BB must
>>> terminate it.
>> 
>> That seems mostly right, but a block can have multiple terminators
>> (if one is conditional and one is unconditional), and the
>> unconditional branch may be elided if its destination is the next
>> block in layout ordering. Taking a quick look at AnalyzeBranch in
>> the various backends, I believe that this is true also on X86,
>> Hexagon, Sparc, SystemZ, etc. This allows forming a TBB/FBB pair
>> using two consecutive branches.
>> 
>> Is this somehow incompatible with the design of the if conversion
>> pass?
>> 
>> Thanks again,
>> Hal
>> 
>>> 
>>> As you can see in the code examples I posted earlier, this is
>>> indeed
>>> the case with the ARM backend.
>>> 
>>> 
>>> -----Original Message-----
>>> From: Hal Finkel [mailto:hfinkel at anl.gov]
>>> Sent: 28 November 2013 19:50
>>> To: Artyom Skrobov
>>> Cc: Joey Gouly; llvm-commits at cs.uiuc.edu; Tim Northover; Evan Cheng
>>> Subject: Re: [llvm] r190309 - [ARMv8] Prevent generation of
>>> deprecated IT blocks on ARMv8 in Thumb mode.
>>> 
>>> 
>>> Thanks for the explanation! I still don't understand, however,
>>> under
>>> what set of assumptions this is generally valid. In the test case
>>> showing the problem with the PPC backend, we have:
>>> 
>>>        ...
>>> .LBB0_6:                                # %if.end7.i37
>>>        lbz 4, 0(3)
>>>        li 30, 1
>>>        cmplwi 0, 4, 0
>>>        beq 0, .LBB0_15
>>> # BB#7:                                 # %if.then9.i39
>>>        bne 1, .LBB0_14
>>>        b .LBB0_15
>>> .LBB0_8:                                # %if.end
>>>        ...
>>> 
>>>    BB6
>>>   |  \
>>>   |  BB7
>>>   |   / \
>>>   |  /   \
>>>  BB15    BB14
>>> 
>>> being transformed into:
>>> 
>>>        ...
>>> .LBB0_6:                                # %if.end7.i37
>>>        lbz 4, 0(3)
>>>        li 30, 1
>>>        cmplwi 0, 4, 0
>>>        bne 1, .LBB0_13
>>>        b .LBB0_14
>>> .LBB0_7:                                # %if.end
>>>        ...
>>> 
>>> (adjusting for the later block numbering change)
>>>    BB6
>>>   | \
>>>   |  \
>>>  BB15 BB14
>>> 
>>> but it did so without combining the conditions from BB6 and BB7
>>> (but
>>> instead just eliminated one).
>>> 
>>> I don't understand how this could be generally valid. It looks like
>>> what is happening is that, in the (current) broken state,
>>> ScanInstructions returns true on BB7 (because it can predicate the
>>> unconditional branch, and it skips checking the conditional
>>> branch),
>>> and then tries to predicate BB7. BB7 has nothing in it, however,
>>> except for its branches, and so nothing predicates. Now if the "bne
>>> 1, .LBB0_14" in BB7 were actually predicated on the "(eq, cr0)"
>>> value, then this would all make sense (but it is not, and can't be
>>> on this architecture). FWIW, PPCInstrInfo::PredicateInstruction is
>>> never called on the "bne 1, .LBB0_14" instruction (if it were, then
>>> this would assert instead of being a misompile).
>>> 
>>> Artyom, can you explain how the ARM equivalent of this leads to
>>> correct code?
>>> 
>>> Evan, as I believe that you wrote the original code in question --
>>> 6.5 years ago ;) -- perhaps you'll be able to lend some insight
>>> here?
>>> 
>>> Thanks again,
>>> Hal
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>> 
>> --
>> Hal Finkel
>> Assistant Computational Scientist
>> Leadership Computing Facility
>> Argonne National Laboratory
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>> 
> 
> -- 
> Hal Finkel
> Assistant Computational Scientist
> Leadership Computing Facility
> Argonne National Laboratory





More information about the llvm-commits mailing list