]> granicus.if.org Git - llvm/commitdiff
Add test case for r311511
authorMatthias Braun <matze@braunis.de>
Wed, 23 Aug 2017 03:17:59 +0000 (03:17 +0000)
committerMatthias Braun <matze@braunis.de>
Wed, 23 Aug 2017 03:17:59 +0000 (03:17 +0000)
This also changes the TailDuplicator to be configured explicitely
pre/post regalloc rather than relying on the isSSA() flag. This was
necessary to have `llc -run-pass` work reliably.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@311520 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/TailDuplicator.h
lib/CodeGen/MachineBlockPlacement.cpp
lib/CodeGen/TailDuplication.cpp
lib/CodeGen/TailDuplicator.cpp
test/CodeGen/ARM/tail-dup-bundle.mir [new file with mode: 0644]

index 483c0ab1eec9e1e77fad7bc6560778e10cd3f536..e5f110293c33098806ecbe45bf32ddc42996da79 100644 (file)
@@ -61,13 +61,14 @@ class TailDuplicator {
 public:
   /// Prepare to run on a specific machine function.
   /// @param MF - Function that will be processed
+  /// @param PreRegAlloc - true if used before register allocation
   /// @param MBPI - Branch Probability Info. Used to propagate correct
   ///     probabilities when modifying the CFG.
   /// @param LayoutMode - When true, don't use the existing layout to make
   ///     decisions.
   /// @param TailDupSize - Maxmimum size of blocks to tail-duplicate. Zero
   ///     default implies using the command line value TailDupSize.
-  void initMF(MachineFunction &MF,
+  void initMF(MachineFunction &MF, bool PreRegAlloc,
               const MachineBranchProbabilityInfo *MBPI,
               bool LayoutMode, unsigned TailDupSize = 0);
 
index 65330308dad1230a5b8b70c20492078ec4615fd3..c30f306a169c553cf13ec996dd7c161283d064af 100644 (file)
@@ -2729,7 +2729,8 @@ bool MachineBlockPlacement::runOnMachineFunction(MachineFunction &MF) {
     MPDT = &getAnalysis<MachinePostDominatorTree>();
     if (MF.getFunction()->optForSize())
       TailDupSize = 1;
-    TailDup.initMF(MF, MBPI, /* LayoutMode */ true, TailDupSize);
+    bool PreRegAlloc = false;
+    TailDup.initMF(MF, PreRegAlloc, MBPI, /* LayoutMode */ true, TailDupSize);
     precomputeTriangleChains();
   }
 
index 489a607eb1764918a79bdbb33f6fa3dbce08aba2..131b9a22768e328922a713ad4590718236eabdf7 100644 (file)
@@ -52,7 +52,10 @@ bool TailDuplicatePass::runOnMachineFunction(MachineFunction &MF) {
 
   auto MBPI = &getAnalysis<MachineBranchProbabilityInfo>();
 
-  Duplicator.initMF(MF, MBPI, /* LayoutMode */ false);
+  // TODO: Querying isSSA() to determine pre-/post-regalloc is fragile, better
+  // split this into two passes instead.
+  bool PreRegAlloc = MF.getRegInfo().isSSA();
+  Duplicator.initMF(MF, PreRegAlloc, MBPI, /* LayoutMode */ false);
 
   bool MadeChange = false;
   while (Duplicator.tailDuplicateBlocks())
index 0f22040f3aec5e292828225642e32c26ef0a7b65..bd3a20f936d824aa841cd2857af1cef1c806ef83 100644 (file)
@@ -75,7 +75,7 @@ static cl::opt<bool>
 static cl::opt<unsigned> TailDupLimit("tail-dup-limit", cl::init(~0U),
                                       cl::Hidden);
 
-void TailDuplicator::initMF(MachineFunction &MFin,
+void TailDuplicator::initMF(MachineFunction &MFin, bool PreRegAlloc,
                             const MachineBranchProbabilityInfo *MBPIin,
                             bool LayoutModeIn, unsigned TailDupSizeIn) {
   MF = &MFin;
@@ -89,7 +89,7 @@ void TailDuplicator::initMF(MachineFunction &MFin,
   assert(MBPI != nullptr && "Machine Branch Probability Info required");
 
   LayoutMode = LayoutModeIn;
-  PreRegAlloc = MRI->isSSA();
+  this->PreRegAlloc = PreRegAlloc;
 }
 
 static void VerifyPHIs(MachineFunction &MF, bool CheckExtra) {
diff --git a/test/CodeGen/ARM/tail-dup-bundle.mir b/test/CodeGen/ARM/tail-dup-bundle.mir
new file mode 100644 (file)
index 0000000..67c1cb5
--- /dev/null
@@ -0,0 +1,36 @@
+# RUN: llc -o - %s -run-pass=block-placement -mtriple=thumbv7k-apple-ios8.0.0 -verify-machineinstrs -O3 | FileCheck %s
+---
+# CHECK-LABEL: name: func
+# Make sure the bundle gets duplicated correctly
+# CHECK: BUNDLE implicit-def dead %itstate, implicit-def %cpsr, implicit killed %r0, implicit killed %cpsr {
+# CHECK:   t2IT 1, 24, implicit-def %itstate
+# CHECK:   t2CMPri killed %r0, 9, 1, killed %cpsr, implicit-def %cpsr, implicit internal killed %itstate
+# CHECK: }
+# CHECK: BUNDLE implicit-def dead %itstate, implicit-def %cpsr, implicit killed %r0, implicit killed %cpsr {
+# CHECK:   t2IT 1, 24, implicit-def %itstate
+# CHECK:   t2CMPri killed %r0, 9, 1, killed %cpsr, implicit-def %cpsr, implicit internal killed %itstate
+# CHECK: }
+name: func
+tracksRegLiveness: true
+body: |
+  bb.0:
+    liveins: %r0, %lr, %r7
+
+  bb.1:
+    liveins: %r0
+
+    t2CMPri %r0, 32, 14, _, implicit-def %cpsr
+    BUNDLE implicit-def dead %itstate, implicit-def %cpsr, implicit killed %r0, implicit killed %cpsr {
+      t2IT 1, 24, implicit-def %itstate
+      t2CMPri killed %r0, 9, 1, killed %cpsr, implicit-def %cpsr, implicit internal killed %itstate
+    }
+    t2Bcc %bb.3, 1, killed %cpsr
+
+  bb.2:
+    %r0 = IMPLICIT_DEF
+    t2B %bb.1, 14, _
+
+  bb.3:
+    %r0 = IMPLICIT_DEF
+    t2B %bb.1, 14, _
+...