| ; This test originally exhibited a bug in ebp-based stack slots.  The | 
 | ; problem was that during a function call push sequence, the esp | 
 | ; adjustment was incorrectly added to the stack/frame offset for | 
 | ; ebp-based frames. | 
 |  | 
 | ; RUN: %p2i --filetype=obj --disassemble -i %s --args -Om1 | FileCheck %s | 
 |  | 
 | declare i32 @memcpy_helper2(i32 %buf, i32 %buf2, i32 %n) | 
 |  | 
 | define i32 @memcpy_helper(i32 %buf, i32 %n) { | 
 | entry: | 
 |   %buf2 = alloca i8, i32 128, align 4 | 
 |   %n.arg_trunc = trunc i32 %n to i8 | 
 |   %arg.ext = zext i8 %n.arg_trunc to i32 | 
 |   %buf2.asint = ptrtoint i8* %buf2 to i32 | 
 |   %call = call i32 @memcpy_helper2(i32 %buf, i32 %buf2.asint, i32 %arg.ext) | 
 |   ret i32 %call | 
 | } | 
 |  | 
 | ; This check sequence is highly specific to the current Om1 lowering | 
 | ; and stack slot assignment code, and may need to be relaxed if the | 
 | ; lowering code changes. | 
 |  | 
 | ; CHECK-LABEL: memcpy_helper | 
 | ; CHECK:  push  ebp | 
 | ; CHECK:  mov   ebp,esp | 
 | ; CHECK:  sub   esp,0x18 | 
 | ; CHECK:  sub   esp,0x80 | 
 | ; CHECK:  mov   DWORD PTR [ebp-0x4],esp | 
 | ; CHECK:  mov   eax,DWORD PTR [ebp+0xc] | 
 | ; CHECK:  mov   DWORD PTR [ebp-0x8],eax | 
 | ; CHECK:  movzx eax,BYTE PTR [ebp-0x8] | 
 | ; CHECK:  mov   DWORD PTR [ebp-0xc],eax | 
 | ; CHECK:  sub   esp,0x10 | 
 | ; CHECK:  mov   eax,DWORD PTR [ebp+0x8] | 
 | ; CHECK:  mov   DWORD PTR [esp],eax | 
 | ; CHECK:  mov   eax,DWORD PTR [ebp-0x4] | 
 | ; CHECK:  mov   DWORD PTR [esp+0x4],eax | 
 | ; CHECK:  mov   eax,DWORD PTR [ebp-0xc] | 
 | ; CHECK:  mov   DWORD PTR [esp+0x8],eax | 
 | ; CHECK:  call {{.*}} R_{{.*}} memcpy_helper2 |