Skip to content

Commit

Permalink
[PowerPC] Look through copies for compare elimination
Browse files Browse the repository at this point in the history
We currently miss the opportunities for optmizing comparisons in the peephole
optimizer if the input is the result of a COPY since we look for record-form
versions of the producing instruction.

This patch simply lets the optimization peek through copies.

Differential revision: https://reviews.llvm.org/D59633

llvm-svn: 362438
  • Loading branch information
nemanjai committed Jun 3, 2019
1 parent 18ca8a2 commit bad43d8
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 1 deletion.
7 changes: 6 additions & 1 deletion llvm/lib/Target/PowerPC/PPCInstrInfo.cpp
Expand Up @@ -1653,6 +1653,7 @@ bool PPCInstrInfo::optimizeCompareInstr(MachineInstr &CmpInstr, unsigned SrcReg,
if (OpC == PPC::FCMPUS || OpC == PPC::FCMPUD)
return false;

const TargetRegisterInfo *TRI = &getRegisterInfo();
// The record forms set the condition register based on a signed comparison
// with zero (so says the ISA manual). This is not as straightforward as it
// seems, however, because this is always a 64-bit comparison on PPC64, even
Expand All @@ -1666,6 +1667,11 @@ bool PPCInstrInfo::optimizeCompareInstr(MachineInstr &CmpInstr, unsigned SrcReg,
bool is32BitUnsignedCompare = OpC == PPC::CMPLWI || OpC == PPC::CMPLW;
bool is64BitUnsignedCompare = OpC == PPC::CMPLDI || OpC == PPC::CMPLD;

// Look through copies unless that gets us to a physical register.
unsigned ActualSrc = TRI->lookThruCopyLike(SrcReg, MRI);
if (TargetRegisterInfo::isVirtualRegister(ActualSrc))
SrcReg = ActualSrc;

// Get the unique definition of SrcReg.
MachineInstr *MI = MRI->getUniqueVRegDef(SrcReg);
if (!MI) return false;
Expand Down Expand Up @@ -1794,7 +1800,6 @@ bool PPCInstrInfo::optimizeCompareInstr(MachineInstr &CmpInstr, unsigned SrcReg,
}

// Search for Sub.
const TargetRegisterInfo *TRI = &getRegisterInfo();
--I;

// Get ready to iterate backward from CmpInstr.
Expand Down
29 changes: 29 additions & 0 deletions llvm/test/CodeGen/PowerPC/eliminate-compare-of-copy.ll
@@ -0,0 +1,29 @@
; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu \
; RUN: -mcpu=pwr8 -ppc-asm-full-reg-names < %s | FileCheck %s

define dso_local signext i32 @func(i32 zeroext %x, i32 zeroext %y) local_unnamed_addr {
; CHECK-LABEL: func
; CHECK: or. {{r[0-9]+}}, r4, r3
; CHECK-NOT: cmplwi
; CHECK: blr
entry:
%or = or i32 %y, %x
%tobool = icmp eq i32 %or, 0
br i1 %tobool, label %if.else, label %if.then

if.then: ; preds = %entry
%call = tail call signext i32 bitcast (i32 (...)* @f1 to i32 ()*)()
br label %return

if.else: ; preds = %entry
%call1 = tail call signext i32 bitcast (i32 (...)* @f2 to i32 ()*)()
br label %return

return: ; preds = %if.else, %if.then
%retval.0 = phi i32 [ %call, %if.then ], [ %call1, %if.else ]
ret i32 %retval.0
}

declare signext i32 @f1(...) local_unnamed_addr

declare signext i32 @f2(...) local_unnamed_addr

0 comments on commit bad43d8

Please sign in to comment.