[llvm-dev] ARM: Predicated returns considered analyzable?

James Molloy via llvm-dev llvm-dev at lists.llvm.org
Thu Aug 13 00:46:13 PDT 2015


Hi Krzystof,

I'm not sure what the problem is here. For me, the function name
"MBB::getFirstTerminator"
you quoted implies that there may be more than one terminator. So it not
returning the last terminator doesn't seem surprising at all.

In fact, at this stage a conditional branch (not to a fallthrough block) is
represented as a sequence of "B.COND; B", where both are terminators and
one is predicated. I don't see how conditional returns are any different.

Cheers,

James

On Wed, 12 Aug 2015 at 15:43 Krzysztof Parzyszek via llvm-dev <
llvm-dev at lists.llvm.org> wrote:

> Doh. I missed the list in my first reply...  Here's the replay of the
> conversation:
>
>
>
> ----- Renato:
>
> On 10 August 2015 at 14:05, Krzysztof Parzyszek via llvm-dev
> <llvm-dev at lists.llvm.org> wrote:
>  > -->     %SP<def,tied1> = t2LDMIA_RET %SP<tied0>, pred:8, pred:%CPSR,
>  > %R7<def>, %PC<def>, %SP<imp-use,undef>, %R7<imp-use,undef>,
>  > %PC<imp-use,undef>
>  >
>  > Here the instruction t2LDMIA_RET is a terminator and yet it's
> followed by a
>  > non-terminator tBLXi.  This looks wrong.  Does anyone have any
> comments on
>  > this?
>
> Isn't it because one of the predicates is CPSR, which means it's a
> conditional instruction, so not really a terminator?
>
> This lowers to the expected:
>
>      str lr, [sp, #-4]!
>      cmp r1, #0
>      it ne
>      cmpne r0, #3
>      bhi .LBB0_2 <-- Turned into a conditional jump
>
>      bl bar
>
> .LBB0_2:
>      ldr lr, [sp], #4
>      bx lr
>
> cheers,
> --renato
>
>
>
> ----- Me:
>
> On 8/11/2015 8:32 AM, Renato Golin wrote:
>  > On 10 August 2015 at 14:05, Krzysztof Parzyszek via llvm-dev
>  > <llvm-dev at lists.llvm.org> wrote:
>  >> -->     %SP<def,tied1> = t2LDMIA_RET %SP<tied0>, pred:8, pred:%CPSR,
>  >> %R7<def>, %PC<def>, %SP<imp-use,undef>, %R7<imp-use,undef>,
>  >> %PC<imp-use,undef>
>  >>
>  >> Here the instruction t2LDMIA_RET is a terminator and yet it's
> followed by a
>  >> non-terminator tBLXi.  This looks wrong.  Does anyone have any
> comments on
>  >> this?
>  >
>  > Isn't it because one of the predicates is CPSR, which means it's a
>  > conditional instruction, so not really a terminator?
>
> It is marked as a terminator in the table-gen output (ARMGenInstrInfo.inc):
>
>    { 2399,       5,      1,      4,      355,
>
> 0|(1ULL<<MCID::Pseudo)|(1ULL<<MCID::Return)|(1ULL<<MCID::Barrier)|(1ULL<<MCID::MayLoad)|(1ULL<<MCID::Predicable)|(1ULL<<MCID::Terminator)|(1ULL<<MCID::Variadic)|(1ULL<<MCID::UnmodeledSideEffects)|(1ULL<<MCID::ExtraDefRegAllocReq),
> 0x0ULL, nullptr, nullptr, OperandInfo52, -1 ,nullptr },  // Inst #2399 =
> t2LDMIA_RET
>
>
> The test isTerminator only checks the MCInstrDesc:
>
>    /// Various passes use this to insert code into the bottom of a basic
> block,
>    /// but before control flow occurs.
>    bool isTerminator() const { return Flags & (1 << MCID::Terminator); }
>
>
> -Krzysztof
>
>
>
> ----- Renato:
>
> On 11 August 2015 at 14:54, Krzysztof Parzyszek
> <kparzysz at codeaurora.org> wrote:
>  > The test isTerminator only checks the MCInstrDesc:
>  >
>  >   /// Various passes use this to insert code into the bottom of a basic
>  > block,
>  >   /// but before control flow occurs.
>  >   bool isTerminator() const { return Flags & (1 << MCID::Terminator); }
>
> I'm guessing this only means "can be terminator". With conditional
> terminators there really isn't a way to be certain, and with so many
> instructions being conditional in Thumb, it's probably not a good idea
> to try and model it perfectly.
>
> Are you relying on isTerminator() for something and getting it wrong?
>
> --renato
>
>
>
> ----- Me:
>
> On 8/11/2015 9:10 AM, Renato Golin wrote:
>  > On 11 August 2015 at 14:54, Krzysztof Parzyszek
> <kparzysz at codeaurora.org> wrote:
>  >> The test isTerminator only checks the MCInstrDesc:
>  >>
>  >>    /// Various passes use this to insert code into the bottom of a
> basic
>  >> block,
>  >>    /// but before control flow occurs.
>  >>    bool isTerminator() const { return Flags & (1 << MCID::Terminator);
> }
>  >
>  > I'm guessing this only means "can be terminator". With conditional
>  > terminators there really isn't a way to be certain, and with so many
>  > instructions being conditional in Thumb, it's probably not a good idea
>  > to try and model it perfectly.
>  >
>  > Are you relying on isTerminator() for something and getting it wrong?
>
> This came up in our local build that has some extra code in
> if-conversion to predicate a "diamond", but with both sides returning.
> There was an unrelated problem there, and while I was working on it I
> found out that we can still generate a basic block with a conditional
> return in the middle of it.  This is the late if-conversion, so it may
> be that some rules are relaxed at this point.
> Still, MBB::getFirstTerminator would return the conditional return even
> though it may be followed by other instruction, and if it was to happen
> earlier in the optimization sequence, a lot of things could go wrong. It
> seems like this is not causing more trouble simply because there is no
> earlier optimization that could "exploit" this.
>
> To answer your question---no, at this point nothing is catastrophically
> wrong, but it looks like a problem waiting to happen.
>
> -Krzysztof
>
>
>
> ----- Renato:
>
> On 11 August 2015 at 15:28, Krzysztof Parzyszek
> <kparzysz at codeaurora.org> wrote:
>  > It seems like this is not causing more trouble simply because there is
> no
>  > earlier optimization that could "exploit" this.
>
> I see. This is worrying, but without actual hard data, it's hard to
> know how to fix it.
>
>
>  > To answer your question---no, at this point nothing is catastrophically
>  > wrong, but it looks like a problem waiting to happen.
>
> I'd add a comment to isTerminator() to make sure that people using it
> know that it can back-fire if used with predicated code.
>
> --renato
>
>
>
> ----- Me:
>
> On 8/11/2015 9:36 AM, Renato Golin wrote:
>  >
>  > I'd add a comment to isTerminator() to make sure that people using it
>  > know that it can back-fire if used with predicated code.
>
> Hmm.  I'm not sure if this is a proper description.  A conditional
> branch is "predicated".  If we allow a conditional return to be in the
> middle of a basic block at a certain point, should we also allow (at
> least formally) conditional branches as well?  That would imply that
> there is a point in the optimization sequence after which having
> "exiting" instructions is allowed in the middle of the block.  Since
> having a conditional branch in the middle is not allowed during early
> optimizations, a predicated return should also be disallowed there.
> Can such a point be formally defined (as in "after pass XYX, is it
> allowed to have predicated terminators in the middle of a block")?
>
> -Krzysztof
>
>
>
>
> --
> Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
> hosted by The Linux Foundation
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org         http://llvm.cs.uiuc.edu
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150813/1c3a21a7/attachment.html>


More information about the llvm-dev mailing list