OSDN Git Service

PPC: Prep for if conversion of bctr[l]
authorHal Finkel <hfinkel@anl.gov>
Wed, 10 Apr 2013 06:42:34 +0000 (06:42 +0000)
committerHal Finkel <hfinkel@anl.gov>
Wed, 10 Apr 2013 06:42:34 +0000 (06:42 +0000)
commit90dd7fd167b6d09e4a7f37e35dcbfdc492546a79
tree21572d743188d6c232746d0e7d75d7802b43b73c
parenta2561a0153237291980722383f409a6499b12efc
PPC: Prep for if conversion of bctr[l]

This adds in-principle support for if-converting the bctr[l] instructions.
These instructions are used for indirect branching. It seems, however, that the
current if converter will never actually predicate these. To do so, it would
need the ability to hoist a few setup insts. out of the conditionally-executed
block. For example, code like this:
  void foo(int a, int (*bar)()) { if (a != 0) bar(); }
becomes:
        ...
        beq 0, .LBB0_2
        std 2, 40(1)
        mr 12, 4
        ld 3, 0(4)
        ld 11, 16(4)
        ld 2, 8(4)
        mtctr 3
        bctrl
        ld 2, 40(1)
.LBB0_2:
        ...
and it would be safe to do all of this unconditionally with a predicated
beqctrl instruction.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@179156 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Target/PowerPC/PPCInstr64Bit.td
lib/Target/PowerPC/PPCInstrInfo.cpp
lib/Target/PowerPC/PPCInstrInfo.td