[llvm] 082fa56 - [ARM] Fix MOVCC peephole to not use an incorrect register class

John Brawn via llvm-commits llvm-commits at lists.llvm.org
Fri Oct 15 02:55:46 PDT 2021


Author: John Brawn
Date: 2021-10-15T10:54:26+01:00
New Revision: 082fa56819048770e76fef8bca4ea5de3c3532ba

URL: https://github.com/llvm/llvm-project/commit/082fa56819048770e76fef8bca4ea5de3c3532ba
DIFF: https://github.com/llvm/llvm-project/commit/082fa56819048770e76fef8bca4ea5de3c3532ba.diff

LOG: [ARM] Fix MOVCC peephole to not use an incorrect register class

The MOVCC peephole eliminates a MOVCC by making one of its inputs a
conditional instruction, but when doing this it should be using both
inputs of the MOVCC to decide on the register class to use as
otherwise we can get an error when using -verify-machineinstrs.

Differential Revision: https://reviews.llvm.org/D111714

Added: 
    llvm/test/CodeGen/ARM/movc-peephole.mir

Modified: 
    llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp b/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp
index b2363ee2ef57e..f19cf84253f00 100644
--- a/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp
+++ b/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp
@@ -2371,9 +2371,13 @@ ARMBaseInstrInfo::optimizeSelect(MachineInstr &MI,
 
   // Find new register class to use.
   MachineOperand FalseReg = MI.getOperand(Invert ? 2 : 1);
+  MachineOperand TrueReg = MI.getOperand(Invert ? 1 : 2);
   Register DestReg = MI.getOperand(0).getReg();
-  const TargetRegisterClass *PreviousClass = MRI.getRegClass(FalseReg.getReg());
-  if (!MRI.constrainRegClass(DestReg, PreviousClass))
+  const TargetRegisterClass *FalseClass = MRI.getRegClass(FalseReg.getReg());
+  const TargetRegisterClass *TrueClass = MRI.getRegClass(TrueReg.getReg());
+  if (!MRI.constrainRegClass(DestReg, FalseClass))
+    return nullptr;
+  if (!MRI.constrainRegClass(DestReg, TrueClass))
     return nullptr;
 
   // Create a new predicated version of DefMI.

diff  --git a/llvm/test/CodeGen/ARM/movc-peephole.mir b/llvm/test/CodeGen/ARM/movc-peephole.mir
new file mode 100644
index 0000000000000..6de013b260fc6
--- /dev/null
+++ b/llvm/test/CodeGen/ARM/movc-peephole.mir
@@ -0,0 +1,41 @@
+# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
+# RUN: llc -run-pass=peephole-opt %s -o - -verify-machineinstrs | FileCheck %s
+
+# Make sure the MOVCC to conditional instruction peephole doesn't change the
+# register class to one that's invalid.
+
+--- |
+  target triple = "armv7-unknown-unknown"
+  define i32 @test(i32 %x, i32 %y) {
+    ret i32 undef
+  }
+...
+---
+name: test
+tracksRegLiveness: true
+body: |
+  bb.0 (%ir-block.0):
+    liveins: $r0, $r1
+    ; CHECK-LABEL: name: test
+    ; CHECK: liveins: $r0, $r1
+    ; CHECK: [[COPY:%[0-9]+]]:gpr = COPY $r0
+    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr = COPY $r1
+    ; CHECK-NEXT: [[MOVsi:%[0-9]+]]:gpr = MOVsi [[COPY1]], 27, 14 /* CC::al */, $noreg, $noreg
+    ; CHECK-NEXT: [[ORRrsi:%[0-9]+]]:gpr = ORRrsi [[MOVsi]], [[COPY1]], 234, 14 /* CC::al */, $noreg, $noreg
+    ; CHECK-NEXT: [[MOVsi1:%[0-9]+]]:gpr = MOVsi [[COPY1]], 155, 14 /* CC::al */, $noreg, $noreg
+    ; CHECK-NEXT: [[ORRrsi1:%[0-9]+]]:gprnopc = ORRrsi killed [[MOVsi1]], killed [[MOVsi]], 106, 14 /* CC::al */, $noreg, $noreg
+    ; CHECK-NEXT: TSTri [[COPY1]], 1, 14 /* CC::al */, $noreg, implicit-def $cpsr
+    ; CHECK-NEXT: [[UXTH:%[0-9]+]]:gprnopc = UXTH killed [[ORRrsi1]], 0, 0 /* CC::eq */, $cpsr, implicit [[ORRrsi]](tied-def 0)
+    ; CHECK-NEXT: $r0 = COPY killed [[UXTH]]
+    ; CHECK-NEXT: BX_RET 14 /* CC::al */, $noreg, implicit $r0
+    %0:gpr = COPY $r0
+    %1:gpr = COPY $r1
+    %2:gpr = MOVsi %1:gpr, 27, 14, $noreg, $noreg
+    %3:gpr = ORRrsi %2:gpr, %1:gpr, 234, 14, $noreg, $noreg
+    %4:gpr = MOVsi %1:gpr, 155, 14, $noreg, $noreg
+    %5:gprnopc = ORRrsi killed %4:gpr, killed %2:gpr, 106, 14, $noreg, $noreg
+    %6:gprnopc = UXTH killed %5:gprnopc, 0, 14, $noreg
+    TSTri %1:gpr, 1, 14, $noreg, implicit-def $cpsr
+    %7:gpr = MOVCCr %3:gpr, killed %6:gprnopc, 0, $cpsr
+    $r0 = COPY killed %7
+    BX_RET 14, $noreg, implicit $r0


        


More information about the llvm-commits mailing list