Do not generate duplicate dbg_value instructions for function arguments.
authorEvan Cheng <evan.cheng@apple.com>
Thu, 29 Apr 2010 01:40:30 +0000 (01:40 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Thu, 29 Apr 2010 01:40:30 +0000 (01:40 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@102585 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h

index cb933d7cdd5151b3248a87bf84ff9c419aeaeefd..38e0c29d98c7193822a224cc31345cb609a329a9 100644 (file)
@@ -3684,17 +3684,17 @@ static SDValue ExpandPowI(DebugLoc DL, SDValue LHS, SDValue RHS,
 /// EmitFuncArgumentDbgValue - If the DbgValueInst is a dbg_value of a function
 /// argument, create the corresponding DBG_VALUE machine instruction for it now.
 /// At the end of instruction selection, they will be inserted to the entry BB.
-void
+bool
 SelectionDAGBuilder::EmitFuncArgumentDbgValue(const DbgValueInst &DI,
                                               const Value *V, MDNode *Variable,
                                               uint64_t Offset, SDValue &N) {
   if (!isa<Argument>(V))
-    return;
+    return false;
 
   MachineFunction &MF = DAG.getMachineFunction();
   MachineBasicBlock *MBB = FuncInfo.MBBMap[DI.getParent()];
   if (MBB != &MF.front())
-    return;
+    return false;
 
   unsigned Reg = 0;
   if (N.getOpcode() == ISD::CopyFromReg) {
@@ -3710,13 +3710,14 @@ SelectionDAGBuilder::EmitFuncArgumentDbgValue(const DbgValueInst &DI,
   if (!Reg)
     Reg = FuncInfo.ValueMap[V];
   if (!Reg)
-    return;
+    return false;
 
   const TargetInstrInfo *TII = DAG.getTarget().getInstrInfo();
   MachineInstrBuilder MIB = BuildMI(MF, getCurDebugLoc(),
                                     TII->get(TargetOpcode::DBG_VALUE))
     .addReg(Reg).addImm(Offset).addMetadata(Variable);
   FuncInfo.ArgDbgValues.push_back(&*MIB);
+  return true;
 }
 
 /// visitIntrinsicCall - Lower the call to the specified intrinsic function.  If
@@ -3895,10 +3896,11 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
     } else {
       SDValue &N = NodeMap[V];
       if (N.getNode()) {
-        EmitFuncArgumentDbgValue(DI, V, Variable, Offset, N);
-        SDV = DAG.getDbgValue(Variable, N.getNode(),
-                              N.getResNo(), Offset, dl, SDNodeOrder);
-        DAG.AddDbgValue(SDV, N.getNode(), false);
+        if (!EmitFuncArgumentDbgValue(DI, V, Variable, Offset, N)) {
+          SDV = DAG.getDbgValue(Variable, N.getNode(),
+                                N.getResNo(), Offset, dl, SDNodeOrder);
+          DAG.AddDbgValue(SDV, N.getNode(), false);
+        }
       } else {
         // We may expand this to cover more cases.  One case where we have no
         // data available is an unreferenced parameter; we need this fallback.
index b07d70a4dabd02635daff9a247409fb779824527..f52c0e0b31e58b2cb9d26d37a75e119f755e747c 100644 (file)
@@ -502,7 +502,7 @@ private:
   /// function argument, create the corresponding DBG_VALUE machine instruction
   /// for it now. At the end of instruction selection, they will be inserted to
   /// the entry BB.
-  void EmitFuncArgumentDbgValue(const DbgValueInst &DI,
+  bool EmitFuncArgumentDbgValue(const DbgValueInst &DI,
                                 const Value *V, MDNode *Variable,
                                 uint64_t Offset, SDValue &N);
 };