Commit 1254c70d authored by Tom Stellard's avatar Tom Stellard
Browse files

Merging r316035:

------------------------------------------------------------------------
r316035 | tnorthover | 2017-10-17 14:43:52 -0700 (Tue, 17 Oct 2017) | 6 lines

AArch64: account for possible frame index operand in compares.

If the address of a local is used in a comparison, AArch64 can fold the
address-calculation into the comparison via "adds". Unfortunately, a couple of
places (both hit in this one test) are not ready to deal with that yet and just
assume the first source operand is a register.
------------------------------------------------------------------------

llvm-svn: 319231
parent 041898d2
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -940,6 +940,12 @@ bool AArch64InstrInfo::areMemAccessesTriviallyDisjoint(
bool AArch64InstrInfo::analyzeCompare(const MachineInstr &MI, unsigned &SrcReg,
                                      unsigned &SrcReg2, int &CmpMask,
                                      int &CmpValue) const {
  // The first operand can be a frame index where we'd normally expect a
  // register.
  assert(MI.getNumOperands() >= 2 && "All AArch64 cmps should have 2 operands");
  if (!MI.getOperand(1).isReg())
    return false;

  switch (MI.getOpcode()) {
  default:
    break;
+3 −0
Original line number Diff line number Diff line
@@ -167,6 +167,9 @@ AArch64RedundantCopyElimination::knownRegValInBlock(
    // CMP is an alias for SUBS with a dead destination register.
    case AArch64::SUBSWri:
    case AArch64::SUBSXri: {
      // Sometimes the first operand is a FrameIndex. Bail if tht happens.
      if (!PredI.getOperand(1).isReg())
        return None;
      MCPhysReg SrcReg = PredI.getOperand(1).getReg();

      // Must not be a symbolic immediate.
+19 −0
Original line number Diff line number Diff line
; RUN: llc -mtriple=aarch64 %s -o - | FileCheck %s

; CHECK: test_frameindex_cmp:
; CHECK: cmn sp, #{{[0-9]+}}
define void @test_frameindex_cmp() {
  %stack = alloca i8
  %stack.int = ptrtoint i8* %stack to i64
  %cmp = icmp ne i64 %stack.int, 0
  br i1 %cmp, label %bb1, label %bb2

bb1:
  call void @bar()
  ret void

bb2:
  ret void
}

declare void @bar()