<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>