<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Jun 10, 2015, at 8:16 PM, Keno Fischer <<a href="mailto:kfischer@college.harvard.edu" class="">kfischer@college.harvard.edu</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class="">Well, I found what the problem is, but I'm not really sure how to fix it properly.<div class=""><br class=""></div><div class="">Basically, the code for that function ends up looking like</div><div class=""><br class=""></div><div class=""><div class=""><span style="white-space:pre-wrap" class="">     </span>DBG_VALUE %RDI, %noreg, !"d", <<0x3cd2840>>; line no:59</div><div class=""><span style="white-space:pre-wrap" class="">      </span>DBG_VALUE %EDI, %noreg, !"d", <<0x3cd2840>>; line no:59</div><div class=""><span style="white-space:pre-wrap" class="">      </span>MOV32mr %RIP, 1, %noreg, <ga:@values>, %noreg, %EDI, %RDI<imp-use,kill>; mem:ST4[getelementptr inbounds ([50 x %struct.some_struct], [50 x %struct.some_struct]* @values, i64 0, i64 0, i32 0)](align=16)(tbaa=<0x3cdd0b8>) dbg:break1.c:59:43</div><div class=""><span style="white-space:pre-wrap" class="">   </span>RETQ; dbg:break1.c:59:48</div></div><div class=""><br class=""></div><div class="">so when we emit DWARF information we used to first emit an empty range for RDI and then have EDI cover the rest of the function. I see why the second DBG_VALUE was inserted by LLVM (the 32bit subregister could be a different one, so having that information could increase debug info coverage). I think the best way to fix this would be to implement the ability to represent values that are simultaneously in multiple places ( I want this for other reasons too, but it seems to me that that would fix this situation quite elegantly ).</div></div></div></blockquote><div><br class=""></div><div>IIRC, the “a value is present in only one place” is pretty fundamental to the way DbgValueHistoryCalculator works today. I totally agree this is broken, there is no reason why a new DBG_VALUE should end the lifetime of the preceding one for the same value (the pass tries to look at the underlying registers lifetime anyway).</div><div><br class=""></div><div>Fred </div><br class=""><blockquote type="cite" class=""><div class=""><div dir="ltr" class=""><div class=""> Basically what I had in mind is separating the notion of a value being present somewhere and having been given a new value. Right now DBG_VALUE is doing both, which is causing the current situation. If instead the code generator knew that `d` is present in both RDI and EDI, it could figure out the most optimal debug information for this function, which is that `d` is in RDI for the entire function. Anyway, I would like to discuss this and will bring it up in the llvmdev thread that Adrian was intending to start. For now, I'll put this change on ice until a proper solution is found.</div><div class="gmail_extra"><br class=""><div class="gmail_quote">On Tue, Jun 9, 2015 at 2:06 PM, David Blaikie <span dir="ltr" class=""><<a href="mailto:dblaikie@gmail.com" target="_blank" class="">dblaikie@gmail.com</a>></span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class=""><br class=""><div class="gmail_extra"><br class=""><div class="gmail_quote"><span class="">On Mon, Jun 8, 2015 at 9:05 PM, David Blaikie <span dir="ltr" class=""><<a href="mailto:dblaikie@gmail.com" target="_blank" class="">dblaikie@gmail.com</a>></span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr" class="">Looks like this might've caused:<br class=""><br class=""><a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__lab.llvm.org-3A8011_builders_clang-2Dx86-5F64-2Dubuntu-2Dgdb-2D75_builds_22562&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=0oGGOb6Hp5KjOM-NE05Xa2gS8lkl1d6kAE-t2drPTA0&s=Ale7iUh7_NXeUQkT2KQ43W-UfMYAyOS3alQ4GJ9ajpo&e=" target="_blank" class="">http://lab.llvm.org:8011/builders/clang-x86_64-ubuntu-gdb-75/builds/22562</a></div></blockquote></span><div class=""><br class="">Reverted in r239420 to hopefully get the buildbot back to green.<br class=""> </div><div class=""><div class=""><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr" class=""><br class=""></div><div class=""><div class=""><div class="gmail_extra"><br class=""><div class="gmail_quote">On Mon, Jun 8, 2015 at 6:54 PM, Keno Fischer <span dir="ltr" class=""><<a href="mailto:kfischer@college.harvard.edu" target="_blank" class="">kfischer@college.harvard.edu</a>></span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Author: kfischer<br class="">
Date: Mon Jun  8 20:53:59 2015<br class="">
New Revision: 239380<br class="">
<br class="">
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Frev-3D239380-26view-3Drev&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=0oGGOb6Hp5KjOM-NE05Xa2gS8lkl1d6kAE-t2drPTA0&s=vu9gKyh-8rePtm0iYu-JmU2boxqZaCVo7bEQEwurl4U&e=" target="_blank" class="">http://llvm.org/viewvc/llvm-project?rev=239380&view=rev</a><br class="">
Log:<br class="">
[DWARF] Fix a few corner cases in expression emission<br class="">
<br class="">
Summary: I noticed an object file with `DW_OP_reg4 DW_OP_breg4 0` as a DWARF expression,<br class="">
which I traced to a missing break (and `++I`) in this code snippet.<br class="">
While I was at it, I also added support for a few other corner cases<br class="">
along the same lines that I could think of.<br class="">
<br class="">
Test Plan: Hand-crafted test case to exercises these cases is included.<br class="">
<br class="">
Reviewers: echristo, dblaikie, aprantl<br class="">
<br class="">
Reviewed By: aprantl<br class="">
<br class="">
Subscribers: llvm-commits<br class="">
<br class="">
Differential Revision: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__reviews.llvm.org_D10302&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=0oGGOb6Hp5KjOM-NE05Xa2gS8lkl1d6kAE-t2drPTA0&s=yN1MPel33JTfhXBC4e6ldkyodavM-6R88DTxQvhIqBU&e=" target="_blank" class="">http://reviews.llvm.org/D10302</a><br class="">
<br class="">
Added:<br class="">
    llvm/trunk/test/DebugInfo/expressions.ll<br class="">
