[llvm] r316035 - AArch64: account for possible frame index operand in compares.

Tim Northover via llvm-commits llvm-commits at lists.llvm.org
Tue Oct 17 14:43:52 PDT 2017


Author: tnorthover
Date: Tue Oct 17 14:43:52 2017
New Revision: 316035

URL: http://llvm.org/viewvc/llvm-project?rev=316035&view=rev
Log:
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.

Added:
    llvm/trunk/test/CodeGen/AArch64/cmp-frameindex.ll
Modified:
    llvm/trunk/lib/Target/AArch64/AArch64InstrInfo.cpp
    llvm/trunk/lib/Target/AArch64/AArch64RedundantCopyElimination.cpp

Modified: llvm/trunk/lib/Target/AArch64/AArch64InstrInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/AArch64InstrInfo.cpp?rev=316035&r1=316034&r2=316035&view=diff
==============================================================================
--- llvm/trunk/lib/Target/AArch64/AArch64InstrInfo.cpp (original)
+++ llvm/trunk/lib/Target/AArch64/AArch64InstrInfo.cpp Tue Oct 17 14:43:52 2017
@@ -1038,6 +1038,12 @@ bool AArch64InstrInfo::areMemAccessesTri
 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;

Modified: llvm/trunk/lib/Target/AArch64/AArch64RedundantCopyElimination.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/AArch64RedundantCopyElimination.cpp?rev=316035&r1=316034&r2=316035&view=diff
==============================================================================
--- llvm/trunk/lib/Target/AArch64/AArch64RedundantCopyElimination.cpp (original)
+++ llvm/trunk/lib/Target/AArch64/AArch64RedundantCopyElimination.cpp Tue Oct 17 14:43:52 2017
@@ -201,6 +201,9 @@ bool AArch64RedundantCopyElimination::kn
     // 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 false;
       MCPhysReg DstReg = PredI.getOperand(0).getReg();
       MCPhysReg SrcReg = PredI.getOperand(1).getReg();
 

Added: llvm/trunk/test/CodeGen/AArch64/cmp-frameindex.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/cmp-frameindex.ll?rev=316035&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/AArch64/cmp-frameindex.ll (added)
+++ llvm/trunk/test/CodeGen/AArch64/cmp-frameindex.ll Tue Oct 17 14:43:52 2017
@@ -0,0 +1,19 @@
+; 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()




More information about the llvm-commits mailing list