[llvm] [PowerPC]optimize the epilogue for restore non volatile cr fields (PR #202339)

zhijian lin via llvm-commits llvm-commits at lists.llvm.org
Mon Jun 8 06:49:59 PDT 2026


https://github.com/diggerlin created https://github.com/llvm/llvm-project/pull/202339

When there is more than one non-volatile CR field restored in the epilogue, there is one mtocrf instruction for each clobbered non-volatile CR field. Instead, we can use one mtcrf instruction to restore all the clobbered non-volatile CR fields. 

>From e3612a4c1e65bd66bec3e5ce3a5a34f0dc9b8cb1 Mon Sep 17 00:00:00 2001
From: zhijian <zhijian at ca.ibm.com>
Date: Thu, 4 Jun 2026 20:58:18 +0000
Subject: [PATCH] optimize the epilogue for restore non volatile cr fields

---
 llvm/lib/Target/PowerPC/PPCFrameLowering.cpp  | 65 ++++++++++++-----
 .../test/CodeGen/PowerPC/2010-02-12-saveCR.ll |  3 +-
 llvm/test/CodeGen/PowerPC/aix-crspill.ll      |  8 +--
 llvm/test/CodeGen/PowerPC/aix32-crsave.mir    |  3 +-
 llvm/test/CodeGen/PowerPC/cc.ll               |  8 +--
 llvm/test/CodeGen/PowerPC/crsave.ll           | 24 ++-----
 llvm/test/CodeGen/PowerPC/p10-spill-creq.ll   |  4 +-
 llvm/test/CodeGen/PowerPC/p10-spill-crgt.ll   |  8 +--
 llvm/test/CodeGen/PowerPC/p10-spill-crun.ll   |  8 +--
 llvm/test/CodeGen/PowerPC/ppc64-crsave.mir    |  6 +-
 .../PowerPC/ppc64-rop-protection-aix.ll       | 48 ++++---------
 .../CodeGen/PowerPC/ppc64-rop-protection.ll   | 72 +++++--------------
 12 files changed, 95 insertions(+), 162 deletions(-)

diff --git a/llvm/lib/Target/PowerPC/PPCFrameLowering.cpp b/llvm/lib/Target/PowerPC/PPCFrameLowering.cpp
index aae3e49f6c70b..38151fb014d6e 100644
--- a/llvm/lib/Target/PowerPC/PPCFrameLowering.cpp
+++ b/llvm/lib/Target/PowerPC/PPCFrameLowering.cpp
@@ -1768,6 +1768,28 @@ void PPCFrameLowering::emitEpilogue(MachineFunction &MF,
     }
   }
   assert(RBReg != ScratchReg && "Should have avoided ScratchReg");
+
+  // Lambda to build MTCRF/MTOCRF instruction for restoring CR fields
+  auto BuildMoveToCR = [&](MachineBasicBlock::iterator InsertPt,
+                           Register SrcReg) {
+    if (MustSaveCRs.size() == 1) {
+      // Use MTOCRF for single CR field
+      BuildMI(MBB, InsertPt, dl, MoveToCRInst, MustSaveCRs[0])
+          .addReg(SrcReg, getKillRegState(true));
+    } else {
+      // Build CR mask for MTCRF - more efficient than multiple MTOCRF
+      unsigned CRMask = 0;
+      for (unsigned CRField : MustSaveCRs) {
+        unsigned CRNum = CRField - PPC::CR0;
+        CRMask |= (0x80 >> CRNum);
+      }
+      // Use single MTCRF to restore multi CR fields at once
+      BuildMI(MBB, InsertPt, dl, TII.get(isPPC64 ? PPC::MTCRF8 : PPC::MTCRF))
+          .addImm(CRMask)
+          .addReg(SrcReg, getKillRegState(true));
+    }
+  };
+
   // If there is no red zone, ScratchReg may be needed for holding a useful
   // value (although not the base register). Make sure it is not overwritten
   // too early.
@@ -1781,9 +1803,7 @@ void PPCFrameLowering::emitEpilogue(MachineFunction &MF,
     BuildMI(MBB, MBBI, dl, LoadWordInst, TempReg)
       .addImm(CRSaveOffset)
       .addReg(SPReg);
-    for (unsigned i = 0, e = MustSaveCRs.size(); i != e; ++i)
-      BuildMI(MBB, MBBI, dl, MoveToCRInst, MustSaveCRs[i])
-        .addReg(TempReg, getKillRegState(i == e-1));
+    BuildMoveToCR(MBBI, TempReg);
   }
 
   // Delay restoring of the LR if ScratchReg is needed. This is ok, since
