diff --git a/llvm/lib/CodeGen/MIRCanonicalizerPass.cpp b/llvm/lib/CodeGen/MIRCanonicalizerPass.cpp --- a/llvm/lib/CodeGen/MIRCanonicalizerPass.cpp +++ b/llvm/lib/CodeGen/MIRCanonicalizerPass.cpp @@ -50,6 +50,11 @@ "canon-nth-basicblock", cl::Hidden, cl::init(~0u), cl::value_desc("N"), cl::desc("BasicBlock number to canonicalize.")); +static cl::opt CanonicalizeVRegNamesOnly( + "canon-vregs-namer", cl::Hidden, cl::init(false), + cl::desc("Disables all mir-canon features aside from vreg renaming: " + "equivalent of -instnamer for mir.")); + namespace { class MIRCanonicalizer : public MachineFunctionPass { @@ -614,7 +619,7 @@ Changed = true; MO->setReg(Rename); - if (!MO->isDef()) + if (!CanonicalizeVRegNamesOnly && !MO->isDef()) MO->setIsKill(false); } } @@ -677,15 +682,18 @@ bbNames.push_back(MBB->getName()); LLVM_DEBUG(dbgs() << "\n\n NEW BASIC BLOCK: " << MBB->getName() << "\n\n";); - LLVM_DEBUG(dbgs() << "MBB Before Canonical Copy Propagation:\n"; - MBB->dump();); - Changed |= propagateLocalCopies(MBB); - LLVM_DEBUG(dbgs() << "MBB After Canonical Copy Propagation:\n"; MBB->dump();); - - LLVM_DEBUG(dbgs() << "MBB Before Scheduling:\n"; MBB->dump();); unsigned IdempotentInstCount = 0; - Changed |= rescheduleCanonically(IdempotentInstCount, MBB); - LLVM_DEBUG(dbgs() << "MBB After Scheduling:\n"; MBB->dump();); + if (!CanonicalizeVRegNamesOnly) { + LLVM_DEBUG(dbgs() << "MBB Before Canonical Copy Propagation:\n"; + MBB->dump();); + Changed |= propagateLocalCopies(MBB); + LLVM_DEBUG(dbgs() << "MBB After Canonical Copy Propagation:\n"; + MBB->dump();); + + LLVM_DEBUG(dbgs() << "MBB Before Scheduling:\n"; MBB->dump();); + Changed |= rescheduleCanonically(IdempotentInstCount, MBB); + LLVM_DEBUG(dbgs() << "MBB After Scheduling:\n"; MBB->dump();); + } std::vector Candidates = populateCandidates(MBB); std::vector VisitedMIs; @@ -743,32 +751,34 @@ auto VRegRenameMap = GetVRegRenameMap(VRegs, renamedInOtherBB, MRI, NVC); Changed |= doVRegRenaming(renamedInOtherBB, VRegRenameMap, MRI); - // Here we renumber the def vregs for the idempotent instructions from the top - // of the MachineBasicBlock so that they are named in the order that we sorted - // them alphabetically. Eventually we wont need SkipVRegs because we will use - // named vregs instead. - if (IdempotentInstCount) - NVC.SkipVRegs(); + if (!CanonicalizeVRegNamesOnly) { + // Here we renumber the def vregs for the idempotent instructions from the + // top of the MachineBasicBlock so that they are named in the order that we + // sorted them alphabetically. Eventually we wont need SkipVRegs because we + // will use named vregs instead. + if (IdempotentInstCount) + NVC.SkipVRegs(); + + auto MII = MBB->begin(); + for (unsigned i = 0; i < IdempotentInstCount && MII != MBB->end(); ++i) { + MachineInstr &MI = *MII++; + Changed = true; + Register vRegToRename = MI.getOperand(0).getReg(); + auto Rename = NVC.createVirtualRegister(vRegToRename); - auto MII = MBB->begin(); - for (unsigned i = 0; i < IdempotentInstCount && MII != MBB->end(); ++i) { - MachineInstr &MI = *MII++; - Changed = true; - Register vRegToRename = MI.getOperand(0).getReg(); - auto Rename = NVC.createVirtualRegister(vRegToRename); + std::vector RenameMOs; + for (auto &MO : MRI.reg_operands(vRegToRename)) { + RenameMOs.push_back(&MO); + } - std::vector RenameMOs; - for (auto &MO : MRI.reg_operands(vRegToRename)) { - RenameMOs.push_back(&MO); + for (auto *MO : RenameMOs) { + MO->setReg(Rename); + } } - for (auto *MO : RenameMOs) { - MO->setReg(Rename); - } + Changed |= doDefKillClear(MBB); } - Changed |= doDefKillClear(MBB); - LLVM_DEBUG(dbgs() << "Updated MachineBasicBlock:\n"; MBB->dump(); dbgs() << "\n";); LLVM_DEBUG( diff --git a/llvm/test/CodeGen/MIR/AArch64/mirCanonCopyCopyProp.mir b/llvm/test/CodeGen/MIR/AArch64/mirCanonCopyCopyProp.mir --- a/llvm/test/CodeGen/MIR/AArch64/mirCanonCopyCopyProp.mir +++ b/llvm/test/CodeGen/MIR/AArch64/mirCanonCopyCopyProp.mir @@ -1,4 +1,7 @@ -# RUN: llc -mtriple=arm64-apple-ios11.0.0 -o - -run-pass mir-canonicalizer %s | FileCheck %s +# RUN: llc -mtriple=arm64-apple-ios11.0.0 -o - -run-pass mir-canonicalizer %s | FileCheck --check-prefixes=CHECK-FULL %s +# RUN: llc -mtriple=arm64-apple-ios11.0.0 -o - -run-pass mir-canonicalizer -canon-vregs-namer=1 %s | FileCheck --check-prefixes=CHECK-NAMER %s + + ... --- @@ -39,9 +42,16 @@ %42:gpr32 = LDRWui %stack.0, 0 :: (dereferenceable load 8) - ;CHECK: %namedVReg1352:gpr32 = LDRWui %stack.0, 0 :: (dereferenceable load 8) - ;CHECK: $w0 = COPY %namedVReg1352 - ;CHECK: RET_ReallyLR implicit $w0 + ;CHECK-FULL: %namedVReg1352:gpr32 = LDRWui %stack.0, 0 :: (dereferenceable load 8) + ;CHECK-FULL-NEXT: $w0 = COPY %namedVReg1352 + ;CHECK-FULL-NEXT: RET_ReallyLR implicit $w0 + + ;CHECK-NAMER: %namedVReg1355:gpr32 = LDRWui %stack.0, 0 :: (dereferenceable load 8) + ;CHECK-NAMER-NEXT: %namedVReg1354:gpr32 = COPY %namedVReg1355 + ;CHECK-NAMER-NEXT: %namedVReg1353:gpr32 = COPY %namedVReg1354 + ;CHECK-NAMER-NEXT: %namedVReg1352:gpr32 = COPY %namedVReg1353 + ;CHECK-NAMER-NEXT: $w0 = COPY %namedVReg1352 + ;CHECK-NAMER-NEXT: RET_ReallyLR implicit $w0 %vreg1234:gpr32 = COPY %42 %vreg1235:gpr32 = COPY %vreg1234 diff --git a/llvm/test/CodeGen/MIR/AArch64/mirCanonIdempotent.mir b/llvm/test/CodeGen/MIR/AArch64/mirCanonIdempotent.mir --- a/llvm/test/CodeGen/MIR/AArch64/mirCanonIdempotent.mir +++ b/llvm/test/CodeGen/MIR/AArch64/mirCanonIdempotent.mir @@ -1,11 +1,23 @@ -# RUN: llc -mtriple=arm64-apple-ios11.0.0 -o - -run-pass mir-canonicalizer %s | FileCheck %s +# RUN: llc -mtriple=arm64-apple-ios11.0.0 -o - -run-pass mir-canonicalizer %s | FileCheck --check-prefixes=CHECK-FULL %s +# RUN: llc -mtriple=arm64-apple-ios11.0.0 -o - -run-pass mir-canonicalizer -canon-vregs-namer=1 %s | FileCheck --check-prefixes=CHECK-NAMER %s # These Idempotent instructions are sorted alphabetically (based on after the '=') -# CHECK: %namedVReg4352:gpr64 = MOVi64imm 4617315517961601024 -# CHECK: %namedVReg4353:gpr32 = MOVi32imm 408 -# CHECK: %namedVReg4354:gpr32 = MOVi32imm 408 -# CHECK: %namedVReg4355:gpr64all = IMPLICIT_DEF -# CHECK: %namedVReg4356:fpr64 = FMOVDi 20 -# CHECK: %namedVReg4357:fpr64 = FMOVDi 112 +# CHECK-FULL: %namedVReg4352:gpr64 = MOVi64imm 4617315517961601024 +# CHECK-FULL-NEXT: %namedVReg4353:gpr32 = MOVi32imm 408 +# CHECK-FULL-NEXT: %namedVReg4354:gpr32 = MOVi32imm 408 +# CHECK-FULL-NEXT: %namedVReg4355:gpr64all = IMPLICIT_DEF +# CHECK-FULL-NEXT: %namedVReg4356:fpr64 = FMOVDi 20 +# CHECK-FULL-NEXT: %namedVReg4357:fpr64 = FMOVDi 112 + +# CHECK-NAMER: %namedVReg1361:fpr64 = COPY $d1 +# CHECK-NAMER-NEXT: %namedVReg1358:fpr64 = COPY $d0 +# CHECK-NAMER-NEXT: %namedVReg1355:gpr64 = COPY $x1 +# CHECK-NAMER-NEXT: %namedVReg1352:gpr64common = COPY $x0 +# CHECK-NAMER-NEXT: STRXui %namedVReg1352, %stack.1, 0 :: (store 8) +# CHECK-NAMER-NEXT: STRXui %namedVReg1355, %stack.2, 0 :: (store 8) +# CHECK-NAMER-NEXT: STRDui %namedVReg1358, %stack.3, 0 :: (store 8) +# CHECK-NAMER-NEXT: STRDui %namedVReg1361, %stack.4, 0 :: (store 8) +# CHECK-NAMER-NEXT: %namedVReg1366:fpr64 = FMOVDi 20 + ... --- name: Proc8 diff --git a/llvm/test/CodeGen/MIR/AArch64/mirCanonVRegnamer.mir b/llvm/test/CodeGen/MIR/AArch64/mirCanonVRegnamer.mir new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/MIR/AArch64/mirCanonVRegnamer.mir @@ -0,0 +1,23 @@ +# RUN: llc -run-pass mir-canonicalizer -o - -canon-vregs-namer=1 %s | FileCheck %s + +# CHECK: %namedVReg1353:_(p0) = COPY $d0 +# CHECK-NEXT: %namedVReg1352:_(<4 x s32>) = COPY $q0 +# CHECK-NEXT: G_STORE %namedVReg1352(<4 x s32>), %namedVReg1353(p0) :: (store 16) + +--- | + target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128" + target triple = "aarch64-unknown-linux-gnu" + define void @foo() { + ret void + } +... +--- +name: foo +body: | + bb.0: + liveins: $q0, $d0 + %1:fpr(p0) = COPY $d0 + %0:fpr(<4 x s32>) = COPY $q0 + G_STORE %0(<4 x s32>), %1(p0) :: (store 16) +... +