Eliminate redundant CR moves on PPC32.
authorHal Finkel <hfinkel@anl.gov>
Tue, 28 Aug 2012 02:10:27 +0000 (02:10 +0000)
committerHal Finkel <hfinkel@anl.gov>
Tue, 28 Aug 2012 02:10:27 +0000 (02:10 +0000)
commit82b3821208286aeb43f603fdac98832bd662dad9
treeabb5ac4eea9e0f1504fb1f2f3ad847261a5179de
parent97d047dec71cb37f31aac102cdc87b3dec0b1c46
Eliminate redundant CR moves on PPC32.

The 32-bit ABI requires CR bit 6 to be set if the call has fp arguments and
unset if it doesn't. The solution up to now was to insert a MachineNode to
set/unset the CR bit, which produces a CR vreg. This vreg was then copied
into CR bit 6. When the register allocator saw a bunch of these in the same
function, it allocated the set/unset CR bit in some random CR register (1
extra instruction) and then emitted CR moves before every vararg function
call, rather than just setting and unsetting CR bit 6 directly before every
vararg function call. This patch instead inserts a PPCcrset/PPCcrunset
instruction which are then matched by a dedicated instruction pattern.

Patch by Tobias von Koch.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@162725 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Target/PowerPC/PPCISelLowering.cpp
lib/Target/PowerPC/PPCISelLowering.h
lib/Target/PowerPC/PPCInstrInfo.td
test/CodeGen/PowerPC/cr1eq-no-extra-moves.ll [new file with mode: 0644]