@@ -1857,9 +1877,7 @@ void PPCFrameLowering::emitEpilogue(MachineFunction &MF,
 
   if (MustSaveCR &&
       !(SingleScratchReg && MustSaveLR))
-    for (unsigned i = 0, e = MustSaveCRs.size(); i != e; ++i)
-      BuildMI(MBB, MBBI, dl, MoveToCRInst, MustSaveCRs[i])
-        .addReg(TempReg, getKillRegState(i == e-1));
+    BuildMoveToCR(MBBI, TempReg);
 
   if (MustSaveLR) {
     // If ROP protection is required, an extra instruction is added to compute a
@@ -2545,19 +2563,28 @@ static void restoreCRs(bool is31, bool CR2Spilled, bool CR3Spilled,
   MBB.insert(MI,
              addFrameReference(BuildMI(*MF, DL, TII.get(PPC::LWZ), MoveReg),
                                CSI[CSIIndex].getFrameIdx()));
-
-  unsigned RestoreOp = PPC::MTOCRF;
-  if (CR2Spilled)
-    MBB.insert(MI, BuildMI(*MF, DL, TII.get(RestoreOp), PPC::CR2)
-               .addReg(MoveReg, getKillRegState(!CR3Spilled && !CR4Spilled)));
-
-  if (CR3Spilled)
-    MBB.insert(MI, BuildMI(*MF, DL, TII.get(RestoreOp), PPC::CR3)
-               .addReg(MoveReg, getKillRegState(!CR4Spilled)));
-
-  if (CR4Spilled)
-    MBB.insert(MI, BuildMI(*MF, DL, TII.get(RestoreOp), PPC::CR4)
-               .addReg(MoveReg, getKillRegState(true)));
+  // Count how many CR fields need restoring
+  unsigned NumCRs =
+      (CR2Spilled ? 1 : 0) + (CR3Spilled ? 1 : 0) + (CR4Spilled ? 1 : 0);
+
+  if (NumCRs == 1) {
+    // Use MTOCRF for single field
+    unsigned CRReg = CR2Spilled ? PPC::CR2 : (CR3Spilled ? PPC::CR3 : PPC::CR4);
+    MBB.insert(MI, BuildMI(*MF, DL, TII.get(PPC::MTOCRF), CRReg)
+                       .addReg(MoveReg, getKillRegState(true)));
+  } else if (NumCRs > 1) {
+    // Use MTCRF for multiple fields (1 instruction vs N)
+    unsigned CRMask = 0;
+    if (CR2Spilled)
+      CRMask |= 0x20;
+    if (CR3Spilled)
+      CRMask |= 0x10;
+    if (CR4Spilled)
+      CRMask |= 0x08;
+    MBB.insert(MI, BuildMI(*MF, DL, TII.get(PPC::MTCRF))
+                       .addImm(CRMask)
+                       .addReg(MoveReg, getKillRegState(true)));
+  }
 }
 
 MachineBasicBlock::iterator PPCFrameLowering::
diff --git a/llvm/test/CodeGen/PowerPC/2010-02-12-saveCR.ll b/llvm/test/CodeGen/PowerPC/2010-02-12-saveCR.ll
index 0c645c948ecb9..de5b0d95da7e7 100644
--- a/llvm/test/CodeGen/PowerPC/2010-02-12-saveCR.ll
+++ b/llvm/test/CodeGen/PowerPC/2010-02-12-saveCR.ll
@@ -21,8 +21,7 @@ entry:
 return:                                           ; preds = %entry
 ; CHECK: ori [[T2]], [[T2]], 34492
 ; CHECK: lwzx [[T1]], 1, [[T2]]
-; CHECK: mtcrf 32, [[T1]]
-; CHECK: mtcrf 16, [[T1]]
+; CHECK: mtcrf 48, [[T1]]
   ret void
 }
 
diff --git a/llvm/test/CodeGen/PowerPC/aix-crspill.ll b/llvm/test/CodeGen/PowerPC/aix-crspill.ll
index 9487c482e9c28..d9af3871fd3e8 100644
--- a/llvm/test/CodeGen/PowerPC/aix-crspill.ll
+++ b/llvm/test/CodeGen/PowerPC/aix-crspill.ll
@@ -63,9 +63,7 @@ declare signext i32 @do_something(i32 signext)
 ; 64BIT-NEXT:   ld 0, 16(1)
 ; 64BIT-NEXT:   lwz 12, 8(1)
 ; 64BIT-NEXT:   mtlr 0
-; 64BIT-NEXT:   mtocrf 32, 12
-; 64BIT-NEXT:   mtocrf 16, 12
-; 64BIT-NEXT:   mtocrf 8, 12
+; 64BIT-NEXT:   mtcrf 56, 12
 ; 64BIT-NEXT:   blr
 
 
@@ -75,7 +73,5 @@ declare signext i32 @do_something(i32 signext)
 ; 32BIT-NEXT:   lwz 0, 8(1)
 ; 32BIT-NEXT:   lwz 12, 4(1)
 ; 32BIT-NEXT:   mtlr 0
-; 32BIT-NEXT:   mtocrf 32, 12
-; 32BIT-NEXT:   mtocrf 16, 12
-; 32BIT-NEXT:   mtocrf 8, 12
+; 32BIT-NEXT:   mtcrf 56, 12
 ; 32BIT-NEXT:   blr
diff --git a/llvm/test/CodeGen/PowerPC/aix32-crsave.mir b/llvm/test/CodeGen/PowerPC/aix32-crsave.mir
index 73736d6d5353f..189b23053295d 100644
--- a/llvm/test/CodeGen/PowerPC/aix32-crsave.mir
+++ b/llvm/test/CodeGen/PowerPC/aix32-crsave.mir
@@ -46,8 +46,7 @@ body:             |
     ; CHECK-NEXT: $r30 = LWZ -8, $r1 :: (load (s32) from %fixed-stack.1, align 8)
     ; CHECK-NEXT: $r29 = LWZ -12, $r1 :: (load (s32) from %fixed-stack.2)
     ; CHECK-NEXT: $r12 = LWZ 4, $r1
-    ; CHECK-NEXT: $cr2 = MTOCRF $r12
-    ; CHECK-NEXT: $cr4 = MTOCRF killed $r12
+    ; CHECK-NEXT: MTCRF 40, killed $r12
 
 ...
 ---
diff --git a/llvm/test/CodeGen/PowerPC/cc.ll b/llvm/test/CodeGen/PowerPC/cc.ll
index 05559b2f81752..4f65a5ba8b914 100644
--- a/llvm/test/CodeGen/PowerPC/cc.ll
+++ b/llvm/test/CodeGen/PowerPC/cc.ll
@@ -29,9 +29,7 @@ end:
 ; CHECK: mtocrf 128, [[REG3]]
 
 ; CHECK: lwz [[REG4:[0-9]+]], 8(1)
-; CHECK-DAG: mtocrf 32, [[REG4]]
-; CHECK-DAG: mtocrf 16, [[REG4]]
-; CHECK-DAG: mtocrf 8, [[REG4]]
+; CHECK-DAG: mtcrf 56, [[REG4]]
 ; CHECK: blr
 }
 
@@ -62,9 +60,7 @@ end:
 ; CHECK: mtocrf 128, [[REG3]]
 
 ; CHECK: lwz [[REG4:[0-9]+]], 8(1)
-; CHECK-DAG: mtocrf 32, [[REG4]]
-; CHECK-DAG: mtocrf 16, [[REG4]]
-; CHECK-DAG: mtocrf 8, [[REG4]]
+; CHECK-DAG: mtcrf 56, [[REG4]]
 ; CHECK: blr
 }
 
