- Use the "Fast" flag instead of "OptimizeForSize" to determine whether to emit
authorBill Wendling <isanbard@gmail.com>
Tue, 24 Feb 2009 02:35:30 +0000 (02:35 +0000)
committerBill Wendling <isanbard@gmail.com>
Tue, 24 Feb 2009 02:35:30 +0000 (02:35 +0000)
  a DBG_LABEL or not. We want to fall back to the original way of emitting debug
  info when we're in -O0/-fast mode.
- Add plumbing in to pass the "Fast" flag to places that need it.
- XFAIL DebugInfo/deaddebuglabel.ll. This is finding 11 labels instead of 8. I
  need to investigate still.

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

12 files changed:
include/llvm/CodeGen/DwarfWriter.h
include/llvm/CodeGen/SelectionDAG.h
lib/CodeGen/SelectionDAG/FastISel.cpp
lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp
lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
test/DebugInfo/2009-01-30-Method.ll
test/DebugInfo/deaddebuglabel.ll
test/DebugInfo/forwardDecl.ll
test/FrontendC++/2006-11-06-StackTrace.cpp
test/FrontendC++/2006-11-30-Pubnames.cpp
utils/TableGen/AsmWriterEmitter.cpp

index dc844e1fbf057bda2bc4e4dd889308549cc6f225..14fc89bf18ca3bdc4dfb379a091c3be2bfc566a1 100644 (file)
@@ -48,7 +48,10 @@ private:
   /// DE - Provides the DwarfWriter exception implementation.
   ///
   DwarfException *DE;
-  
+
+  /// FastCodeGen - True if generating code via the "fast" isel.
+  /// 
+  bool FastCodeGen;
 public:
   static char ID; // Pass identification, replacement for typeid
 
@@ -104,6 +107,9 @@ public:
   /// ShouldEmitDwarfDebug - Returns true if Dwarf debugging declarations should
   /// be emitted.
   bool ShouldEmitDwarfDebug() const;
+
+  bool getFastCodeGen() const { return FastCodeGen; }
+  void setFastCodeGen(bool Fast) { FastCodeGen = Fast; }
 };
 
 
index 5f3196a8b83d5b292b43400a46f99124faf426dc..32d9f420e0c653776053d18905cc65096605be5d 100644 (file)
@@ -216,7 +216,7 @@ public:
   ///
   /// Note that this is an involved process that may invalidate pointers into
   /// the graph.
-  void Legalize(bool TypesNeedLegalizing);
+  void Legalize(bool TypesNeedLegalizing, bool Fast);
 
   /// RemoveDeadNodes - This method deletes all unreachable nodes in the
   /// SelectionDAG.
