<HTML><HEAD><TITLE>Samsung Enterprise Portal mySingle</TITLE>
<META content="text/html; charset=windows-1252" http-equiv=Content-Type>
<STYLE id=mysingle_style type=text/css>P {
        MARGIN-TOP: 5px; FONT-FAMILY: Arial, arial; MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt
}
TD {
        MARGIN-TOP: 5px; FONT-FAMILY: Arial, arial; MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt
}
LI {
        MARGIN-TOP: 5px; FONT-FAMILY: Arial, arial; MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt
}
BODY {
        LINE-HEIGHT: 1.4; MARGIN: 10px; FONT-FAMILY: Arial, arial; FONT-SIZE: 9pt
}
</STYLE>

<META name=GENERATOR content=ActiveSquare></HEAD>
<BODY>
<P>Hi all,</P>
<P> </P>
<P>Thanks for all comments,</P>
<P>Filed bug report with details,</P>
<DIV><A href="http://llvm.org/bugs/show_bug.cgi?id=16368">http://llvm.org/bugs/show_bug.cgi?id=16368</A></DIV>
<P> </P>
<P>@Manman, please find comments, queries inline.</P>
<P> </P>
<P>Regards,<BR>Rajesh</P>
<P> </P>
<P>------- <B>Original Message</B> -------</P>
<P><B>Sender</B> : Stepan Dyatkovskiy<stpworld@narod.ru></P>
<P><B>Date</B> : Jun 19, 2013 05:15 (GMT+09:00)</P>
<P><B>Title</B> : Re: [LLVMdev] ARM struct byval size > 64 triggers failure</P>
<P> </P>
<DIV>Hi all,</DIV>
<DIV>One more interesting job :-)</DIV>
<DIV>I'll look too at this case tomorrow. Today my brain is about to be exploded..</DIV>
<DIV> </DIV>
<DIV>-Stepan.</DIV>
<DIV> </DIV>
<DIV>18.06.2013, 22:56, "Manman Ren" <mren@apple.com>:</DIV>
<BLOCKQUOTE type="cite">
<DIV> </DIV>Hi Rajesh, 
<DIV> </DIV>
<DIV>The callee code looks okay to me</DIV>
<DIV>
<BLOCKQUOTE type="cite">
<DIV style="LINE-HEIGHT: 1.4; MARGIN: 10px; FONT-FAMILY: Arial,arial; FONT-SIZE: 9pt">
<P style="MARGIN-TOP: 5px; MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt">Assembly for check114 <BR>---------------------------------------------------------------<BR>        sub     sp, sp, #16<BR>        push    {r11, lr}<BR>        mov     r11, sp<BR>        sub     sp, sp, #8<BR>        str     r3, [r11, #20]<BR>        str     r2, [r11, #16]<BR>        str     r1, [r11, #12]<BR>        ldr     r1, [r11, #76]</P></DIV></BLOCKQUOTE>
<DIV>
<DIV>VARegSaveSize is 16 because we store the first 16 bytes of struct byval in r0 to r3.</DIV>
<DIV> </DIV>
<DIV>For the test code/assembly I mentioned, only r1-r3 are used for struct byval. r0 used for return val.</DIV>
<DIV>
<P style="MARGIN-TOP: 5px; FONT-FAMILY: Arial,arial; MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt">So, NumGPRs = 3, VARegSize = 12, VARegSaveSize =16(4 byte offset), access of arg1 is going wrong.</P>
<P style="MARGIN-TOP: 5px; FONT-FAMILY: Arial,arial; MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt">For updated test code:</P>
<P style="MARGIN-TOP: 5px; FONT-FAMILY: Arial,arial; MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt">struct S114 check114 (<STRONG>int a</STRONG>, struct S114 arg0, struct S114* arg1) {</P>
<P style="MARGIN-TOP: 5px; FONT-FAMILY: Arial,arial; MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt">.....<BR>}</P>
<P style="MARGIN-TOP: 5px; FONT-FAMILY: Arial,arial; MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt">Only r1, r2 used for struct byval, NumGPRs = 2, VARegSize = 8, VARegSaveSize =8, this case works, able to access arg1.</P>
<P style="MARGIN-TOP: 5px; FONT-FAMILY: Arial,arial; MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt"> </P>
<P style="MARGIN-TOP: 5px; FONT-FAMILY: Arial,arial; MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt">Please correct me, if my above understanding is wrong about NumGPRs, VARegSaveSize calculation.</P>
<P style="MARGIN-TOP: 5px; FONT-FAMILY: Arial,arial; MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt"> </P></DIV>
<DIV>Align in computeRegArea is 8 since ABI says the stack pointer needs to be 8 byte aligned at function entry point.</DIV>
<DIV>But the second argument does not have to be 8 byte aligned, in fact it is 4 byte aligned for i32.</DIV>
<DIV> </DIV>
<DIV>Ok.</DIV>
<DIV> </DIV>
<DIV>r11, #76 is equivalent to sp_at_entry + 52 since r11 = spat_entry - 16 - 8, which is 4-byte aligned after</DIV>
<DIV>storing the leftover (67-16=51) bytes of struct byval.</DIV>
<DIV> </DIV>
<DIV>For test code, 3 reg used for struct byval, left over will be (67- 12 = 55) copied to stack by caller, 55 sets of ldrb,strb in assembly. </DIV>
<DIV> </DIV>
<DIV>Pasting dump again for locating arg1 from sp_at_entry,</DIV>
<DIV>@entry of check114<BR>  sp             0xbefff808 0xbefff808 --> sp_at_entry 
<P style="MARGIN-TOP: 5px; FONT-FAMILY: Arial,arial; MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt">  At arg1 accessing instruction [0xbefff808 + 52] -> [0xbefff83c] -> <STRONG>0x<SPAN>4071706</SPAN>f</STRONG> <BR>  0xbefff7e4: 0x4001ed08 0x40024f90 0x<SPAN>4071706</SPAN>f 0xbefff8a0<BR>  0xbefff7f4: 0x<SPAN>0000869</SPAN>c 0x<SPAN>00000000</SPAN> 0x<SPAN>3231302</SPAN>f 0x<SPAN>36353433</SPAN><BR>  0xbefff804: 0x3a393837 0x3e3d3c3b 0x<SPAN>4241403</SPAN>f 0x<SPAN>46454443</SPAN><BR>  0xbefff814: 0x4a494847 0x4e4d4c4b 0x<SPAN>5251504</SPAN>f 0x<SPAN>56555453</SPAN><BR>  0xbefff824: 0x5a595857 0x5e5d5c5b 0x<SPAN>6261605</SPAN>f 0x<SPAN>66656463</SPAN><BR>  0xbefff834: 0x6a696867 0x6e6d6c6b<STRONG> 0x<SPAN>4071706</SPAN>f</STRONG> <STRONG>0x<SPAN>00010861</SPAN></STRONG>                 </P></DIV>
<DIV> </DIV>
<DIV>Can you also paste the assembly for the caller side and check whether the second argument is stored</DIV>
<DIV>at sp_at_entry+52?</DIV>
<DIV> </DIV>
<DIV>Please find the attached assembly file.</DIV>
<DIV> </DIV>
<DIV>As Renato suggested, please file a bug report.</DIV>
<DIV> </DIV>
<DIV>Filed bug.</DIV>
<DIV> </DIV>
<DIV>Thanks,</DIV>
<DIV>Manman</DIV>
<DIV> </DIV>
<DIV> </DIV>
<DIV>On Jun 18, 2013, at 4:26 AM, Rajesh Viswabramana <<A href="mailto:rajesh.vis@samsung.com">rajesh.vis@samsung.com</A>> wrote:</DIV><BR>
<BLOCKQUOTE type="cite">
<DIV style="LINE-HEIGHT: 1.4; TEXT-TRANSFORM: none; MARGIN: 10px; FONT-FAMILY: Arial,arial; FONT-SIZE: 9pt">
<P style="MARGIN-TOP: 5px; FONT-FAMILY: Arial,arial; MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt">Hi,</P>
<DIV style="MARGIN-TOP: 5px; FONT-FAMILY: Arial,arial; MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt"> </DIV>
<P style="MARGIN-TOP: 5px; FONT-FAMILY: Arial,arial; MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt">Handling of pass by val of struct size >64 bytes case is seems wrong for arm targets.</P>
<P style="MARGIN-TOP: 5px; FONT-FAMILY: Arial,arial; MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt"> </P>
<P style="MARGIN-TOP: 5px; FONT-FAMILY: Arial,arial; MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt"><STRONG>Summary:</STRONG></P>
<P style="MARGIN-TOP: 5px; FONT-FAMILY: Arial,arial; MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt">Incase of struct pass by value for size > 64 along with other function params, failure seen in some corner cases. Access to function params result in wrong stack location access. </P>
<P style="MARGIN-TOP: 5px; FONT-FAMILY: Arial,arial; MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt">Stack pointer adjustment done by prologue emitter and offset used to access function params have different logics for calculaton.</P>
<P style="MARGIN-TOP: 5px; FONT-FAMILY: Arial,arial; MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt"> </P>
<P style="MARGIN-TOP: 5px; FONT-FAMILY: Arial,arial; MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt"><STRONG>Test code<BR></STRONG>---------------------------------------------------------------<BR>#include <stdio.h><BR>struct S114 {<BR>  char a[67];<BR>}a114[5];</P>
<P style="MARGIN-TOP: 5px; FONT-FAMILY: Arial,arial; MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt">struct S114 check114 (struct S114 arg0, struct S114* arg1) { <BR>  if(&a114[0] != arg1)                         // arg1 value is wrong<BR>    printf( "values %p, %p\n", &a114[0], arg1);<BR>}<BR>int main () {<BR>  int i= 0, j = 0;<BR>  for (;j<2; j++)                                    // just filling a114 with some values for identification<BR>    for(i=0; i<sizeof(struct S114); i++)<BR>      memset(&a114[j].a[i],(0x11+i+j*30), sizeof(int)); </P>
<P style="MARGIN-TOP: 5px; FONT-FAMILY: Arial,arial; MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt">  check114 (a114[1], &a114[0]);         //=> a114[0]  is accessed from wrong location inside check114 function<BR>}<BR>---------------------------------------------------------------<BR>clang -v<BR>clang version 3.3 (tags/RELEASE_33/final)<BR>Target: i386-pc-linux-gnu<BR>Thread model: posix</P>
<DIV style="MARGIN-TOP: 5px; FONT-FAMILY: Arial,arial; MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt"> </DIV>
<P style="MARGIN-TOP: 5px; FONT-FAMILY: Arial,arial; MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt"><STRONG>Output on arm :<BR></STRONG># ./check114.exe<SPAN> </SPAN><BR>values 0x10861, 0x<SPAN>4071706</SPAN>f<BR>which is wrong.</P>
<DIV style="MARGIN-TOP: 5px; FONT-FAMILY: Arial,arial; MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt"> </DIV>
<P style="MARGIN-TOP: 5px; FONT-FAMILY: Arial,arial; MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt">Assembly for check114<SPAN> </SPAN><BR>---------------------------------------------------------------<BR>        sub     sp, sp, #16<BR>        push    {r11, lr}<BR>        mov     r11, sp<BR>        sub     sp, sp, #8<BR>        str     r3, [r11, #20]<BR>        str     r2, [r11, #16]<BR>        str     r1, [r11, #12]<BR>        ldr     r1, [r11, #76]<BR>        str     r1, [sp, #4]<BR>        .loc    1 7 0 prologue_end<BR>        ldr     r2, .LCPI0_0<BR>        cmp     r2, r1<BR>        beq     .LBB0_2<BR>        b       .LBB0_1<BR>---------------------------------------------------------------</P>
<DIV style="MARGIN-TOP: 5px; FONT-FAMILY: Arial,arial; MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt"> </DIV>
<P style="MARGIN-TOP: 5px; FONT-FAMILY: Arial,arial; MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt">From reg, stack dump:<BR>------------------------------------------------------------------------------------------------------------------------------<BR>@entry of check114<BR>  => 0x8398 <check114>: sub sp, sp, #16<BR>        0x839c <check114+4>: push {r11, lr}<BR>  sp             0xbefff808 0xbefff808</P>
<P style="MARGIN-TOP: 5px; FONT-FAMILY: Arial,arial; MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt">@if condition<BR>       0x83b4 <check114+28>: ldr r1, [r11, #76] ; 0x4c         <--- wrong value copied to r1, offset #76 should be #80<BR>       0x83b8 <check114+32>: str r1, [sp, #4]<BR>       0x83bc <check114+36>: ldr r2, [pc, #44] ; 0x83f0 <check114+88><BR> => 0x83c0 <check114+40>: cmp r2, r1<BR>  <BR>  r11            0xbefff7f0 -<SPAN>1090521104</SPAN><BR>  sp             0xbefff7e8 0xbefff7e8</P>
<P style="MARGIN-TOP: 5px; FONT-FAMILY: Arial,arial; MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt">  Stack dump:<BR>  0xbefff7e4: 0x4001ed08 0x40024f90 0x<SPAN>4071706</SPAN>f 0xbefff8a0<BR>  0xbefff7f4: 0x<SPAN>0000869</SPAN>c 0x<SPAN>00000000</SPAN> 0x<SPAN>3231302</SPAN>f 0x<SPAN>36353433</SPAN><BR>  0xbefff804: 0x3a393837 0x3e3d3c3b 0x<SPAN>4241403</SPAN>f 0x<SPAN>46454443</SPAN><BR>  0xbefff814: 0x4a494847 0x4e4d4c4b 0x<SPAN>5251504</SPAN>f 0x<SPAN>56555453</SPAN><BR>  0xbefff824: 0x5a595857 0x5e5d5c5b 0x<SPAN>6261605</SPAN>f 0x<SPAN>66656463</SPAN><BR>  0xbefff834: 0x6a696867 0x6e6d6c6b<STRONG> 0x<SPAN>4071706</SPAN>f</STRONG> <STRONG>0x<SPAN>00010861</SPAN></STRONG>                 //[R11+4c] -> [0xbefff7f0+4c] -> [0xbefff83c] -> 0x<SPAN>4071706</SPAN>f</P>
<P style="MARGIN-TOP: 5px; FONT-FAMILY: Arial,arial; MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt">Correct value is at location {[R11+4c]<STRONG>+4</STRONG>} --> 0x<SPAN>00010861</SPAN>, 4 bytes offset going wrong.<BR>------------------------------------------------------------------------------------------------------------------------------</P>
<P style="MARGIN-TOP: 5px; FONT-FAMILY: Arial,arial; MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt">When i checked from the ARM Lowering part for generation of<BR>  sub sp, sp, #16</P>
<P style="MARGIN-TOP: 5px; FONT-FAMILY: Arial,arial; MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt">Emitted by,</P>
<P style="MARGIN-TOP: 5px; FONT-FAMILY: Arial,arial; MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt">  if (VARegSaveSize)<BR>    emitSPUpdate(isARM, MBB, MBBI, dl, TII, -VARegSaveSize,        // --> VARegSaveSize is calculated in computeRegArea<BR>                 MachineInstr::FrameSetup)<BR><BR>ARMTargetLowering::computeRegArea(..) {<BR>  ...<BR>  VARegSize = NumGPRs * 4;<BR>  VARegSaveSize = (VARegSize + Align - 1) & ~(Align - 1);                 // --> 8 byte alignment done here<BR>}</P>
<P style="MARGIN-TOP: 5px; FONT-FAMILY: Arial,arial; MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt">Stack pointer decremented to NumGPRs*4 + alignment</P>
<P style="MARGIN-TOP: 5px; FONT-FAMILY: Arial,arial; MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt">NumGPRs = 3 registers</P>
<P style="MARGIN-TOP: 5px; FONT-FAMILY: Arial,arial; MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt">VARegSaveSize  = 16 (after considering 8 byte alignment )</P>
<P style="MARGIN-TOP: 5px; FONT-FAMILY: Arial,arial; MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt"><BR>When the offset(#76) for the instruction, "ldr r1, [r11, #76] ; 0x4c"  is calculated, 4 bytes alignment is considered.<BR>In prologue stackpointer calculation 8 byte alignment is considered.</P>
<P style="MARGIN-TOP: 5px; FONT-FAMILY: Arial,arial; MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt">Due to this mimatch of alignment, If try to access any parameter after byval which results wrong value.</P>
<DIV style="MARGIN-TOP: 5px; FONT-FAMILY: Arial,arial; MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt"> </DIV>
<P style="MARGIN-TOP: 5px; FONT-FAMILY: Arial,arial; MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt">Issue(or offset of 4 bytes) wont occur if even number of register used for byval spilling.<BR>ex:<SPAN> </SPAN><BR>struct S114 check114 (int a, struct S114 arg0, struct S114* arg1) { // accessing arg1 is fine in this case<BR>.....<BR>}</P>
<DIV style="MARGIN-TOP: 5px; FONT-FAMILY: Arial,arial; MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt"> </DIV>
<P style="MARGIN-TOP: 5px; FONT-FAMILY: Arial,arial; MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt">Could someone comment on below queries about fixing the problem,</P>
<P style="MARGIN-TOP: 5px; FONT-FAMILY: Arial,arial; MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt">1) Is this 8 byte alignment mandatory ?  Is this due to " ARM AAPCS 5.2.1.2 Stack constraints at a public interface" ? Can this be removed?</P>
<P style="MARGIN-TOP: 5px; FONT-FAMILY: Arial,arial; MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt">2) We will leave alignment as it is but in prologue we will adjust SP once again, this is little meaningless.</P>
<P style="MARGIN-TOP: 5px; FONT-FAMILY: Arial,arial; MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt">3) While accessing arg1 we will consider alignment and add extra offset -> looks better.</P>
<P style="MARGIN-TOP: 5px; FONT-FAMILY: Arial,arial; MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt"> Offset to access arg1 is calculated by selection DAG that will be target independent. But Alignment adjustment should be done by target lowering. Any suggestions on how to fix this ?</P>
<DIV style="MARGIN-TOP: 5px; FONT-FAMILY: Arial,arial; MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt"> </DIV>
<P style="MARGIN-TOP: 5px; FONT-FAMILY: Arial,arial; MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt">Regards,<BR>Rajesh</P>
<DIV style="MARGIN-TOP: 5px; FONT-FAMILY: Arial,arial; MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt"> </DIV>
<TABLE>
<TBODY>
<TR>
<TD style="MARGIN-TOP: 5px; FONT-FAMILY: Arial,arial; MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt">
<P style="MARGIN-TOP: 5px; FONT-FAMILY: Arial,arial; MARGIN-BOTTOM: 5px; FONT-SIZE: 9pt"><SPAN><<SPAN>201306181656803</SPAN>_BEI0XT4N.gif></SPAN></P></TD></TR></TBODY></TABLE>_______________________________________________<BR>LLVM Developers mailing list<BR><A href="mailto:LLVMdev@cs.uiuc.edu">LLVMdev@cs.uiuc.edu</A><SPAN> </SPAN>        <A href="http://llvm.cs.uiuc.edu/">http://llvm.cs.uiuc.edu</A><BR><A href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</A></DIV></BLOCKQUOTE></DIV></DIV>, 
<P>_______________________________________________<BR>LLVM Developers mailing list<BR><A href="mailto:LLVMdev@cs.uiuc.edu">LLVMdev@cs.uiuc.edu</A>         <A href="http://llvm.cs.uiuc.edu/">http://llvm.cs.uiuc.edu</A><BR><A href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</A></P></BLOCKQUOTE>
<P> </P>
<P> </P><!--SP:rajesh.vis--><!--rajesh.vis:EP-->
<P> </P></X-BODY>
<P> </P>
<P> </P><!--SP:rajesh.vis--><!--rajesh.vis:EP-->
<P> </P>
<TABLE id=confidentialsignimg>
<TBODY>
<TR>
<TD NAMO_LOCK>
<P><IMG border=0 src="cid:Z5JE7EUABGFC@namo.co.kr" width=520></P></TD></TR></TBODY></TABLE></BODY></HTML><img src='http://ext.samsung.net/mailcheck/SeenTimeChecker?do=24fd7bfac5a29b9f1c68e8f1db57a8c5063b981eca45f2a94b8edb9941f8601fb846c8a3750bbecdd1479191c8e13bdda4db4f4540c3ce487d6f8b298eafad26cf878f9a26ce15a0' border=0 width=0 height=0 style='display:none'>