diff --git a/llvm/test/CodeGen/PowerPC/crsave.ll b/llvm/test/CodeGen/PowerPC/crsave.ll
index 05da108e1fbf8..e37d11bad31bd 100644
--- a/llvm/test/CodeGen/PowerPC/crsave.ll
+++ b/llvm/test/CodeGen/PowerPC/crsave.ll
@@ -137,9 +137,7 @@ define i32 @test_cr234() nounwind {
 ; PPC32-NEXT:    bl foo
 ; PPC32-NEXT:    lwz 3, 20(31)
 ; PPC32-NEXT:    lwz 12, 24(31)
-; PPC32-NEXT:    mtocrf 32, 12
-; PPC32-NEXT:    mtocrf 16, 12
-; PPC32-NEXT:    mtocrf 8, 12
+; PPC32-NEXT:    mtcrf 56, 12
 ; PPC32-NEXT:    lwz 0, 36(1)
 ; PPC32-NEXT:    lwz 31, 28(1)
 ; PPC32-NEXT:    addi 1, 1, 32
@@ -172,9 +170,7 @@ define i32 @test_cr234() nounwind {
 ; PPC64-NEXT:    addi 1, 1, 128
 ; PPC64-NEXT:    ld 0, 16(1)
 ; PPC64-NEXT:    lwz 12, 8(1)
-; PPC64-NEXT:    mtocrf 32, 12
-; PPC64-NEXT:    mtocrf 16, 12
-; PPC64-NEXT:    mtocrf 8, 12
+; PPC64-NEXT:    mtcrf 56, 12
 ; PPC64-NEXT:    mtlr 0
 ; PPC64-NEXT:    blr
 ;
@@ -204,9 +200,7 @@ define i32 @test_cr234() nounwind {
 ; PPC64-ELFv2-NEXT:    addi 1, 1, 112
 ; PPC64-ELFv2-NEXT:    ld 0, 16(1)
 ; PPC64-ELFv2-NEXT:    lwz 12, 8(1)
-; PPC64-ELFv2-NEXT:    mtocrf 32, 12
-; PPC64-ELFv2-NEXT:    mtocrf 16, 12
-; PPC64-ELFv2-NEXT:    mtocrf 8, 12
+; PPC64-ELFv2-NEXT:    mtcrf 56, 12
 ; PPC64-ELFv2-NEXT:    mtlr 0
 ; PPC64-ELFv2-NEXT:    blr
 entry:
@@ -285,9 +279,7 @@ define void @cloberAllNvCrField() {
 ; PPC32-NEXT:    # clobbers
 ; PPC32-NEXT:    #NO_APP
 ; PPC32-NEXT:    lwz 12, 24(31)
-; PPC32-NEXT:    mtocrf 32, 12
-; PPC32-NEXT:    mtocrf 16, 12
-; PPC32-NEXT:    mtocrf 8, 12
+; PPC32-NEXT:    mtcrf 56, 12
 ; PPC32-NEXT:    lwz 31, 28(1)
 ; PPC32-NEXT:    addi 1, 1, 32
 ; PPC32-NEXT:    blr
@@ -300,9 +292,7 @@ define void @cloberAllNvCrField() {
 ; PPC64-NEXT:    # clobbers
 ; PPC64-NEXT:    #NO_APP
 ; PPC64-NEXT:    lwz 12, 8(1)
-; PPC64-NEXT:    mtocrf 32, 12
-; PPC64-NEXT:    mtocrf 16, 12
-; PPC64-NEXT:    mtocrf 8, 12
+; PPC64-NEXT:    mtcrf 56, 12
 ; PPC64-NEXT:    blr
 ;
 ; PPC64-ELFv2-LABEL: cloberAllNvCrField:
@@ -313,9 +303,7 @@ define void @cloberAllNvCrField() {
 ; PPC64-ELFv2-NEXT:    # clobbers
 ; PPC64-ELFv2-NEXT:    #NO_APP
 ; PPC64-ELFv2-NEXT:    lwz 12, 8(1)
-; PPC64-ELFv2-NEXT:    mtocrf 32, 12
-; PPC64-ELFv2-NEXT:    mtocrf 16, 12
-; PPC64-ELFv2-NEXT:    mtocrf 8, 12
+; PPC64-ELFv2-NEXT:    mtcrf 56, 12
 ; PPC64-ELFv2-NEXT:    blr
 entry:
   tail call void asm sideeffect "# clobbers", "~{cr2},~{cr3},~{cr4}"()
diff --git a/llvm/test/CodeGen/PowerPC/p10-spill-creq.ll b/llvm/test/CodeGen/PowerPC/p10-spill-creq.ll
index da3acd4721356..5a4020022f77a 100644
--- a/llvm/test/CodeGen/PowerPC/p10-spill-creq.ll
+++ b/llvm/test/CodeGen/PowerPC/p10-spill-creq.ll
@@ -122,9 +122,7 @@ define dso_local double @P10_Spill_CR_EQ(ptr %arg) local_unnamed_addr #0 {
 ; CHECK-NEXT:    mtocrf 128, r7
 ; CHECK-NEXT:    isel r5, 0, r6, 4*cr6+lt
 ; CHECK-NEXT:    isel r3, 0, r3, 4*cr1+eq
-; CHECK-NEXT:    mtocrf 32, r12
-; CHECK-NEXT:    mtocrf 16, r12
-; CHECK-NEXT:    mtocrf 8, r12
+; CHECK-NEXT:    mtcrf 56, r12
 ; CHECK-NEXT:    crandc 4*cr5+lt, 4*cr5+lt, eq
 ; CHECK-NEXT:    isel r5, 0, r5, 4*cr7+eq
 ; CHECK-NEXT:    crnor 4*cr5+lt, 4*cr5+un, 4*cr5+lt
diff --git a/llvm/test/CodeGen/PowerPC/p10-spill-crgt.ll b/llvm/test/CodeGen/PowerPC/p10-spill-crgt.ll
index e99ea59bfacac..7086e3787230f 100644
--- a/llvm/test/CodeGen/PowerPC/p10-spill-crgt.ll
+++ b/llvm/test/CodeGen/PowerPC/p10-spill-crgt.ll
@@ -185,9 +185,7 @@ define dso_local fastcc void @P10_Spill_CR_GT(ptr %p) unnamed_addr {
 ; CHECK-NEXT:    ld r0, 16(r1)
 ; CHECK-NEXT:    lwz r12, 8(r1)
 ; CHECK-NEXT:    mtlr r0
-; CHECK-NEXT:    mtocrf 32, r12
-; CHECK-NEXT:    mtocrf 16, r12
-; CHECK-NEXT:    mtocrf 8, r12
+; CHECK-NEXT:    mtcrf 56, r12
 ; CHECK-NEXT:    blr
 ; CHECK-NEXT:  .LBB0_32: # %bb29
 ; CHECK-NEXT:    crmove eq, 4*cr3+eq
@@ -382,9 +380,7 @@ define dso_local fastcc void @P10_Spill_CR_GT(ptr %p) unnamed_addr {
 ; CHECK-BE-NEXT:    ld r0, 16(r1)
 ; CHECK-BE-NEXT:    lwz r12, 8(r1)
 ; CHECK-BE-NEXT:    mtlr r0
-; CHECK-BE-NEXT:    mtocrf 32, r12
-; CHECK-BE-NEXT:    mtocrf 16, r12
-; CHECK-BE-NEXT:    mtocrf 8, r12
+; CHECK-BE-NEXT:    mtcrf 56, r12
 ; CHECK-BE-NEXT:    blr
 ; CHECK-BE-NEXT:  .LBB0_32: # %bb29
 ; CHECK-BE-NEXT:    crmove eq, 4*cr3+eq
diff --git a/llvm/test/CodeGen/PowerPC/p10-spill-crun.ll b/llvm/test/CodeGen/PowerPC/p10-spill-crun.ll
index 8206fd0b4fe13..3c72272209329 100644
--- a/llvm/test/CodeGen/PowerPC/p10-spill-crun.ll
+++ b/llvm/test/CodeGen/PowerPC/p10-spill-crun.ll
@@ -173,9 +173,7 @@ define dso_local void @P10_Spill_CR_UN(ptr %arg, ptr %arg1, i32 %arg2) local_unn
 ; CHECK-NEXT:    ld r0, 16(r1)
 ; CHECK-NEXT:    lwz r12, 8(r1)
 ; CHECK-NEXT:    mtlr r0
-; CHECK-NEXT:    mtocrf 32, r12
-; CHECK-NEXT:    mtocrf 16, r12
-; CHECK-NEXT:    mtocrf 8, r12
+; CHECK-NEXT:    mtcrf 56, r12
 ; CHECK-NEXT:    blr
 ; CHECK-NEXT:  .LBB0_18: # %bb30
 ; CHECK-NEXT:    stb r3, 181(r1)
@@ -333,9 +331,7 @@ define dso_local void @P10_Spill_CR_UN(ptr %arg, ptr %arg1, i32 %arg2) local_unn
 ; CHECK-BE-NEXT:    ld r0, 16(r1)
 ; CHECK-BE-NEXT:    lwz r12, 8(r1)
 ; CHECK-BE-NEXT:    mtlr r0
-; CHECK-BE-NEXT:    mtocrf 32, r12
-; CHECK-BE-NEXT:    mtocrf 16, r12
-; CHECK-BE-NEXT:    mtocrf 8, r12
+; CHECK-BE-NEXT:    mtcrf 56, r12
 ; CHECK-BE-NEXT:    blr
 ; CHECK-BE-NEXT:  .LBB0_18: # %bb30
 ; CHECK-BE-NEXT:    stb r3, 197(r1)
diff --git a/llvm/test/CodeGen/PowerPC/ppc64-crsave.mir b/llvm/test/CodeGen/PowerPC/ppc64-crsave.mir
index 196ad134bfa55..57a2934419ed3 100644
--- a/llvm/test/CodeGen/PowerPC/ppc64-crsave.mir
+++ b/llvm/test/CodeGen/PowerPC/ppc64-crsave.mir
@@ -29,8 +29,7 @@ body:             |
     ; SAVEONE-NEXT: renamable $cr2lt = COPY $cr0gt
     ; SAVEONE-NEXT: renamable $cr4lt = COPY $cr0gt
     ; SAVEONE-NEXT: $x12 = LWZ8 8, $x1
-    ; SAVEONE-NEXT: $cr2 = MTOCRF8 $x12
-    ; SAVEONE-NEXT: $cr4 = MTOCRF8 killed $x12
+    ; SAVEONE-NEXT: MTCRF8 40, killed $x12
     ; SAVEONE-NEXT: BLR8 implicit $lr8, implicit $rm, implicit $x3
     ;
     ; SAVEALL-LABEL: name: CRAllSave
@@ -42,8 +41,7 @@ body:             |
     ; SAVEALL-NEXT: renamable $cr2lt = COPY $cr0gt
     ; SAVEALL-NEXT: renamable $cr4lt = COPY $cr0gt
     ; SAVEALL-NEXT: $x12 = LWZ8 8, $x1
-    ; SAVEALL-NEXT: $cr2 = MTOCRF8 $x12
-    ; SAVEALL-NEXT: $cr4 = MTOCRF8 killed $x12
+    ; SAVEALL-NEXT: MTCRF8 40, killed $x12
     ; SAVEALL-NEXT: BLR8 implicit $lr8, implicit $rm, implicit $x3
     renamable $x3 = ANDI8_rec killed renamable $x3, 1, implicit-def dead $cr0, implicit-def $cr0gt
     renamable $cr2lt = COPY $cr0gt
diff --git a/llvm/test/CodeGen/PowerPC/ppc64-rop-protection-aix.ll b/llvm/test/CodeGen/PowerPC/ppc64-rop-protection-aix.ll
index 8df47808169be..97187389a9d0b 100644
--- a/llvm/test/CodeGen/PowerPC/ppc64-rop-protection-aix.ll
+++ b/llvm/test/CodeGen/PowerPC/ppc64-rop-protection-aix.ll
@@ -399,9 +399,7 @@ define dso_local zeroext i32 @spill(ptr nocapture readonly %in) #0 {
 ; BE-P10-NEXT:    lwz r12, 8(r1)
 ; BE-P10-NEXT:    mtlr r0
 ; BE-P10-NEXT:    hashchk r0, -488(r1)
-; BE-P10-NEXT:    mtocrf 32, r12
-; BE-P10-NEXT:    mtocrf 16, r12
-; BE-P10-NEXT:    mtocrf 8, r12
+; BE-P10-NEXT:    mtcrf 56, r12
 ; BE-P10-NEXT:    blr
 ;
 ; BE-P9-LABEL: spill:
@@ -526,9 +524,7 @@ define dso_local zeroext i32 @spill(ptr nocapture readonly %in) #0 {
 ; BE-P9-NEXT:    lwz r12, 8(r1)
 ; BE-P9-NEXT:    mtlr r0
 ; BE-P9-NEXT:    hashchk r0, -488(r1)
-; BE-P9-NEXT:    mtocrf 32, r12
-; BE-P9-NEXT:    mtocrf 16, r12
-; BE-P9-NEXT:    mtocrf 8, r12
+; BE-P9-NEXT:    mtcrf 56, r12
 ; BE-P9-NEXT:    blr
 ;
 ; BE-P8-LABEL: spill:
@@ -677,9 +673,7 @@ define dso_local zeroext i32 @spill(ptr nocapture readonly %in) #0 {
 ; BE-P8-NEXT:    lwz r12, 8(r1)
 ; BE-P8-NEXT:    hashchk r0, -488(r1)
 ; BE-P8-NEXT:    mtlr r0
-; BE-P8-NEXT:    mtocrf 32, r12
-; BE-P8-NEXT:    mtocrf 16, r12
-; BE-P8-NEXT:    mtocrf 8, r12
+; BE-P8-NEXT:    mtcrf 56, r12
 ; BE-P8-NEXT:    blr
 ;
 ; BE-32BIT-P10-LABEL: spill:
@@ -805,9 +799,7 @@ define dso_local zeroext i32 @spill(ptr nocapture readonly %in) #0 {
 ; BE-32BIT-P10-NEXT:    lwz r12, 4(r1)
 ; BE-32BIT-P10-NEXT:    mtlr r0
 ; BE-32BIT-P10-NEXT:    hashchk r0, -424(r1)
-; BE-32BIT-P10-NEXT:    mtocrf 32, r12
-; BE-32BIT-P10-NEXT:    mtocrf 16, r12
-; BE-32BIT-P10-NEXT:    mtocrf 8, r12
+; BE-32BIT-P10-NEXT:    mtcrf 56, r12
 ; BE-32BIT-P10-NEXT:    blr
 ;
 ; BE-32BIT-P9-LABEL: spill:
@@ -933,9 +925,7 @@ define dso_local zeroext i32 @spill(ptr nocapture readonly %in) #0 {
 ; BE-32BIT-P9-NEXT:    lwz r12, 4(r1)
 ; BE-32BIT-P9-NEXT:    mtlr r0
 ; BE-32BIT-P9-NEXT:    hashchk r0, -424(r1)
-; BE-32BIT-P9-NEXT:    mtocrf 32, r12
-; BE-32BIT-P9-NEXT:    mtocrf 16, r12
-; BE-32BIT-P9-NEXT:    mtocrf 8, r12
+; BE-32BIT-P9-NEXT:    mtcrf 56, r12
 ; BE-32BIT-P9-NEXT:    blr
 ;
 ; BE-32BIT-P8-LABEL: spill:
@@ -1085,9 +1075,7 @@ define dso_local zeroext i32 @spill(ptr nocapture readonly %in) #0 {
 ; BE-32BIT-P8-NEXT:    lwz r12, 4(r1)
 ; BE-32BIT-P8-NEXT:    hashchk r0, -424(r1)
 ; BE-32BIT-P8-NEXT:    mtlr r0
-; BE-32BIT-P8-NEXT:    mtocrf 32, r12
-; BE-32BIT-P8-NEXT:    mtocrf 16, r12
-; BE-32BIT-P8-NEXT:    mtocrf 8, r12
+; BE-32BIT-P8-NEXT:    mtcrf 56, r12
 ; BE-32BIT-P8-NEXT:    blr
 ;
 ; BE-P10-PRIV-LABEL: spill:
@@ -1212,9 +1200,7 @@ define dso_local zeroext i32 @spill(ptr nocapture readonly %in) #0 {
 ; BE-P10-PRIV-NEXT:    lwz r12, 8(r1)
 ; BE-P10-PRIV-NEXT:    mtlr r0
 ; BE-P10-PRIV-NEXT:    hashchkp r0, -488(r1)
-; BE-P10-PRIV-NEXT:    mtocrf 32, r12
-; BE-P10-PRIV-NEXT:    mtocrf 16, r12
-; BE-P10-PRIV-NEXT:    mtocrf 8, r12
+; BE-P10-PRIV-NEXT:    mtcrf 56, r12
 ; BE-P10-PRIV-NEXT:    blr
 ;
 ; BE-P9-PRIV-LABEL: spill:
@@ -1339,9 +1325,7 @@ define dso_local zeroext i32 @spill(ptr nocapture readonly %in) #0 {
 ; BE-P9-PRIV-NEXT:    lwz r12, 8(r1)
 ; BE-P9-PRIV-NEXT:    mtlr r0
 ; BE-P9-PRIV-NEXT:    hashchkp r0, -488(r1)
-; BE-P9-PRIV-NEXT:    mtocrf 32, r12
-; BE-P9-PRIV-NEXT:    mtocrf 16, r12
-; BE-P9-PRIV-NEXT:    mtocrf 8, r12
+; BE-P9-PRIV-NEXT:    mtcrf 56, r12
 ; BE-P9-PRIV-NEXT:    blr
 ;
 ; BE-P8-PRIV-LABEL: spill:
@@ -1490,9 +1474,7 @@ define dso_local zeroext i32 @spill(ptr nocapture readonly %in) #0 {
 ; BE-P8-PRIV-NEXT:    lwz r12, 8(r1)
 ; BE-P8-PRIV-NEXT:    hashchkp r0, -488(r1)
 ; BE-P8-PRIV-NEXT:    mtlr r0
-; BE-P8-PRIV-NEXT:    mtocrf 32, r12
-; BE-P8-PRIV-NEXT:    mtocrf 16, r12
-; BE-P8-PRIV-NEXT:    mtocrf 8, r12
+; BE-P8-PRIV-NEXT:    mtcrf 56, r12
 ; BE-P8-PRIV-NEXT:    blr
 ;
 ; BE-32BIT-P10-PRIV-LABEL: spill:
@@ -1618,9 +1600,7 @@ define dso_local zeroext i32 @spill(ptr nocapture readonly %in) #0 {
 ; BE-32BIT-P10-PRIV-NEXT:    lwz r12, 4(r1)
 ; BE-32BIT-P10-PRIV-NEXT:    mtlr r0
 ; BE-32BIT-P10-PRIV-NEXT:    hashchkp r0, -424(r1)
-; BE-32BIT-P10-PRIV-NEXT:    mtocrf 32, r12
-; BE-32BIT-P10-PRIV-NEXT:    mtocrf 16, r12
-; BE-32BIT-P10-PRIV-NEXT:    mtocrf 8, r12
+; BE-32BIT-P10-PRIV-NEXT:    mtcrf 56, r12
 ; BE-32BIT-P10-PRIV-NEXT:    blr
 ;
 ; BE-32BIT-P9-PRIV-LABEL: spill:
@@ -1746,9 +1726,7 @@ define dso_local zeroext i32 @spill(ptr nocapture readonly %in) #0 {
 ; BE-32BIT-P9-PRIV-NEXT:    lwz r12, 4(r1)
 ; BE-32BIT-P9-PRIV-NEXT:    mtlr r0
 ; BE-32BIT-P9-PRIV-NEXT:    hashchkp r0, -424(r1)
-; BE-32BIT-P9-PRIV-NEXT:    mtocrf 32, r12
-; BE-32BIT-P9-PRIV-NEXT:    mtocrf 16, r12
-; BE-32BIT-P9-PRIV-NEXT:    mtocrf 8, r12
+; BE-32BIT-P9-PRIV-NEXT:    mtcrf 56, r12
 ; BE-32BIT-P9-PRIV-NEXT:    blr
 ;
 ; BE-32BIT-P8-PRIV-LABEL: spill:
@@ -1898,9 +1876,7 @@ define dso_local zeroext i32 @spill(ptr nocapture readonly %in) #0 {
 ; BE-32BIT-P8-PRIV-NEXT:    lwz r12, 4(r1)
 ; BE-32BIT-P8-PRIV-NEXT:    hashchkp r0, -424(r1)
 ; BE-32BIT-P8-PRIV-NEXT:    mtlr r0
-; BE-32BIT-P8-PRIV-NEXT:    mtocrf 32, r12
-; BE-32BIT-P8-PRIV-NEXT:    mtocrf 16, r12
-; BE-32BIT-P8-PRIV-NEXT:    mtocrf 8, r12
+; BE-32BIT-P8-PRIV-NEXT:    mtcrf 56, r12
 ; BE-32BIT-P8-PRIV-NEXT:    blr
 entry:
   %local = alloca i32, align 4
diff --git a/llvm/test/CodeGen/PowerPC/ppc64-rop-protection.ll b/llvm/test/CodeGen/PowerPC/ppc64-rop-protection.ll
index 829bf0f0d052e..1d46e92242831 100644
--- a/llvm/test/CodeGen/PowerPC/ppc64-rop-protection.ll
+++ b/llvm/test/CodeGen/PowerPC/ppc64-rop-protection.ll
@@ -535,9 +535,7 @@ define dso_local zeroext i32 @spill(ptr nocapture readonly %in) #0 {
 ; LE-P10-NEXT:    lwz r12, 8(r1)
 ; LE-P10-NEXT:    mtlr r0
 ; LE-P10-NEXT:    hashchk r0, -488(r1)
-; LE-P10-NEXT:    mtocrf 32, r12
-; LE-P10-NEXT:    mtocrf 16, r12
-; LE-P10-NEXT:    mtocrf 8, r12
+; LE-P10-NEXT:    mtcrf 56, r12
 ; LE-P10-NEXT:    blr
 ;
 ; LE-P9-LABEL: spill:
@@ -662,9 +660,7 @@ define dso_local zeroext i32 @spill(ptr nocapture readonly %in) #0 {
 ; LE-P9-NEXT:    lwz r12, 8(r1)
 ; LE-P9-NEXT:    mtlr r0
 ; LE-P9-NEXT:    hashchk r0, -488(r1)
-; LE-P9-NEXT:    mtocrf 32, r12
-; LE-P9-NEXT:    mtocrf 16, r12
-; LE-P9-NEXT:    mtocrf 8, r12
+; LE-P9-NEXT:    mtcrf 56, r12
 ; LE-P9-NEXT:    blr
 ;
 ; LE-P8-LABEL: spill:
@@ -813,9 +809,7 @@ define dso_local zeroext i32 @spill(ptr nocapture readonly %in) #0 {
 ; LE-P8-NEXT:    lwz r12, 8(r1)
 ; LE-P8-NEXT:    hashchk r0, -488(r1)
 ; LE-P8-NEXT:    mtlr r0
-; LE-P8-NEXT:    mtocrf 32, r12
-; LE-P8-NEXT:    mtocrf 16, r12
-; LE-P8-NEXT:    mtocrf 8, r12
+; LE-P8-NEXT:    mtcrf 56, r12
 ; LE-P8-NEXT:    blr
 ;
 ; LE-P10-O0-LABEL: spill:
@@ -939,9 +933,7 @@ define dso_local zeroext i32 @spill(ptr nocapture readonly %in) #0 {
 ; LE-P10-O0-NEXT:    addi r1, r1, 544
 ; LE-P10-O0-NEXT:    ld r0, 16(r1)
 ; LE-P10-O0-NEXT:    lwz r12, 8(r1)
-; LE-P10-O0-NEXT:    mtocrf 32, r12
-; LE-P10-O0-NEXT:    mtocrf 16, r12
-; LE-P10-O0-NEXT:    mtocrf 8, r12
+; LE-P10-O0-NEXT:    mtcrf 56, r12
 ; LE-P10-O0-NEXT:    hashchk r0, -488(r1)
 ; LE-P10-O0-NEXT:    mtlr r0
 ; LE-P10-O0-NEXT:    blr
@@ -1067,9 +1059,7 @@ define dso_local zeroext i32 @spill(ptr nocapture readonly %in) #0 {
 ; LE-P9-O0-NEXT:    addi r1, r1, 608
 ; LE-P9-O0-NEXT:    ld r0, 16(r1)
 ; LE-P9-O0-NEXT:    lwz r12, 8(r1)
-; LE-P9-O0-NEXT:    mtocrf 32, r12
-; LE-P9-O0-NEXT:    mtocrf 16, r12
-; LE-P9-O0-NEXT:    mtocrf 8, r12
+; LE-P9-O0-NEXT:    mtcrf 56, r12
 ; LE-P9-O0-NEXT:    hashchk r0, -488(r1)
 ; LE-P9-O0-NEXT:    mtlr r0
 ; LE-P9-O0-NEXT:    blr
@@ -1219,9 +1209,7 @@ define dso_local zeroext i32 @spill(ptr nocapture readonly %in) #0 {
 ; LE-P8-O0-NEXT:    addi r1, r1, 608
 ; LE-P8-O0-NEXT:    ld r0, 16(r1)
 ; LE-P8-O0-NEXT:    lwz r12, 8(r1)
-; LE-P8-O0-NEXT:    mtocrf 32, r12
-; LE-P8-O0-NEXT:    mtocrf 16, r12
-; LE-P8-O0-NEXT:    mtocrf 8, r12
+; LE-P8-O0-NEXT:    mtcrf 56, r12
 ; LE-P8-O0-NEXT:    hashchk r0, -488(r1)
 ; LE-P8-O0-NEXT:    mtlr r0
 ; LE-P8-O0-NEXT:    blr
@@ -1348,9 +1336,7 @@ define dso_local zeroext i32 @spill(ptr nocapture readonly %in) #0 {
 ; BE-P10-NEXT:    lwz r12, 8(r1)
 ; BE-P10-NEXT:    mtlr r0
 ; BE-P10-NEXT:    hashchk r0, -488(r1)
-; BE-P10-NEXT:    mtocrf 32, r12
-; BE-P10-NEXT:    mtocrf 16, r12
-; BE-P10-NEXT:    mtocrf 8, r12
+; BE-P10-NEXT:    mtcrf 56, r12
 ; BE-P10-NEXT:    blr
 ;
 ; BE-P9-LABEL: spill:
@@ -1475,9 +1461,7 @@ define dso_local zeroext i32 @spill(ptr nocapture readonly %in) #0 {
 ; BE-P9-NEXT:    lwz r12, 8(r1)
 ; BE-P9-NEXT:    mtlr r0
 ; BE-P9-NEXT:    hashchk r0, -488(r1)
-; BE-P9-NEXT:    mtocrf 32, r12
-; BE-P9-NEXT:    mtocrf 16, r12
-; BE-P9-NEXT:    mtocrf 8, r12
+; BE-P9-NEXT:    mtcrf 56, r12
 ; BE-P9-NEXT:    blr
 ;
 ; BE-P8-LABEL: spill:
@@ -1626,9 +1610,7 @@ define dso_local zeroext i32 @spill(ptr nocapture readonly %in) #0 {
 ; BE-P8-NEXT:    lwz r12, 8(r1)
 ; BE-P8-NEXT:    hashchk r0, -488(r1)
 ; BE-P8-NEXT:    mtlr r0
-; BE-P8-NEXT:    mtocrf 32, r12
-; BE-P8-NEXT:    mtocrf 16, r12
-; BE-P8-NEXT:    mtocrf 8, r12
+; BE-P8-NEXT:    mtcrf 56, r12
 ; BE-P8-NEXT:    blr
 ;
 ; BE-32BIT-P10-LABEL: spill:
@@ -1728,9 +1710,7 @@ define dso_local zeroext i32 @spill(ptr nocapture readonly %in) #0 {
 ; BE-32BIT-P10-NEXT:    lwz r4, 16(r4)
 ; BE-32BIT-P10-NEXT:    add r3, r4, r3
 ; BE-32BIT-P10-NEXT:    lwz r12, 228(r1)
-; BE-32BIT-P10-NEXT:    mtocrf 32, r12
-; BE-32BIT-P10-NEXT:    mtocrf 16, r12
-; BE-32BIT-P10-NEXT:    mtocrf 8, r12
+; BE-32BIT-P10-NEXT:    mtcrf 56, r12
 ; BE-32BIT-P10-NEXT:    lfd f14, 304(r1) # 8-byte Folded Reload
 ; BE-32BIT-P10-NEXT:    lwz r31, 300(r1) # 4-byte Folded Reload
 ; BE-32BIT-P10-NEXT:    lwz r30, 296(r1) # 4-byte Folded Reload
@@ -1873,9 +1853,7 @@ define dso_local zeroext i32 @spill(ptr nocapture readonly %in) #0 {
 ; BE-32BIT-P9-NEXT:    lwz r14, 232(r1) # 4-byte Folded Reload
 ; BE-32BIT-P9-NEXT:    lfd f14, 304(r1) # 8-byte Folded Reload
 ; BE-32BIT-P9-NEXT:    lwz r0, 452(r1)
-; BE-32BIT-P9-NEXT:    mtocrf 32, r12
-; BE-32BIT-P9-NEXT:    mtocrf 16, r12
-; BE-32BIT-P9-NEXT:    mtocrf 8, r12
+; BE-32BIT-P9-NEXT:    mtcrf 56, r12
 ; BE-32BIT-P9-NEXT:    addi r1, r1, 448
 ; BE-32BIT-P9-NEXT:    mtlr r0
 ; BE-32BIT-P9-NEXT:    hashchk r0, -424(r1)
@@ -2022,9 +2000,7 @@ define dso_local zeroext i32 @spill(ptr nocapture readonly %in) #0 {
 ; BE-32BIT-P8-NEXT:    lwz r15, 236(r1) # 4-byte Folded Reload
 ; BE-32BIT-P8-NEXT:    lwz r14, 232(r1) # 4-byte Folded Reload
 ; BE-32BIT-P8-NEXT:    lwz r0, 452(r1)
-; BE-32BIT-P8-NEXT:    mtocrf 32, r12
-; BE-32BIT-P8-NEXT:    mtocrf 16, r12
-; BE-32BIT-P8-NEXT:    mtocrf 8, r12
+; BE-32BIT-P8-NEXT:    mtcrf 56, r12
 ; BE-32BIT-P8-NEXT:    addi r1, r1, 448
 ; BE-32BIT-P8-NEXT:    mtlr r0
 ; BE-32BIT-P8-NEXT:    hashchk r0, -424(r1)
@@ -2151,9 +2127,7 @@ define dso_local zeroext i32 @spill(ptr nocapture readonly %in) #0 {
 ; LE-P10-PRIV-NEXT:    lwz r12, 8(r1)
 ; LE-P10-PRIV-NEXT:    mtlr r0
 ; LE-P10-PRIV-NEXT:    hashchkp r0, -488(r1)
-; LE-P10-PRIV-NEXT:    mtocrf 32, r12
-; LE-P10-PRIV-NEXT:    mtocrf 16, r12
-; LE-P10-PRIV-NEXT:    mtocrf 8, r12
+; LE-P10-PRIV-NEXT:    mtcrf 56, r12
 ; LE-P10-PRIV-NEXT:    blr
 ;
 ; LE-P9-PRIV-LABEL: spill:
@@ -2278,9 +2252,7 @@ define dso_local zeroext i32 @spill(ptr nocapture readonly %in) #0 {
 ; LE-P9-PRIV-NEXT:    lwz r12, 8(r1)
 ; LE-P9-PRIV-NEXT:    mtlr r0
 ; LE-P9-PRIV-NEXT:    hashchkp r0, -488(r1)
-; LE-P9-PRIV-NEXT:    mtocrf 32, r12
-; LE-P9-PRIV-NEXT:    mtocrf 16, r12
-; LE-P9-PRIV-NEXT:    mtocrf 8, r12
+; LE-P9-PRIV-NEXT:    mtcrf 56, r12
 ; LE-P9-PRIV-NEXT:    blr
 ;
 ; LE-P8-PRIV-LABEL: spill:
@@ -2429,9 +2401,7 @@ define dso_local zeroext i32 @spill(ptr nocapture readonly %in) #0 {
 ; LE-P8-PRIV-NEXT:    lwz r12, 8(r1)
 ; LE-P8-PRIV-NEXT:    hashchkp r0, -488(r1)
 ; LE-P8-PRIV-NEXT:    mtlr r0
-; LE-P8-PRIV-NEXT:    mtocrf 32, r12
-; LE-P8-PRIV-NEXT:    mtocrf 16, r12
-; LE-P8-PRIV-NEXT:    mtocrf 8, r12
+; LE-P8-PRIV-NEXT:    mtcrf 56, r12
 ; LE-P8-PRIV-NEXT:    blr
 ;
 ; BE-P10-PRIV-LABEL: spill:
@@ -2556,9 +2526,7 @@ define dso_local zeroext i32 @spill(ptr nocapture readonly %in) #0 {
 ; BE-P10-PRIV-NEXT:    lwz r12, 8(r1)
 ; BE-P10-PRIV-NEXT:    mtlr r0
 ; BE-P10-PRIV-NEXT:    hashchkp r0, -488(r1)
-; BE-P10-PRIV-NEXT:    mtocrf 32, r12
-; BE-P10-PRIV-NEXT:    mtocrf 16, r12
-; BE-P10-PRIV-NEXT:    mtocrf 8, r12
+; BE-P10-PRIV-NEXT:    mtcrf 56, r12
 ; BE-P10-PRIV-NEXT:    blr
 ;
 ; BE-P9-PRIV-LABEL: spill:
@@ -2683,9 +2651,7 @@ define dso_local zeroext i32 @spill(ptr nocapture readonly %in) #0 {
 ; BE-P9-PRIV-NEXT:    lwz r12, 8(r1)
 ; BE-P9-PRIV-NEXT:    mtlr r0
 ; BE-P9-PRIV-NEXT:    hashchkp r0, -488(r1)
-; BE-P9-PRIV-NEXT:    mtocrf 32, r12
-; BE-P9-PRIV-NEXT:    mtocrf 16, r12
-; BE-P9-PRIV-NEXT:    mtocrf 8, r12
+; BE-P9-PRIV-NEXT:    mtcrf 56, r12
 ; BE-P9-PRIV-NEXT:    blr
 ;
 ; BE-P8-PRIV-LABEL: spill:
@@ -2834,9 +2800,7 @@ define dso_local zeroext i32 @spill(ptr nocapture readonly %in) #0 {
 ; BE-P8-PRIV-NEXT:    lwz r12, 8(r1)
 ; BE-P8-PRIV-NEXT:    hashchkp r0, -488(r1)
 ; BE-P8-PRIV-NEXT:    mtlr r0
-; BE-P8-PRIV-NEXT:    mtocrf 32, r12
-; BE-P8-PRIV-NEXT:    mtocrf 16, r12
-; BE-P8-PRIV-NEXT:    mtocrf 8, r12
+; BE-P8-PRIV-NEXT:    mtcrf 56, r12
 ; BE-P8-PRIV-NEXT:    blr
 entry:
   %local = alloca i32, align 4



More information about the llvm-commits mailing list