index fb3d101f1221baf6285f82d8cbb4c1ff2c58c336..c1b93bf422dfa586fd256caf92d12938c6c5afe8 100644 (file)
@@ -370,6 +370,7 @@ bool FastISel::SelectCall(User *I) {
       unsigned Line = Subprogram.getLineNumber();
       unsigned LabelID = DW->RecordSourceLine(Line, 0, SrcFile);
       setCurDebugLoc(DebugLoc::get(MF.getOrCreateDebugLocID(SrcFile, Line, 0)));
+      DW->setFastCodeGen(true);
 
       if (DW->getRecordSourceLineCount() != 1) {
         const TargetInstrDesc &II = TII.get(TargetInstrInfo::DBG_LABEL);
index 0ab749638a89780f82259a1a3ee188594a158c91..3cfe4f47a0ed1d84df8024236d8e53998867cbb5 100644 (file)
@@ -56,6 +56,7 @@ class VISIBILITY_HIDDEN SelectionDAGLegalize {
   TargetLowering &TLI;
   SelectionDAG &DAG;
   bool TypesNeedLegalizing;
+  bool Fast;
 
   // Libcall insertion helpers.
 
@@ -137,7 +138,8 @@ class VISIBILITY_HIDDEN SelectionDAGLegalize {
   }
 
 public:
-  explicit SelectionDAGLegalize(SelectionDAG &DAG, bool TypesNeedLegalizing);
+  explicit SelectionDAGLegalize(SelectionDAG &DAG, bool TypesNeedLegalizing,
+                                bool fast);
 
   /// getTypeAction - Return how we should legalize values of this type, either
   /// it is already legal or we need to expand it into multiple registers of
@@ -362,9 +364,10 @@ SDNode *SelectionDAGLegalize::isShuffleLegal(MVT VT, SDValue Mask) const {
   return TLI.isShuffleMaskLegal(Mask, VT) ? Mask.getNode() : 0;
 }
 
-SelectionDAGLegalize::SelectionDAGLegalize(SelectionDAG &dag, bool types)
+SelectionDAGLegalize::SelectionDAGLegalize(SelectionDAG &dag,
+                                           bool types, bool fast)
   : TLI(dag.getTargetLoweringInfo()), DAG(dag), TypesNeedLegalizing(types),
-    ValueTypeActions(TLI.getValueTypeActions()) {
+    Fast(fast), ValueTypeActions(TLI.getValueTypeActions()) {
   assert(MVT::LAST_VALUETYPE <= 32 &&
          "Too many value types for ValueTypeActions to hold!");
 }
@@ -1289,9 +1292,8 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {
 
         unsigned Line = DSP->getLine();
         unsigned Col = DSP->getColumn();
-        const Function *F = DAG.getMachineFunction().getFunction();
 
-        if (!F->hasFnAttr(Attribute::OptimizeForSize)) {
+        if (Fast) {
           // A bit self-referential to have DebugLoc on Debug_Loc nodes, but it
           // won't hurt anything.
           if (useDEBUG_LOC) {
@@ -8640,9 +8642,9 @@ SDValue SelectionDAGLegalize::StoreWidenVectorOp(StoreSDNode *ST,
 
 // SelectionDAG::Legalize - This is the entry point for the file.
 //
-void SelectionDAG::Legalize(bool TypesNeedLegalizing) {
+void SelectionDAG::Legalize(bool TypesNeedLegalizing, bool Fast) {
   /// run - This is the main entry point to this class.
   ///
-  SelectionDAGLegalize(*this, TypesNeedLegalizing).LegalizeDAG();
+  SelectionDAGLegalize(*this, TypesNeedLegalizing, Fast).LegalizeDAG();
 }
 
index 4c73729834501b4e5636970705db4716c242b146..bc417138bfd928ef533718d45ac7751c8caac83f 100644 (file)
@@ -3915,6 +3915,7 @@ SelectionDAGLowering::visitIntrinsicCall(CallInst &I, unsigned Intrinsic) {
       if (Fast)
         DAG.setRoot(DAG.getLabel(ISD::DBG_LABEL, getCurDebugLoc(),
                                  getRoot(), LabelID));
+      DW->setFastCodeGen(Fast);
     }
 
     return 0;
@@ -3950,9 +3951,7 @@ SelectionDAGLowering::visitIntrinsicCall(CallInst &I, unsigned Intrinsic) {
       // create a label if this is a beginning of inlined function.
       unsigned Line = Subprogram.getLineNumber();
 
-      // FIXME: Support more than just -Os.
-      const Function *F = I.getParent()->getParent();
-      if (!F->hasFnAttr(Attribute::OptimizeForSize)) {
+      if (Fast) {
         unsigned LabelID = DW->RecordSourceLine(Line, 0, SrcFile);
         if (DW->getRecordSourceLineCount() != 1)
           DAG.setRoot(DAG.getLabel(ISD::DBG_LABEL, getCurDebugLoc(),
@@ -3966,8 +3965,7 @@ SelectionDAGLowering::visitIntrinsicCall(CallInst &I, unsigned Intrinsic) {
     return 0;
   }
   case Intrinsic::dbg_declare: {
-    const Function *F = I.getParent()->getParent();
-    if (!F->hasFnAttr(Attribute::OptimizeForSize)) {
+    if (Fast) {
       DwarfWriter *DW = DAG.getDwarfWriter();
       DbgDeclareInst &DI = cast<DbgDeclareInst>(I);
       Value *Variable = DI.getVariable();
index dc5f7d79f39f351e56d887c218ed26a0d059004e..e2b1c9edf38cdba90f8cd94036734b93418690ec 100644 (file)
@@ -621,9 +621,9 @@ void SelectionDAGISel::CodeGenAndEmitDAG() {
 
   if (TimePassesIsEnabled) {
     NamedRegionTimer T("DAG Legalization", GroupName);
-    CurDAG->Legalize(DisableLegalizeTypes);
+    CurDAG->Legalize(DisableLegalizeTypes, Fast);
   } else {
-    CurDAG->Legalize(DisableLegalizeTypes);
+    CurDAG->Legalize(DisableLegalizeTypes, Fast);
   }
   
   DOUT << "Legalized selection DAG:\n";
index 6b2a8b98ce6835c2ef77eb39a53ad60aeb782cad..c17dca1a920ef86e4850cb8b84271ceadbb27ee8 100644 (file)
@@ -1,4 +1,4 @@
-; RUN: llvm-as < %s | llc | grep "\\"foo" | count 3
+; RUN: llvm-as < %s | llc -fast | grep "\\"foo" | count 3
 ; 1 declaration, 1 definition and 1 pubnames entry.
 target triple = "i386-apple-darwin*"
        %llvm.dbg.anchor.type = type { i32, i32 }
index d183b8a6f26b04863f6908ce8317f8aedb73622f..5efa27a418eace25760f8432341a6867037e270f 100644 (file)
@@ -1,5 +1,6 @@
+; RUN: llvm-as < %s | llc -fast | grep "label" | count 8
 ; PR2614
-; RUN: llvm-as < %s | llc | grep "label" | count 8
+; XFAIL: *
 
 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-f80:32:32-v64:64:64-v128:128:128-a0:0:64"
 target triple = "i686-pc-linux-gnu"
index c918f32cfb11b038ea74ce57ec9aae07a1b1b1d4..f3e95dd588980de1602ec0970ca5d85e6fc1b4cf 100644 (file)
@@ -1,4 +1,4 @@
-; RUN: llvm-as < %s | llc | %prcontext ST 1 | grep 0x1 | count 1
+; RUN: llvm-as < %s | llc -fast | %prcontext ST 1 | grep 0x1 | count 1
 
 target triple = "i386-apple-darwin9.6"
        %llvm.dbg.anchor.type = type { i32, i32 }
index 55b34ad82d52385c06838a2cd17d7f69092c4e94..15c88df0d15ee6ff8809cffbefbde1c20dbc6f8d 100644 (file)
@@ -1,6 +1,7 @@
 // This is a regression test on debug info to make sure that we can get a
 // meaningful stack trace from a C++ program.
-// RUN: %llvmgcc -S -O0 -g %s -o - | llvm-as | llc --disable-fp-elim -o %t.s -f
+// RUN: %llvmgcc -S -O0 -g %s -o - | llvm-as | \
+// RUN:    llc --disable-fp-elim -o %t.s -f -fast -relocation-model=pic
 // RUN: %compile_c %t.s -o %t.o
 // RUN: %link %t.o -o %t.exe
 // RUN: echo {break DeepStack::deepest\nrun 17\nwhere\n} > %t.in 
index 8af99e37c989a1a7252ff06af5aabf8c1c4c44ee..b53d6aa734fe2c8e0e12724c7209f18e1891886e 100644 (file)
@@ -1,7 +1,7 @@
 // This is a regression test on debug info to make sure that we can access 
 // qualified global names.
 // RUN: %llvmgcc -S -O0 -g %s -o - | llvm-as | \
-// RUN:   llc --disable-fp-elim -o %t.s -f
+// RUN:   llc --disable-fp-elim -o %t.s -f -fast
 // RUN: %compile_c %t.s -o %t.o
 // RUN: %link %t.o -o %t.exe
 // RUN: %llvmdsymutil %t.exe 
index 06495d883414e0003f24fb80e723c59cbedbbc9d..128b89363b6c0fe6ff5911d0dd81e54452cc8c92 100644 (file)
@@ -641,7 +641,8 @@ void AsmWriterEmitter::run(std::ostream &O) {
   O << "\";\n\n";
 
   O << "  if (TAI->doesSupportDebugInformation() &&\n"
-    << "      DW->ShouldEmitDwarfDebug()) {\n"
+    << "      DW->ShouldEmitDwarfDebug() &&\n"
+    << "      !DW->getFastCodeGen()) {\n"
     << "    const MachineFunction *MF = MI->getParent()->getParent();\n"
     << "    DebugLoc CurDL = MI->getDebugLoc();\n\n"
     << "    if (!CurDL.isUnknown()) {\n"