<html><body><div style="color:#000; background-color:#fff; font-family:Courier New, courier, monaco, monospace, sans-serif;font-size:10pt"><div style="RIGHT: auto">Hi All,</div>
<div style="RIGHT: auto"> </div>
<div style="RIGHT: auto">For the test snippet below, </div>
<div style="RIGHT: auto">int func(int dd, int ds, int *rm)<BR>{<BR>  int d_sn = 0;<BR>  int dv_sn = 0;<BR style="RIGHT: auto">  unsigned int d, r;</div>
<div style="BACKGROUND-COLOR: transparent; FONT-STYLE: normal; FONT-FAMILY: Courier New, courier, monaco, monospace, sans-serif; COLOR: rgb(0,0,0); FONT-SIZE: 13px; RIGHT: auto">  if (dd < 0) { d_sn = 1; dd = -dd; };<BR>  if (ds < 0) { dv_sn = 1; ds = -ds ; };</div>
<div style="BACKGROUND-COLOR: transparent; FONT-STYLE: normal; FONT-FAMILY: Courier New, courier, monaco, monospace, sans-serif; COLOR: rgb(0,0,0); FONT-SIZE: 13px; RIGHT: auto"> </div>
<div style="RIGHT: auto">  d = func1( dd, ds, &r);</div>
<div style="RIGHT: auto"> </div>
<div style="RIGHT: auto">  if (d_sn && dv_sn){ r = -r;}<BR>  else if (d_sn) { d = -d; r = -r; }<VAR id=yui-ie-cursor></VAR><BR>  else if (dv_sn) { d = -d; };</div>
<div style="RIGHT: auto"> </div>
<div style="RIGHT: auto">  if (rm) { *rm = (signed int)r; }<BR>  return (signed int)d;<BR>}<BR></div>
<div style="RIGHT: auto">My observations for the generated .ll are (I am using llvm3.1):</div>
<div style="RIGHT: auto">1. Due to 'instruction combining' optimization which does 'LowerDbgDeclare' call, I get a lot of 'llvm.dbg.value' instruction for r inserted, which converts 'load with llvm.dbg.declare' to addition of llvm.dbg.value.  Is it ok to get such a behavior or I am wrong in my analysis? Please correct me.</div>
<div style="RIGHT: auto"> </div>
<div style="RIGHT: auto">2. I referred a link below, which talks of a patch provided for such a behavior. </div>
<div style="RIGHT: auto"><A style="RIGHT: auto" href="http://permalink.gmane.org/gmane.comp.compilers.llvm.cvs/142570"><FONT style="RIGHT: auto" color=#0066cc>http://permalink.gmane.org/gmane.comp.compilers.llvm.cvs/142570</FONT></A></div>
<div style="RIGHT: auto">Can I get access to the patch to try on my test ? Or is it concerned with something different?</div>
<div style="RIGHT: auto"> </div>
<div style="RIGHT: auto">3. The implication of this behavior is that when I try to get the lexicalscope for variable r, it shows be 4 declaration of 'variable r' in the parent scope. I am expect only 1 declaration. I feel the addition of dbg.declare in other basic blocks is leading to this.</div>
<div style="RIGHT: auto"> </div>
<div style="RIGHT: auto"> </div>
<div style="RIGHT: auto"> </div>
<div style="RIGHT: auto">Generated .ll :</div>
<div style="RIGHT: auto">define i32 @func(i32 %dd, i32 %ds, i32* %rm) nounwind {<BR>entry:<BR>  %r = alloca i32, align 4<BR>  call void @llvm.dbg.value(metadata !{i32 %dd}, i64 0, metadata !13), !dbg !14<BR>  call void @llvm.dbg.value(metadata !{i32 %ds}, i64 0, metadata !15), !dbg !16<BR>  call void @llvm.dbg.value(metadata !{i32* %rm}, i64 0, metadata !17), !dbg !18<BR>  call void @llvm.dbg.value(metadata !2, i64 0, metadata !19), !dbg !21<BR>  call void @llvm.dbg.value(metadata !2, i64 0, metadata !22), !dbg !23<BR>  call void @llvm.dbg.declare(metadata !{i32* %r}, metadata !24), !dbg !26<BR>  %cmp = icmp slt i32 %dd, 0, !dbg !27<BR>  %sub = sub nsw i32 0, %dd, !dbg !28<BR>  %sub.dd = select i1 %cmp, i32 %sub, i32 %dd, !dbg !27<BR>  %cmp1 = icmp slt i32 %ds, 0, !dbg !30<BR>  call void @llvm.dbg.value(metadata !31, i64 0, metadata !22), !dbg !32<BR>  %sub3 = sub nsw i32 0, %ds, !dbg
 !34<BR>  call void @llvm.dbg.value(metadata !{i32 %sub3}, i64 0, metadata !15), !dbg !34<BR>  %ds.addr.0 = select i1 %cmp1, i32 %sub3, i32 %ds, !dbg !30<BR>  %call = call i32 bitcast (i32 (...)* @func1 to i32 (i32, i32, i32*)*)(i32 %sub.dd, i32 %ds.addr.0, i32* %r) nounwind, !dbg !<BR>  call void @llvm.dbg.value(metadata !{i32 %call}, i64 0, metadata !36), !dbg !35<BR>  %0 = and i32 %dd, %ds, !dbg !37<BR>  %1 = icmp slt i32 %0, 0, !dbg !37<BR>  br i1 %1, label %if.then6, label %if.else, !dbg !37</div>
<div style="RIGHT: auto">if.then6:                                         ; preds = %entry<BR>  call void @llvm.dbg.value(metadata !{i32* %r}, i64 0, metadata !24), !dbg !38<BR>  call void @llvm.dbg.value(metadata !{i32* %r}, i64 0, metadata !24), !dbg !38<BR>  call void @llvm.dbg.value(metadata !{i32* %r}, i64 0, metadata !24), !dbg !38<BR>  call void @llvm.dbg.value(metadata !{i32* %r}, i64 0, metadata !24), !dbg !38<BR>  call void @llvm.dbg.value(metadata !{i32* %r}, i64 0, metadata !24), !dbg !38<BR>  %2 = load i32* %r, align 4, !dbg !38<BR>  %sub7 = sub i32 0, %2, !dbg !38<BR>  call void @llvm.dbg.value(metadata !{i32 %sub7}, i64 0, metadata !24), !dbg !38<BR>  call void @llvm.dbg.value(metadata !{i32
 %sub7}, i64 0, metadata !24), !dbg !38<BR>  call void @llvm.dbg.value(metadata !{i32 %sub7}, i64 0, metadata !24), !dbg !38<BR>  call void @llvm.dbg.value(metadata !{i32 %sub7}, i64 0, metadata !24), !dbg !38<BR>  call void @llvm.dbg.value(metadata !{i32 %sub7}, i64 0, metadata !24), !dbg !38<BR>  store i32 %sub7, i32* %r, align 4, !dbg !38<BR>  br label %if.end18, !dbg !40</div>
<div style="RIGHT: auto">if.else:                                          ; preds = %entry<BR>  %sub10 = sub i32 0, %call, !dbg !41<BR>  br i1 %cmp, label %if.then9, label %if.else12, !dbg !43<BR>if.then9:                                         ; preds = %if.else<BR>  call void @llvm.dbg.value(metadata !{i32 %sub10}, i64 0, metadata !36), !dbg !41<BR>  call void @llvm.dbg.value(metadata !{i32* %r}, i64 0, metadata !24), !dbg !44<BR>  call void @llvm.dbg.value(metadata !{i32* %r}, i64 0, metadata !24), !dbg !44<BR>  call void
 @llvm.dbg.value(metadata !{i32* %r}, i64 0, metadata !24), !dbg !44<BR>  call void @llvm.dbg.value(metadata !{i32* %r}, i64 0, metadata !24), !dbg !44<BR>  call void @llvm.dbg.value(metadata !{i32* %r}, i64 0, metadata !24), !dbg !44<BR>  %3 = load i32* %r, align 4, !dbg !44<BR>  %sub11 = sub i32 0, %3, !dbg !44<BR>  call void @llvm.dbg.value(metadata !{i32 %sub11}, i64 0, metadata !24), !dbg !44<BR>  call void @llvm.dbg.value(metadata !{i32 %sub11}, i64 0, metadata !24), !dbg !44<BR>  call void @llvm.dbg.value(metadata !{i32 %sub11}, i64 0, metadata !24), !dbg !44<BR>  call void @llvm.dbg.value(metadata !{i32 %sub11}, i64 0, metadata !24), !dbg !44<BR>  call void @llvm.dbg.value(metadata !{i32 %sub11}, i64 0, metadata !24), !dbg !44<BR>  store i32 %sub11, i32* %r, align 4, !dbg !44<BR>  br label %if.end18, !dbg !45</div>
<div style="RIGHT: auto">if.else12:                                        ; preds = %if.else<BR>  %sub15.call = select i1 %cmp1, i32 %sub10, i32 %call, !dbg !46<BR>  br label %if.end18</div>
<div style="RIGHT: auto">if.end18:                                         ; preds = %if.else12, %if.then9, %if.then6<BR>  %d.2 = phi i32 [ %call, %if.then6 ], [ %sub10, %if.then9 ], [ %sub15.call, %if.else12 ]<BR>  %tobool19 = icmp eq i32* %rm, null, !dbg !47<BR>  br i1 %tobool19, label %if.end21, label %if.then20, !dbg !47</div>
<div style="RIGHT: auto">if.then20:                                        ; preds = %if.end18<BR>  call void @llvm.dbg.value(metadata !{i32* %r}, i64 0, metadata !24), !dbg !48<BR>  call void @llvm.dbg.value(metadata !{i32* %r}, i64 0, metadata !24), !dbg !48<BR>  call void @llvm.dbg.value(metadata !{i32* %r}, i64 0, metadata !24), !dbg !48<BR>  call void @llvm.dbg.value(metadata !{i32* %r}, i64 0, metadata !24), !dbg !48<BR>  call void @llvm.dbg.value(metadata !{i32* %r}, i64 0, metadata !24), !dbg !48<BR>  %4 = load i32* %r, align 4, !dbg !48<BR>  store i32 %4, i32* %rm, align 4, !dbg !48<BR>  br label %if.end21, !dbg !50</div>
<div style="RIGHT: auto">if.end21:                                         ; preds = %if.then20, %if.end18<BR>  ret i32 %d.2, !dbg !51<BR>}<BR></div>
<div style="RIGHT: auto"> </div>
<div style="RIGHT: auto">Regards,</div>
<div style="RIGHT: auto">Pankaj</div></div></body></html>