Make the NDEBUG assertion stronger and more clear what is
authorChris Lattner <sabre@nondot.org>
Thu, 25 Mar 2010 05:40:48 +0000 (05:40 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 25 Mar 2010 05:40:48 +0000 (05:40 +0000)
happening.

Enhance scheduling to set the DEAD flag on implicit defs
more aggressively.  Before, we'd set an implicit def operand
to dead if it were present in the SDNode corresponding to
the machineinstr but had no use.  Now we do it in this case
AND if the implicit def does not exist in the SDNode at all.

This exposes a couple of problems: one is the FIXME, which
causes a live intervals crash on CodeGen/X86/sibcall.ll.
The second is that it makes machinecse and licm more
aggressive (which is a good thing) but also exposes a case
where licm hoists a set0 and then it doesn't get resunk.

Talking to codegen folks about both these issues, but I need
this patch in in the meantime.

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

lib/CodeGen/SelectionDAG/InstrEmitter.cpp
test/CodeGen/X86/2007-01-13-StackPtrIndex.ll
test/CodeGen/X86/2009-02-26-MachineLICMBug.ll
test/CodeGen/X86/coalesce-esp.ll
test/CodeGen/X86/licm-symbol.ll
test/CodeGen/X86/phys_subreg_coalesce-2.ll
test/CodeGen/X86/pr2659.ll

index 610536fec667f6ba93961f251ac81019388a6d8b..e86a18dc2b4b83db221b7990d37927e88e64c07b 100644 (file)
@@ -578,13 +578,16 @@ EmitMachineNode(SDNode *Node, bool IsClone, bool IsCloned,
   const TargetInstrDesc &II = TII->get(Opc);
   unsigned NumResults = CountResults(Node);
   unsigned NodeOperands = CountOperands(Node);
-  bool HasPhysRegOuts = (NumResults > II.getNumDefs()) &&
-                        II.getImplicitDefs() != 0;
+  bool HasPhysRegOuts = NumResults > II.getNumDefs() && II.getImplicitDefs()!=0;
 #ifndef NDEBUG
   unsigned NumMIOperands = NodeOperands + NumResults;
-  assert((II.getNumOperands() == NumMIOperands ||
-          HasPhysRegOuts || II.isVariadic()) &&
-         "#operands for dag node doesn't match .td file!"); 
+  if (II.isVariadic())
+    assert(NumMIOperands >= II.getNumOperands() &&
+           "Too few operands for a variadic node!");
+  else
+    assert(NumMIOperands >= II.getNumOperands() &&
+           NumMIOperands <= II.getNumOperands()+II.getNumImplicitDefs() &&
+           "#operands for dag node doesn't match .td file!");
 #endif
 
   // Create the new machine instruction.
@@ -632,6 +635,18 @@ EmitMachineNode(SDNode *Node, bool IsClone, bool IsCloned,
         MI->addRegisterDead(Reg, TRI);
     }
   }
+  
+  // If the instruction has implicit defs and the node doesn't, mark the
+  // implicit def as dead.  If the node has any flag outputs, we don't do this
+  // because we don't know what implicit defs are being used by flagged nodes.
+  if (Node->getValueType(Node->getNumValues()-1) != MVT::Flag &&
+      // FIXME: This is a terrible hackaround for a liveintervals bug.
+      II.getNumImplicitDefs() < 8)
+    if (const unsigned *IDList = II.getImplicitDefs()) {
+      for (unsigned i = NumResults, e = II.getNumDefs()+II.getNumImplicitDefs();
+           i != e; ++i)
+        MI->addRegisterDead(IDList[i-II.getNumDefs()], TRI);
+    }
   return;
 }
 
index 5e7c0a7ee2b732cac40a1d923b6753f0525c5b87..a2288986362e5dc34924895fdb88326b8671b9c0 100644 (file)
@@ -1,5 +1,4 @@
 ; RUN: llc < %s -march=x86-64 > %t
-; RUN: grep leaq %t
 ; RUN: not grep {,%rsp)} %t
 ; PR1103
 
index a4d642b40354f864cbaee0efd15ff8944c5f470d..ae723f0c299eebc5f72d5d3cb5f1c09f4518b559 100644 (file)
@@ -1,4 +1,4 @@
-; RUN: llc < %s -march=x86-64 -mattr=+sse3 -stats |& not grep {machine-licm}
+; RUN: llc < %s -march=x86-64 -mattr=+sse3 -stats |& grep {2 machine-licm}
 ; rdar://6627786
 
 target triple = "x86_64-apple-darwin10.0"
index 0fe4e56c97cab862c34488e9706543515db8f722..e0f2796f9dce906a7e5ed00521c1e19bf52ed1a9 100644 (file)
@@ -1,4 +1,4 @@
-; RUN: llc < %s | grep {movl   %esp, %eax}
+; RUN: llc < %s | grep {movl   %esp, %ecx}
 ; PR4572
 
 ; Don't coalesce with %esp if it would end up putting %esp in
index d61bbfccbc96e812327934ab492bb7086cbef4a4..08306c2950e23549dbcc79c3843b80545d50a95e 100644 (file)
@@ -3,7 +3,7 @@
 ; MachineLICM should be able to hoist the sF reference out of the loop.
 
 ; CHECK: pushl %esi
-; CHECK: subl  $8, %esp
+; CHECK: subl  $4, %esp
 ; CHECK: movl  $176, %esi
 ; CHECK: addl  L___sF$non_lazy_ptr, %esi
 ; CHECK: .align  4, 0x90
index 23c509c9936bd251e9da5d09834990608d4ab29c..60ec2645c28b412e6a9c8c99a60a4c14a66391f5 100644 (file)
@@ -1,4 +1,4 @@
-; RUN: llc < %s -march=x86 | grep mov | count 5
+; RUN: llc < %s -march=x86 | grep mov | count 6
 ; PR2659
 
 define i32 @binomial(i32 %n, i32 %k) nounwind {
index 0760e4c7fd5b428b04dad09a13f6818cb7cd9e7f..01bb9f14f64183225c50d5697b3b2d577b43e1d4 100644 (file)
@@ -1,4 +1,4 @@
-; RUN: llc < %s -march=x86 -mtriple=i686-apple-darwin9.4.0 | grep movl | count 5
+; RUN: llc < %s -march=x86 -mtriple=i686-apple-darwin9.4.0 | grep movl | count 6
 ; PR2659
 
 target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128"