[llvm] 31ef15e - Teach peephole optimizer to not emit sub-register defs
Ahsan Saghir via llvm-commits
llvm-commits at lists.llvm.org
Mon Jun 28 07:24:22 PDT 2021
Author: Ahsan Saghir
Date: 2021-06-28T09:24:07-05:00
New Revision: 31ef15e0442ac13135717179d32f438af5bd6ab1
URL: https://github.com/llvm/llvm-project/commit/31ef15e0442ac13135717179d32f438af5bd6ab1
DIFF: https://github.com/llvm/llvm-project/commit/31ef15e0442ac13135717179d32f438af5bd6ab1.diff
LOG: Teach peephole optimizer to not emit sub-register defs
Peephole optimizer should not be introducing sub-reg definitions
as they are illegal in machine SSA phase. This patch modifies
the optimizer to not emit sub-register definitions.
Reviewed By: arsenm
Differential Revision: https://reviews.llvm.org/D103408
Added:
llvm/test/CodeGen/PowerPC/peephole-subreg-def.mir
Modified:
llvm/lib/CodeGen/PeepholeOptimizer.cpp
Removed:
################################################################################
diff --git a/llvm/lib/CodeGen/PeepholeOptimizer.cpp b/llvm/lib/CodeGen/PeepholeOptimizer.cpp
index 34ac396c0471..49bdba518322 100644
--- a/llvm/lib/CodeGen/PeepholeOptimizer.cpp
+++ b/llvm/lib/CodeGen/PeepholeOptimizer.cpp
@@ -585,15 +585,30 @@ optimizeExtInstr(MachineInstr &MI, MachineBasicBlock &MBB,
MRI->constrainRegClass(DstReg, DstRC);
}
+ // SubReg defs are illegal in machine SSA phase,
+ // we should not generate SubReg defs.
+ //
+ // For example, for the instructions:
+ //
+ // %1:g8rc_and_g8rc_nox0 = EXTSW %0:g8rc
+ // %3:gprc_and_gprc_nor0 = COPY %0.sub_32:g8rc
+ //
+ // We should generate:
+ //
+ // %1:g8rc_and_g8rc_nox0 = EXTSW %0:g8rc
+ // %6:gprc_and_gprc_nor0 = COPY %1.sub_32:g8rc_and_g8rc_nox0
+ // %3:gprc_and_gprc_nor0 = COPY %6:gprc_and_gprc_nor0
+ //
+ if (UseSrcSubIdx)
+ RC = MRI->getRegClass(UseMI->getOperand(0).getReg());
+
Register NewVR = MRI->createVirtualRegister(RC);
- MachineInstr *Copy = BuildMI(*UseMBB, UseMI, UseMI->getDebugLoc(),
- TII->get(TargetOpcode::COPY), NewVR)
+ BuildMI(*UseMBB, UseMI, UseMI->getDebugLoc(),
+ TII->get(TargetOpcode::COPY), NewVR)
.addReg(DstReg, 0, SubIdx);
- // SubIdx applies to both SrcReg and DstReg when UseSrcSubIdx is set.
- if (UseSrcSubIdx) {
- Copy->getOperand(0).setSubReg(SubIdx);
- Copy->getOperand(0).setIsUndef();
- }
+ if (UseSrcSubIdx)
+ UseMO->setSubReg(0);
+
UseMO->setReg(NewVR);
++NumReuse;
Changed = true;
diff --git a/llvm/test/CodeGen/PowerPC/peephole-subreg-def.mir b/llvm/test/CodeGen/PowerPC/peephole-subreg-def.mir
new file mode 100644
index 000000000000..e89e2068d927
--- /dev/null
+++ b/llvm/test/CodeGen/PowerPC/peephole-subreg-def.mir
@@ -0,0 +1,41 @@
+# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
+# RUN: llc -mtriple=powerpc64le -simplify-mir -verify-machineinstrs \
+# RUN: -run-pass=peephole-opt %s -o - | FileCheck %s
+
+# This tests to make sure that we do not generate subreg def
+# as it is illegal to generate subreg defs in machine SSA phase.
+
+---
+name: test_peephole_subreg_def
+alignment: 16
+tracksRegLiveness: true
+frameInfo:
+ maxAlignment: 1
+machineFunctionInfo: {}
+body: |
+ bb.0.entry:
+ liveins: $x3
+
+ ; CHECK-LABEL: name: test_peephole_subreg_def
+ ; CHECK: liveins: $x3
+ ; CHECK: [[COPY:%[0-9]+]]:g8rc_and_g8rc_nox0 = COPY $x3
+ ; CHECK: [[ADDI8_:%[0-9]+]]:g8rc = ADDI8 [[COPY]], 1
+ ; CHECK: [[EXTSW:%[0-9]+]]:g8rc_and_g8rc_nox0 = EXTSW [[ADDI8_]]
+ ; CHECK: [[LI8_:%[0-9]+]]:g8rc = LI8 0
+ ; CHECK: STB8 [[LI8_]], 0, [[EXTSW]]
+ ; CHECK: [[COPY1:%[0-9]+]]:gprc_and_gprc_nor0 = COPY [[EXTSW]].sub_32
+ ; CHECK: [[COPY2:%[0-9]+]]:gprc_and_gprc_nor0 = COPY [[COPY1]]
+ ; CHECK: [[ADDI:%[0-9]+]]:gprc = ADDI killed [[COPY2]], 1
+ ; CHECK: [[EXTSW_32_64_:%[0-9]+]]:g8rc_and_g8rc_nox0 = EXTSW_32_64 killed [[ADDI]]
+ ; CHECK: STB8 [[LI8_]], 0, killed [[EXTSW_32_64_]]
+ %0:g8rc_and_g8rc_nox0 = COPY $x3
+ %1:g8rc = ADDI8 %0, 1
+ %2:g8rc_and_g8rc_nox0 = EXTSW %1
+ %3:g8rc = LI8 0
+ STB8 %3, 0, killed %2
+ %4:gprc_and_gprc_nor0 = COPY %1.sub_32
+ %5:gprc = ADDI killed %4, 1
+ %6:g8rc_and_g8rc_nox0 = EXTSW_32_64 killed %5
+ STB8 %3, 0, killed %6
+
+...
More information about the llvm-commits
mailing list