Modified:<br class="">
    llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp<br class="">
    llvm/trunk/lib/CodeGen/AsmPrinter/DwarfExpression.cpp<br class="">
    llvm/trunk/lib/CodeGen/AsmPrinter/DwarfExpression.h<br class="">
<br class="">
Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp<br class="">
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_lib_CodeGen_AsmPrinter_DwarfDebug.cpp-3Frev-3D239380-26r1-3D239379-26r2-3D239380-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=0oGGOb6Hp5KjOM-NE05Xa2gS8lkl1d6kAE-t2drPTA0&s=YuDRp23Sd7-JYCkHCeFseKb9puz_1gjB7r6pcdNeWXc&e=" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=239380&r1=239379&r2=239380&view=diff</a><br class="">
==============================================================================<br class="">
--- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (original)<br class="">
+++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Mon Jun  8 20:53:59 2015<br class="">
@@ -1562,6 +1562,8 @@ void DwarfDebug::emitDebugLoc() {<br class="">
     Asm->OutStreamer->EmitLabel(List.Label);<br class="">
     const DwarfCompileUnit *CU = List.CU;<br class="">
     for (const auto &Entry : DebugLocs.getEntries(List)) {<br class="">
+       if (Entry.BeginSym == Entry.EndSym)<br class="">
+        continue;<br class="">
       // Set up the range. This range is relative to the entry point of the<br class="">
       // compile unit. This is a hard coded 0 for low_pc when we're emitting<br class="">
       // ranges, or the DW_AT_low_pc on the compile unit otherwise.<br class="">
<br class="">
Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfExpression.cpp<br class="">
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_lib_CodeGen_AsmPrinter_DwarfExpression.cpp-3Frev-3D239380-26r1-3D239379-26r2-3D239380-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=0oGGOb6Hp5KjOM-NE05Xa2gS8lkl1d6kAE-t2drPTA0&s=yHmJ1JbiHuiDtu3thxi53mXvoHlOkhUS7-aLaOZ8shY&e=" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfExpression.cpp?rev=239380&r1=239379&r2=239380&view=diff</a><br class="">
==============================================================================<br class="">
--- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfExpression.cpp (original)<br class="">
+++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfExpression.cpp Mon Jun  8 20:53:59 2015<br class="">
@@ -65,6 +65,11 @@ void DwarfExpression::AddShr(unsigned Sh<br class="">
   EmitOp(dwarf::DW_OP_shr);<br class="">
 }<br class="">
<br class="">
+void DwarfExpression::AddOpStackValue() {<br class="">
+  if (DwarfVersion >= 4)<br class="">
+    EmitOp(dwarf::DW_OP_stack_value);<br class="">
+}<br class="">
+<br class="">
 bool DwarfExpression::AddMachineRegIndirect(unsigned MachineReg, int Offset) {<br class="">
   if (isFrameRegister(MachineReg)) {<br class="">
     // If variable offset is based in frame register then use fbreg.<br class="">
@@ -172,16 +177,14 @@ void DwarfExpression::AddSignedConstant(<br class="">
   // value, so the producers and consumers started to rely on heuristics<br class="">
   // to disambiguate the value vs. location status of the expression.<br class="">
   // See PR21176 for more details.<br class="">
-  if (DwarfVersion >= 4)<br class="">
-    EmitOp(dwarf::DW_OP_stack_value);<br class="">
+  AddOpStackValue();<br class="">
 }<br class="">
<br class="">
 void DwarfExpression::AddUnsignedConstant(unsigned Value) {<br class="">
   EmitOp(dwarf::DW_OP_constu);<br class="">
   EmitUnsigned(Value);<br class="">
   // cf. comment in DwarfExpression::AddSignedConstant().<br class="">
-  if (DwarfVersion >= 4)<br class="">
-    EmitOp(dwarf::DW_OP_stack_value);<br class="">
+  AddOpStackValue();<br class="">
 }<br class="">
<br class="">
 static unsigned getOffsetOrZero(unsigned OffsetInBits,<br class="">
@@ -212,15 +215,30 @@ bool DwarfExpression::AddMachineRegExpre<br class="">
                getOffsetOrZero(OffsetInBits, PieceOffsetInBits));<br class="">
   }<br class="">
   case dwarf::DW_OP_plus: {<br class="">
-    // [DW_OP_reg,Offset,DW_OP_plus,DW_OP_deref] --> [DW_OP_breg,Offset].<br class="">
     auto N = I.getNext();<br class="">
+    unsigned Offset = I->getArg(0);<br class="">
+    // First combine all DW_OP_plus until we hit either a DW_OP_deref or a<br class="">
+    // DW_OP_bit_piece<br class="">
+    while (N != E && N->getOp() == dwarf::DW_OP_plus) {<br class="">
+      Offset += N->getArg(0);<br class="">
+      ++I;<br class="">
+      N = I.getNext();<br class="">
+    }<br class="">
     if (N != E && N->getOp() == dwarf::DW_OP_deref) {<br class="">
-      unsigned Offset = I->getArg(0);<br class="">
+      // [DW_OP_reg,Offset,DW_OP_plus,DW_OP_deref] --> [DW_OP_breg,Offset].<br class="">
       ValidReg = AddMachineRegIndirect(MachineReg, Offset);<br class="">
       std::advance(I, 2);<br class="">
-      break;<br class="">
-    } else<br class="">
-      ValidReg = AddMachineRegPiece(MachineReg);<br class="">
+    } else {<br class="">
+      assert ((N == E) || (N->getOp() == dwarf::DW_OP_bit_piece));<br class="">
+      if (Offset == 0) {<br class="">
+        ValidReg = AddMachineRegPiece(MachineReg);<br class="">
+      } else {<br class="">
+        ValidReg = AddMachineRegIndirect(MachineReg, Offset);<br class="">
+        AddOpStackValue();<br class="">
+      }<br class="">
+      ++I;<br class="">
+    }<br class="">
+    break;<br class="">
   }<br class="">
   case dwarf::DW_OP_deref: {<br class="">
       // [DW_OP_reg,DW_OP_deref] --> [DW_OP_breg].<br class="">
@@ -237,6 +255,7 @@ bool DwarfExpression::AddMachineRegExpre<br class="">
<br class="">
   // Emit remaining elements of the expression.<br class="">
   AddExpression(I, E, PieceOffsetInBits);<br class="">
+<br class="">
   return true;<br class="">
 }<br class="">
<br class="">
<br class="">
Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfExpression.h<br class="">
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_lib_CodeGen_AsmPrinter_DwarfExpression.h-3Frev-3D239380-26r1-3D239379-26r2-3D239380-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=0oGGOb6Hp5KjOM-NE05Xa2gS8lkl1d6kAE-t2drPTA0&s=RajmMxzqJUENxKM33WStiCEGEtcMl9broelcepJ6WJE&e=" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfExpression.h?rev=239380&r1=239379&r2=239380&view=diff</a><br class="">
==============================================================================<br class="">
--- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfExpression.h (original)<br class="">
+++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfExpression.h Mon Jun  8 20:53:59 2015<br class="">
@@ -83,6 +83,9 @@ public:<br class="">
   bool AddMachineRegPiece(unsigned MachineReg, unsigned PieceSizeInBits = 0,<br class="">
                           unsigned PieceOffsetInBits = 0);<br class="">
<br class="">
+  /// Emit a DW_OP_stack_value<br class="">
+  void AddOpStackValue();<br class="">
+<br class="">
   /// Emit a signed constant.<br class="">
   void AddSignedConstant(int Value);<br class="">
   /// Emit an unsigned constant.<br class="">
<br class="">
Added: llvm/trunk/test/DebugInfo/expressions.ll<br class="">
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_test_DebugInfo_expressions.ll-3Frev-3D239380-26view-3Dauto&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=0oGGOb6Hp5KjOM-NE05Xa2gS8lkl1d6kAE-t2drPTA0&s=AH4RF06Nn2OQ7zbwrP0FWzhVQLzT9LWbwYJOs7HD08A&e=" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/expressions.ll?rev=239380&view=auto</a><br class="">
==============================================================================<br class="">
--- llvm/trunk/test/DebugInfo/expressions.ll (added)<br class="">
+++ llvm/trunk/test/DebugInfo/expressions.ll Mon Jun  8 20:53:59 2015<br class="">
@@ -0,0 +1,110 @@<br class="">
+; REQUIRES: object-emission<br class="">
+; RUN: %llc_dwarf -mtriple x86_64-apple-darwin14.0.0-elf -filetype=obj %s -o %t<br class="">
+; RUN: %llc_dwarf -mtriple x86_64-apple-darwin14.0.0-elf -O0 -filetype=obj %s -o %t0<br class="">
+; RUN: llvm-dwarfdump -debug-dump=loc %t | FileCheck %s<br class="">
+; RUN: llvm-dwarfdump -debug-dump=loc %t0 | FileCheck -check-prefix CHECK-O0 %s<br class="">
+<br class="">
+; CHECK: 0x00000000: Beginning address offset: 0x0000000000000000<br class="">
+; CHECK:                Ending address offset: 0x[[END:[0-9a-f]+]]<br class="">
+; CHECK:                 Location description:<br class="">
+; CHECK-NOT:                                   75 00 55<br class="">
+; CHECK-SAME:                                  55<br class="">
+; CHECK: 0x00000023: Beginning address offset: 0x0000000000000000<br class="">
+; CHECK:                Ending address offset: 0x{{.*}}[[END]]<br class="">
+; CHECK:                 Location description: 75 08 9f<br class="">
+; CHECK: 0x00000048: Beginning address offset: 0x0000000000000000<br class="">
+; CHECK:                Ending address offset: 0x{{.*}}[[END]]<br class="">
+; CHECK:                 Location description: 75 10 9f<br class="">
+; CHECK: 0x0000006d: Beginning address offset: 0x0000000000000000<br class="">
+; CHECK:                Ending address offset: 0x{{.*}}[[END]]<br class="">
+; CHECK:                 Location description: 75 18<br class="">
+<br class="">
+<br class="">
+; CHECK-O0: 0x00000000: Beginning address offset: 0x0000000000000000<br class="">
+; CHECK-O0:                Ending address offset: 0x000000000000001b<br class="">
+; CHECK-O0:                 Location description: 55<br class="">
+; CHECK-O0:             Beginning address offset: 0x000000000000001b<br class="">
+; CHECK-O0:                Ending address offset: 0x0000000000000024<br class="">
+; CHECK-O0:                 Location description: 54<br class="">
+; CHECK-O0:             Beginning address offset: 0x0000000000000024<br class="">
+; CHECK-O0:                Ending address offset: 0x0000000000000025<br class="">
+; CHECK-O0:                 Location description: 77 78 23 00<br class="">
+; CHECK-O0: 0x0000004c: Beginning address offset: 0x0000000000000000<br class="">
+; CHECK-O0:                Ending address offset: 0x000000000000001b<br class="">
+; CHECK-O0:                 Location description: 75 08 9f<br class="">
+; CHECK-O0:             Beginning address offset: 0x000000000000001b<br class="">
+; CHECK-O0:                Ending address offset: 0x0000000000000024<br class="">
+; CHECK-O0:                 Location description: 74 08 9f<br class="">
+; CHECK-O0:             Beginning address offset: 0x0000000000000024<br class="">
+; CHECK-O0:                Ending address offset: 0x0000000000000025<br class="">
+; CHECK-O0:                 Location description: 77 78 23 08<br class="">
+; CHECK-O0: 0x0000009c: Beginning address offset: 0x0000000000000000<br class="">
+; CHECK-O0:                Ending address offset: 0x000000000000001b<br class="">
+; CHECK-O0:                 Location description: 75 10 9f<br class="">
+; CHECK-O0:             Beginning address offset: 0x000000000000001b<br class="">
+; CHECK-O0:                Ending address offset: 0x0000000000000024<br class="">
+; CHECK-O0:                 Location description: 74 10 9f<br class="">
+; CHECK-O0:             Beginning address offset: 0x0000000000000024<br class="">
+; CHECK-O0:                Ending address offset: 0x0000000000000025<br class="">
+; CHECK-O0:                 Location description: 77 78 23 08 23 08<br class="">
+; CHECK-O0: 0x000000ee: Beginning address offset: 0x0000000000000000<br class="">
+; CHECK-O0:                Ending address offset: 0x000000000000001b<br class="">
+; CHECK-O0:                 Location description: 75 18<br class="">
+; CHECK-O0:             Beginning address offset: 0x000000000000001b<br class="">
+; CHECK-O0:                Ending address offset: 0x0000000000000024<br class="">
+; CHECK-O0:                 Location description: 74 18<br class="">
+; CHECK-O0:             Beginning address offset: 0x0000000000000024<br class="">
+; CHECK-O0:                Ending address offset: 0x0000000000000025<br class="">
+; CHECK-O0:                 Location description: 77 78 23 10 23 08 06<br class="">
+<br class="">
+declare void @llvm.dbg.value(metadata, i64, metadata, metadata) #0<br class="">
+<br class="">
+define float @foo(float* %args, float *%args2)<br class="">
+{<br class="">
+    call void @llvm.dbg.value(metadata float* %args, i64 0, metadata !11, metadata !12), !dbg !19<br class="">
+    call void @llvm.dbg.value(metadata float* %args, i64 0, metadata !13, metadata !14), !dbg !19<br class="">
+    call void @llvm.dbg.value(metadata float* %args, i64 0, metadata !15, metadata !16), !dbg !19<br class="">
+    call void @llvm.dbg.value(metadata float* %args, i64 0, metadata !17, metadata !18), !dbg !19<br class="">
+    %a = load float, float* %args, !dbg !19<br class="">
+    %bptr = getelementptr float, float* %args, i32 1, !dbg !19<br class="">
+    %b = load float, float* %bptr, !dbg !19<br class="">
+    %cptr = getelementptr float, float* %args, i32 2, !dbg !19<br class="">
+    %c = load float, float* %cptr, !dbg !19<br class="">
+    %dptr = getelementptr float, float* %args, i32 3, !dbg !19<br class="">
+    %d = load float, float* %dptr, !dbg !19<br class="">
+    %ret1 = fadd float %a, %b, !dbg !19<br class="">
+    %ret2 = fadd float %c, %d, !dbg !19<br class="">
+    call void @llvm.dbg.value(metadata float* %args2, i64 0, metadata !11, metadata !12), !dbg !19<br class="">
+    call void @llvm.dbg.value(metadata float* %args2, i64 0, metadata !13, metadata !14), !dbg !19<br class="">
+    call void @llvm.dbg.value(metadata float* %args2, i64 0, metadata !15, metadata !16), !dbg !19<br class="">
+    call void @llvm.dbg.value(metadata float* %args2, i64 0, metadata !17, metadata !18), !dbg !19<br class="">
+    %ret  = fsub float %ret1, %ret2, !dbg !19<br class="">
+    ret float %ret, !dbg !19<br class="">
+}<br class="">
+<br class="">
+attributes #0 = { nounwind readnone }<br class="">
+<br class="">
+!llvm.module.flags = !{!0, !1}<br class="">
+!<a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.dbg.cu&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=0oGGOb6Hp5KjOM-NE05Xa2gS8lkl1d6kAE-t2drPTA0&s=0O149Lfck9oiYPzb4rRQC0eNFvJwnhYBQHneqGH2gHQ&e=" target="_blank" class="">llvm.dbg.cu</a> = !{!2}<br class="">
+<br class="">
+!0 = !{i32 2, !"Dwarf Version", i32 4}<br class="">
+!1 = !{i32 1, !"Debug Info Version", i32 3}<br class="">
+<br class="">
+!2 = !DICompileUnit(language: DW_LANG_C89, file: !3, producer: "byHand", isOptimized: true, runtimeVersion: 0, emissionKind: 1, enums: !4, retainedTypes: !4, subprograms: !5, globals: !4, imports: !4)<br class="">
+!3 = !DIFile(filename: "expressions", directory: ".")<br class="">
+!4 = !{}<br class="">
+!5 = !{!6}<br class="">
+!6 = !DISubprogram(name: "foo", linkageName: "foo", scope: null, file: !3, type: !7, isLocal: false, isDefinition: true, isOptimized: true, function: float (float*, float*)* @foo, variables: !4)<br class="">
+!7 = !DISubroutineType(types: !8)<br class="">
+!8 = !{!10, !10}<br class="">
+!9 = !DIBasicType(name: "float", size: 4, align: 4, encoding: DW_ATE_float)<br class="">
+!10 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !9, size: 64, align: 64)<br class="">
+!11 = !DILocalVariable(tag: DW_TAG_arg_variable, name: "a", arg: 1, scope: !6, file: !3, line: 1, type: !10)<br class="">
+!12 = !DIExpression(DW_OP_plus, 0)<br class="">
+!13 = !DILocalVariable(tag: DW_TAG_arg_variable, name: "b", arg: 2, scope: !6, file: !3, line: 1, type: !10)<br class="">
+!14 = !DIExpression(DW_OP_plus, 8)<br class="">
+!15 = !DILocalVariable(tag: DW_TAG_arg_variable, name: "c", arg: 3, scope: !6, file: !3, line: 1, type: !10)<br class="">
+!16 = !DIExpression(DW_OP_plus, 8, DW_OP_plus, 8)<br class="">
+!17 = !DILocalVariable(tag: DW_TAG_arg_variable, name: "d", arg: 4, scope: !6, file: !3, line: 1, type: !9)<br class="">
+!18 = !DIExpression(DW_OP_plus, 16, DW_OP_plus, 8, DW_OP_deref)<br class="">
+!19 = !DILocation(line: 1, scope: !6)<br class="">
<br class="">
<br class="">
_______________________________________________<br class="">
llvm-commits mailing list<br class="">
<a href="mailto:llvm-commits@cs.uiuc.edu" target="_blank" class="">llvm-commits@cs.uiuc.edu</a><br class="">
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank" class="">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br class="">
</blockquote></div><br class=""></div>
</div></div></blockquote></div></div></div><br class=""></div></div>
</blockquote></div><br class=""></div></div>
_______________________________________________<br class="">llvm-commits mailing list<br class=""><a href="mailto:llvm-commits@cs.uiuc.edu" class="">llvm-commits@cs.uiuc.edu</a><br class="">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits<br class=""></div></blockquote></div><br class=""></body></html>