[llvm-commits] [llvm] r106291 - /llvm/trunk/lib/CodeGen/IfConversion.cpp

Rafael Espindola espindola at google.com
Fri Jun 18 10:52:45 PDT 2010


Thanks!

Just in time for a bootstrap test on the beaglebord during the weekend :-)

On 18 June 2010 13:07, Bob Wilson <bob.wilson at apple.com> wrote:
> Author: bwilson
> Date: Fri Jun 18 12:07:23 2010
> New Revision: 106291
>
> URL: http://llvm.org/viewvc/llvm-project?rev=106291&view=rev
> Log:
> Fix PR7372: Conditional branches (at least on ARM) are treated as predicated,
> so when IfConverter::CopyAndPredicateBlock checks to see if it should ignore
> an instruction because it is a branch, it should not check if the branch is
> predicated.
>
> This case (when IgnoreBr is true) is only relevant from IfConvertTriangle,
> where new branches are inserted after the block has been copied and predicated.
> If the original branch is not removed, we end up with multiple conditional
> branches (possibly conflicting) at the end of the block.  Aside from any
> immediate errors resulting from that, this confuses the AnalyzeBranch functions
> so that the branches are not analyzable.  That in turn causes the IfConverter to
> think that the "Simple" pattern can be applied, and things go downhill fast
> because the "Simple" pattern does _not_ apply if the block can fall through.
>
> This is pretty fragile.  If there are other degenerate cases where AnalyzeBranch
> fails, but where the block may still fall through, the IfConverter should not
> perform its "Simple" if-conversion.  But, I don't know how to do that with the
> current AnalyzeBranch interface, so for now, the best thing seems to be to
> avoid creating branches that AnalyzeBranch cannot handle.
>
> Evan, please review!
>
> Modified:
>    llvm/trunk/lib/CodeGen/IfConversion.cpp
>
> Modified: llvm/trunk/lib/CodeGen/IfConversion.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/IfConversion.cpp?rev=106291&r1=106290&r2=106291&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/IfConversion.cpp (original)
> +++ llvm/trunk/lib/CodeGen/IfConversion.cpp Fri Jun 18 12:07:23 2010
> @@ -1298,16 +1298,15 @@
>   for (MachineBasicBlock::iterator I = FromBBI.BB->begin(),
>          E = FromBBI.BB->end(); I != E; ++I) {
>     const TargetInstrDesc &TID = I->getDesc();
> -    bool isPredicated = TII->isPredicated(I);
>     // Do not copy the end of the block branches.
> -    if (IgnoreBr && !isPredicated && TID.isBranch())
> +    if (IgnoreBr && TID.isBranch())
>       break;
>
>     MachineInstr *MI = MF.CloneMachineInstr(I);
>     ToBBI.BB->insert(ToBBI.BB->end(), MI);
>     ToBBI.NonPredSize++;
>
> -    if (!isPredicated && !MI->isDebugValue()) {
> +    if (!TII->isPredicated(I) && !MI->isDebugValue()) {
>       if (!TII->PredicateInstruction(MI, Cond)) {
>  #ifndef NDEBUG
>         dbgs() << "Unable to predicate " << *I << "!\n";
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>



-- 
Rafael Ávila de Espíndola




More information about the llvm-commits mailing list