diff options
author | Hal Finkel <hfinkel@anl.gov> | 2015-01-05 18:09:06 +0000 |
---|---|---|
committer | Hal Finkel <hfinkel@anl.gov> | 2015-01-05 18:09:06 +0000 |
commit | 4e2c78228aca0a6be132ed1105649a78ec62e14c (patch) | |
tree | 7700db108e05bce959546849432aa515a22d609b /llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp | |
parent | 5e079577e12e4b709639f5a92bcbd3e04c93052b (diff) | |
download | bcm5719-llvm-4e2c78228aca0a6be132ed1105649a78ec62e14c.tar.gz bcm5719-llvm-4e2c78228aca0a6be132ed1105649a78ec62e14c.zip |
[PowerPC] Remove zexts after byte-swapping loads
lhbrx and lwbrx not only load their data with byte swapping, but also clear the
upper 32 bits (at least). As a result, they can be added to the PPCISelDAGToDAG
peephole optimization as frontier instructions for the removal of unnecessary
zero extensions.
llvm-svn: 225189
Diffstat (limited to 'llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp')
-rw-r--r-- | llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp b/llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp index 7d7f557e433..3e787bedd27 100644 --- a/llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp +++ b/llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp @@ -3729,6 +3729,13 @@ static bool PeepholePPC64ZExtGather(SDValue Op32, return true; } + // LHBRX and LWBRX always clear the higher-order bits. + if (Op32.getMachineOpcode() == PPC::LHBRX || + Op32.getMachineOpcode() == PPC::LWBRX) { + ToPromote.insert(Op32.getNode()); + return true; + } + // Next, check for those instructions we can look through. // Assuming the mask does not wrap around, then the higher-order bits are @@ -3916,6 +3923,8 @@ void PPCDAGToDAGISel::PeepholePPC64ZExt() { case PPC::SRW: NewOpcode = PPC::SRW8; break; case PPC::LI: NewOpcode = PPC::LI8; break; case PPC::LIS: NewOpcode = PPC::LIS8; break; + case PPC::LHBRX: NewOpcode = PPC::LHBRX8; break; + case PPC::LWBRX: NewOpcode = PPC::LWBRX8; break; case PPC::RLWIMI: NewOpcode = PPC::RLWIMI8; break; case PPC::OR: NewOpcode = PPC::OR8; break; case PPC::SELECT_I4: NewOpcode = PPC::SELECT_I8; break; |