Home | History | Annotate | Download | only in cconv
      1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
      2 ; NOTE: The SelectionDAG checks have been added by hand.
      3 
      4 ; RUN: llc < %s -mtriple=mips-linux-gnu -verify-machineinstrs  \
      5 ; RUN:   | FileCheck %s --check-prefix=O32
      6 ; RUN: llc < %s -mtriple=mips64-linux-gnu -target-abi n32 -verify-machineinstrs \
      7 ; RUN:    | FileCheck %s --check-prefix=N32
      8 ; RUN: llc < %s -mtriple=mips64-linux-gnu -target-abi n64 -verify-machineinstrs \
      9 ; RUN:    | FileCheck %s --check-prefix=N64
     10 
     11 ; RUN: llc < %s -mtriple=mips-linux-gnu -verify-machineinstrs -debug 2>&1 \
     12 ; RUN:   | FileCheck %s --check-prefix=O32-SDAG
     13 ; RUN: llc < %s -mtriple=mips64-linux-gnu -target-abi n32 -verify-machineinstrs \
     14 ; RUN:   -debug 2>&1 | FileCheck %s --check-prefix=N32-SDAG
     15 ; RUN: llc < %s -mtriple=mips64-linux-gnu -target-abi n64 -verify-machineinstrs \
     16 ; RUN:   -debug 2>&1 | FileCheck %s --check-prefix=N64-SDAG
     17 
     18 ; REQUIRES: asserts
     19 
     20 ; Test that reserved argument area is shared between the memcpy call and the
     21 ; call to f2. This eliminates the nested call sequence nodes.
     22 
     23 ; Also, test that a basic call to memcpy reserves its outgoing argument area.
     24 
     25 ; FIXME: We should also be explicit about testing that the loads for the
     26 ;        arguments are scheduled after the memcpy, but that wasn't enforced in
     27 ;        this patch.
     28 
     29 %struct.S1 = type { [65520 x i8] }
     30 
     31 ; O32-SDAG-LABEL: Initial selection DAG: %bb.0 'g:entry'
     32 ; O32-SDAG: t{{.*}}: ch,glue = callseq_start t{{.*}}, TargetConstant:i32<{{.*}}>
     33 ; O32-SDAG-NOT: t{{.*}}: ch,glue = callseq_start t{{.*}}, TargetConstant:i32<{{.*}}>
     34 ; O32-SDAG: t{{.*}}: ch,glue = MipsISD::JmpLink t{{.*}}, TargetExternalSymbol:i32'memcpy'
     35 ; O32-SDAG-NOT: t{{.*}}: ch,glue = callseq_end t{{.*}}, TargetConstant:i32<{{.*}}>
     36 ; O32-SDAG: t{{.*}}: ch,glue = MipsISD::JmpLink t{{.*}}, TargetGlobalAddress:i32<void (%struct.S1*)* @f2>
     37 ; O32-SDAG: t{{.*}}: ch,glue = callseq_end t{{.*}}, TargetConstant:i32<{{.*}}>
     38 
     39 ; N32-SDAG-LABEL: Initial selection DAG: %bb.0 'g:entry'
     40 ; N32-SDAG: t{{.*}}: ch,glue = callseq_start t{{.*}}, TargetConstant:i32<{{.*}}>
     41 ; N32-SDAG-NOT: t{{.*}}: ch,glue = callseq_start t{{.*}}, TargetConstant:i32<{{.*}}>
     42 ; N32-SDAG: t{{.*}}: ch,glue = MipsISD::JmpLink t{{.*}}, TargetExternalSymbol:i32'memcpy'
     43 ; N32-SDAG-NOT: t{{.*}}: ch,glue = callseq_end t{{.*}}, TargetConstant:i32<{{.*}}>
     44 ; N32-SDAG: t{{.*}}: ch,glue = MipsISD::JmpLink t{{.*}}, TargetGlobalAddress:i32<void (%struct.S1*)* @f2>
     45 ; N32-SDAG: t{{.*}}: ch,glue = callseq_end t{{.*}}, TargetConstant:i32<{{.*}}>
     46 
     47 ; N64-SDAG-LABEL: Initial selection DAG: %bb.0 'g:entry'
     48 ; N64-SDAG: t{{.*}}: ch,glue = callseq_start t{{.*}}, TargetConstant:i64<{{.*}}>
     49 ; N64-SDAG-NOT: t{{.*}}: ch,glue = callseq_start t{{.*}}, TargetConstant:i64<{{.*}}>
     50 ; N64-SDAG: t{{.*}}: ch,glue = MipsISD::JmpLink t{{.*}}, TargetExternalSymbol:i64'memcpy'
     51 ; N64-SDAG-NOT: t{{.*}}: ch,glue = callseq_end t{{.*}}, TargetConstant:i64<{{.*}}>
     52 ; N64-SDAG: t{{.*}}: ch,glue = MipsISD::JmpLink t{{.*}}, TargetGlobalAddress:i64<void (%struct.S1*)* @f2>
     53 ; N64-SDAG: t{{.*}}: ch,glue = callseq_end t{{.*}}, TargetConstant:i64<{{.*}}>
     54 
     55 define dso_local void @g() #0 {
     56 ; O32-LABEL: g:
     57 ; O32:       # %bb.0: # %entry
     58 ; O32-NEXT:    lui $1, 1
     59 ; O32-NEXT:    subu $sp, $sp, $1
     60 ; O32-NEXT:    .cfi_def_cfa_offset 65536
     61 ; O32-NEXT:    lui $1, 1
     62 ; O32-NEXT:    addu $1, $sp, $1
     63 ; O32-NEXT:    sw $ra, -4($1) # 4-byte Folded Spill
     64 ; O32-NEXT:    .cfi_offset 31, -4
     65 ; O32-NEXT:    ori $1, $zero, 65520
     66 ; O32-NEXT:    subu $sp, $sp, $1
     67 ; O32-NEXT:    addiu $1, $sp, 8
     68 ; O32-NEXT:    addiu $5, $1, 16
     69 ; O32-NEXT:    addiu $4, $sp, 16
     70 ; O32-NEXT:    jal memcpy
     71 ; O32-NEXT:    ori $6, $zero, 65504
     72 ; O32-NEXT:    lw $7, 20($sp)
     73 ; O32-NEXT:    lw $6, 16($sp)
     74 ; O32-NEXT:    lw $5, 12($sp)
     75 ; O32-NEXT:    jal f2
     76 ; O32-NEXT:    lw $4, 8($sp)
     77 ; O32-NEXT:    ori $1, $zero, 65520
     78 ; O32-NEXT:    addu $sp, $sp, $1
     79 ; O32-NEXT:    lui $1, 1
     80 ; O32-NEXT:    addu $1, $sp, $1
     81 ; O32-NEXT:    lw $ra, -4($1) # 4-byte Folded Reload
     82 ; O32-NEXT:    lui $1, 1
     83 ; O32-NEXT:    jr $ra
     84 ; O32-NEXT:    addu $sp, $sp, $1
     85 ;
     86 ; N32-LABEL: g:
     87 ; N32:       # %bb.0: # %entry
     88 ; N32-NEXT:    lui $1, 1
     89 ; N32-NEXT:    subu $sp, $sp, $1
     90 ; N32-NEXT:    .cfi_def_cfa_offset 65536
     91 ; N32-NEXT:    lui $1, 1
     92 ; N32-NEXT:    addu $1, $sp, $1
     93 ; N32-NEXT:    sd $ra, -8($1) # 8-byte Folded Spill
     94 ; N32-NEXT:    .cfi_offset 31, -8
     95 ; N32-NEXT:    ori $1, $zero, 65456
     96 ; N32-NEXT:    subu $sp, $sp, $1
     97 ; N32-NEXT:    addiu $1, $sp, 8
     98 ; N32-NEXT:    addiu $5, $1, 64
     99 ; N32-NEXT:    ori $6, $zero, 65456
    100 ; N32-NEXT:    jal memcpy
    101 ; N32-NEXT:    move $4, $sp
    102 ; N32-NEXT:    ld $11, 64($sp)
    103 ; N32-NEXT:    ld $10, 56($sp)
    104 ; N32-NEXT:    ld $9, 48($sp)
    105 ; N32-NEXT:    ld $8, 40($sp)
    106 ; N32-NEXT:    ld $7, 32($sp)
    107 ; N32-NEXT:    ld $6, 24($sp)
    108 ; N32-NEXT:    ld $5, 16($sp)
    109 ; N32-NEXT:    jal f2
    110 ; N32-NEXT:    ld $4, 8($sp)
    111 ; N32-NEXT:    ori $1, $zero, 65456
    112 ; N32-NEXT:    addu $sp, $sp, $1
    113 ; N32-NEXT:    lui $1, 1
    114 ; N32-NEXT:    addu $1, $sp, $1
    115 ; N32-NEXT:    ld $ra, -8($1) # 8-byte Folded Reload
    116 ; N32-NEXT:    lui $1, 1
    117 ; N32-NEXT:    jr $ra
    118 ; N32-NEXT:    addu $sp, $sp, $1
    119 ;
    120 ; N64-LABEL: g:
    121 ; N64:       # %bb.0: # %entry
    122 ; N64-NEXT:    lui $1, 1
    123 ; N64-NEXT:    dsubu $sp, $sp, $1
    124 ; N64-NEXT:    .cfi_def_cfa_offset 65536
    125 ; N64-NEXT:    lui $1, 1
    126 ; N64-NEXT:    daddu $1, $sp, $1
    127 ; N64-NEXT:    sd $ra, -8($1) # 8-byte Folded Spill
    128 ; N64-NEXT:    .cfi_offset 31, -8
    129 ; N64-NEXT:    ori $1, $zero, 65456
    130 ; N64-NEXT:    dsubu $sp, $sp, $1
    131 ; N64-NEXT:    daddiu $1, $sp, 8
    132 ; N64-NEXT:    daddiu $5, $1, 64
    133 ; N64-NEXT:    ori $6, $zero, 65456
    134 ; N64-NEXT:    jal memcpy
    135 ; N64-NEXT:    move $4, $sp
    136 ; N64-NEXT:    ld $11, 64($sp)
    137 ; N64-NEXT:    ld $10, 56($sp)
    138 ; N64-NEXT:    ld $9, 48($sp)
    139 ; N64-NEXT:    ld $8, 40($sp)
    140 ; N64-NEXT:    ld $7, 32($sp)
    141 ; N64-NEXT:    ld $6, 24($sp)
    142 ; N64-NEXT:    ld $5, 16($sp)
    143 ; N64-NEXT:    jal f2
    144 ; N64-NEXT:    ld $4, 8($sp)
    145 ; N64-NEXT:    ori $1, $zero, 65456
    146 ; N64-NEXT:    daddu $sp, $sp, $1
    147 ; N64-NEXT:    lui $1, 1
    148 ; N64-NEXT:    daddu $1, $sp, $1
    149 ; N64-NEXT:    ld $ra, -8($1) # 8-byte Folded Reload
    150 ; N64-NEXT:    lui $1, 1
    151 ; N64-NEXT:    jr $ra
    152 ; N64-NEXT:    daddu $sp, $sp, $1
    153 entry:
    154   %a = alloca %struct.S1, align 4
    155   call void @f2(%struct.S1* byval align 4 %a)
    156   ret void
    157 }
    158 
    159 declare dso_local void @f2(%struct.S1* byval align 4) #1
    160 
    161 ; O32-SDAG-LABEL: Initial selection DAG: %bb.0 'g2:entry'
    162 ; O32-SDAG: t{{.*}}: ch,glue = callseq_start t{{.*}}, TargetConstant:i32<{{.*}}>
    163 ; O32-SDAG: t{{.*}}: ch,glue = MipsISD::JmpLink t{{.*}}, TargetExternalSymbol:i32'memcpy'
    164 ; O32-SDAG: t{{.*}}: ch,glue = callseq_end t{{.*}}, TargetConstant:i32<{{.*}}>
    165 ; O32-SDAG: t{{.*}}: ch,glue = callseq_start t{{.*}}, TargetConstant:i32<{{.*}}>
    166 ; O32-SDAG-NOT: t{{.*}}: ch,glue = callseq_start t{{.*}}, TargetConstant:i32<{{.*}}>
    167 ; O32-SDAG: t{{.*}}: ch,glue = MipsISD::JmpLink t{{.*}}, TargetExternalSymbol:i32'memcpy'
    168 ; O32-SDAG-NOT: t{{.*}}: ch,glue = callseq_end t{{.*}}, TargetConstant:i32<{{.*}}>
    169 ; O32-SDAG: t{{.*}}: ch,glue = MipsISD::JmpLink t{{.*}}, TargetGlobalAddress:i32<void (%struct.S1*)* @f2>
    170 ; O32-SDAG: t{{.*}}: ch,glue = callseq_end t{{.*}}, TargetConstant:i32<{{.*}}>
    171 
    172 ; N32-SDAG-LABEL: Initial selection DAG: %bb.0 'g2:entry'
    173 ; N32-SDAG: t{{.*}}: ch,glue = callseq_start t{{.*}}, TargetConstant:i32<{{.*}}>
    174 ; N32-SDAG: t{{.*}}: ch,glue = MipsISD::JmpLink t{{.*}}, TargetExternalSymbol:i32'memcpy'
    175 ; N32-SDAG: t{{.*}}: ch,glue = callseq_end t{{.*}}, TargetConstant:i32<{{.*}}>
    176 ; N32-SDAG: t{{.*}}: ch,glue = callseq_start t{{.*}}, TargetConstant:i32<{{.*}}>
    177 ; N32-SDAG-NOT: t{{.*}}: ch,glue = callseq_start t{{.*}}, TargetConstant:i32<{{.*}}>
    178 ; N32-SDAG: t{{.*}}: ch,glue = MipsISD::JmpLink t{{.*}}, TargetExternalSymbol:i32'memcpy'
    179 ; N32-SDAG-NOT: t{{.*}}: ch,glue = callseq_end t{{.*}}, TargetConstant:i32<{{.*}}>
    180 ; N32-SDAG: t{{.*}}: ch,glue = MipsISD::JmpLink t{{.*}}, TargetGlobalAddress:i32<void (%struct.S1*)* @f2>
    181 ; N32-SDAG: t{{.*}}: ch,glue = callseq_end t{{.*}}, TargetConstant:i32<{{.*}}>
    182 
    183 ; N64-SDAG-LABEL: Initial selection DAG: %bb.0 'g2:entry'
    184 ; N64-SDAG: t{{.*}}: ch,glue = callseq_start t{{.*}}, TargetConstant:i64<{{.*}}>
    185 ; N64-SDAG: t{{.*}}: ch,glue = MipsISD::JmpLink t{{.*}}, TargetExternalSymbol:i64'memcpy'
    186 ; N64-SDAG: t{{.*}}: ch,glue = callseq_end t{{.*}}, TargetConstant:i64<{{.*}}>
    187 ; N64-SDAG: t{{.*}}: ch,glue = callseq_start t{{.*}}, TargetConstant:i64<{{.*}}>
    188 ; N64-SDAG-NOT: t{{.*}}: ch,glue = callseq_start t{{.*}}, TargetConstant:i64<{{.*}}>
    189 ; N64-SDAG: t{{.*}}: ch,glue = MipsISD::JmpLink t{{.*}}, TargetExternalSymbol:i64'memcpy'
    190 ; N64-SDAG-NOT: t{{.*}}: ch,glue = callseq_end t{{.*}}, TargetConstant:i64<{{.*}}>
    191 ; N64-SDAG: t{{.*}}: ch,glue = MipsISD::JmpLink t{{.*}}, TargetGlobalAddress:i64<void (%struct.S1*)* @f2>
    192 ; N64-SDAG: t{{.*}}: ch,glue = callseq_end t{{.*}}, TargetConstant:i64<{{.*}}>
    193 
    194 define dso_local void @g2(%struct.S1* %a) {
    195 ; O32-LABEL: g2:
    196 ; O32:       # %bb.0: # %entry
    197 ; O32-NEXT:    lui $1, 1
    198 ; O32-NEXT:    addiu $1, $1, 8
    199 ; O32-NEXT:    subu $sp, $sp, $1
    200 ; O32-NEXT:    .cfi_def_cfa_offset 65544
    201 ; O32-NEXT:    lui $1, 1
    202 ; O32-NEXT:    addu $1, $sp, $1
    203 ; O32-NEXT:    sw $ra, 4($1) # 4-byte Folded Spill
    204 ; O32-NEXT:    lui $1, 1
    205 ; O32-NEXT:    addu $1, $sp, $1
    206 ; O32-NEXT:    sw $16, 0($1) # 4-byte Folded Spill
    207 ; O32-NEXT:    .cfi_offset 31, -4
    208 ; O32-NEXT:    .cfi_offset 16, -8
    209 ; O32-NEXT:    move $5, $4
    210 ; O32-NEXT:    lui $1, 1
    211 ; O32-NEXT:    addu $1, $sp, $1
    212 ; O32-NEXT:    sw $4, -4($1)
    213 ; O32-NEXT:    addiu $sp, $sp, -16
    214 ; O32-NEXT:    addiu $16, $sp, 8
    215 ; O32-NEXT:    ori $6, $zero, 65520
    216 ; O32-NEXT:    jal memcpy
    217 ; O32-NEXT:    move $4, $16
    218 ; O32-NEXT:    addiu $sp, $sp, 16
    219 ; O32-NEXT:    ori $1, $zero, 65520
    220 ; O32-NEXT:    subu $sp, $sp, $1
    221 ; O32-NEXT:    addiu $5, $16, 16
    222 ; O32-NEXT:    addiu $4, $sp, 16
    223 ; O32-NEXT:    jal memcpy
    224 ; O32-NEXT:    ori $6, $zero, 65504
    225 ; O32-NEXT:    lw $7, 20($sp)
    226 ; O32-NEXT:    lw $6, 16($sp)
    227 ; O32-NEXT:    lw $5, 12($sp)
    228 ; O32-NEXT:    jal f2
    229 ; O32-NEXT:    lw $4, 8($sp)
    230 ; O32-NEXT:    ori $1, $zero, 65520
    231 ; O32-NEXT:    addu $sp, $sp, $1
    232 ; O32-NEXT:    lui $1, 1
    233 ; O32-NEXT:    addu $1, $sp, $1
    234 ; O32-NEXT:    lw $16, 0($1) # 4-byte Folded Reload
    235 ; O32-NEXT:    lui $1, 1
    236 ; O32-NEXT:    addu $1, $sp, $1
    237 ; O32-NEXT:    lw $ra, 4($1) # 4-byte Folded Reload
    238 ; O32-NEXT:    lui $1, 1
    239 ; O32-NEXT:    addiu $1, $1, 8
    240 ; O32-NEXT:    jr $ra
    241 ; O32-NEXT:    addu $sp, $sp, $1
    242 ;
    243 ; N32-LABEL: g2:
    244 ; N32:       # %bb.0: # %entry
    245 ; N32-NEXT:    lui $1, 1
    246 ; N32-NEXT:    addiu $1, $1, 16
    247 ; N32-NEXT:    subu $sp, $sp, $1
    248 ; N32-NEXT:    .cfi_def_cfa_offset 65552
    249 ; N32-NEXT:    lui $1, 1
    250 ; N32-NEXT:    addu $1, $sp, $1
    251 ; N32-NEXT:    sd $ra, 8($1) # 8-byte Folded Spill
    252 ; N32-NEXT:    lui $1, 1
    253 ; N32-NEXT:    addu $1, $sp, $1
    254 ; N32-NEXT:    sd $16, 0($1) # 8-byte Folded Spill
    255 ; N32-NEXT:    .cfi_offset 31, -8
    256 ; N32-NEXT:    .cfi_offset 16, -16
    257 ; N32-NEXT:    move $5, $4
    258 ; N32-NEXT:    sll $1, $5, 0
    259 ; N32-NEXT:    lui $2, 1
    260 ; N32-NEXT:    addu $2, $sp, $2
    261 ; N32-NEXT:    sw $1, -4($2)
    262 ; N32-NEXT:    addiu $16, $sp, 8
    263 ; N32-NEXT:    ori $6, $zero, 65520
    264 ; N32-NEXT:    jal memcpy
    265 ; N32-NEXT:    move $4, $16
    266 ; N32-NEXT:    addiu $5, $16, 64
    267 ; N32-NEXT:    ori $1, $zero, 65456
    268 ; N32-NEXT:    subu $sp, $sp, $1
    269 ; N32-NEXT:    ori $6, $zero, 65456
    270 ; N32-NEXT:    jal memcpy
    271 ; N32-NEXT:    move $4, $sp
    272 ; N32-NEXT:    ld $11, 64($sp)
    273 ; N32-NEXT:    ld $10, 56($sp)
    274 ; N32-NEXT:    ld $9, 48($sp)
    275 ; N32-NEXT:    ld $8, 40($sp)
    276 ; N32-NEXT:    ld $7, 32($sp)
    277 ; N32-NEXT:    ld $6, 24($sp)
    278 ; N32-NEXT:    ld $5, 16($sp)
    279 ; N32-NEXT:    jal f2
    280 ; N32-NEXT:    ld $4, 8($sp)
    281 ; N32-NEXT:    ori $1, $zero, 65456
    282 ; N32-NEXT:    addu $sp, $sp, $1
    283 ; N32-NEXT:    lui $1, 1
    284 ; N32-NEXT:    addu $1, $sp, $1
    285 ; N32-NEXT:    ld $16, 0($1) # 8-byte Folded Reload
    286 ; N32-NEXT:    lui $1, 1
    287 ; N32-NEXT:    addu $1, $sp, $1
    288 ; N32-NEXT:    ld $ra, 8($1) # 8-byte Folded Reload
    289 ; N32-NEXT:    lui $1, 1
    290 ; N32-NEXT:    addiu $1, $1, 16
    291 ; N32-NEXT:    jr $ra
    292 ; N32-NEXT:    addu $sp, $sp, $1
    293 ;
    294 ; N64-LABEL: g2:
    295 ; N64:       # %bb.0: # %entry
    296 ; N64-NEXT:    lui $1, 1
    297 ; N64-NEXT:    daddiu $1, $1, 16
    298 ; N64-NEXT:    dsubu $sp, $sp, $1
    299 ; N64-NEXT:    .cfi_def_cfa_offset 65552
    300 ; N64-NEXT:    lui $1, 1
    301 ; N64-NEXT:    daddu $1, $sp, $1
    302 ; N64-NEXT:    sd $ra, 8($1) # 8-byte Folded Spill
    303 ; N64-NEXT:    lui $1, 1
    304 ; N64-NEXT:    daddu $1, $sp, $1
    305 ; N64-NEXT:    sd $16, 0($1) # 8-byte Folded Spill
    306 ; N64-NEXT:    .cfi_offset 31, -8
    307 ; N64-NEXT:    .cfi_offset 16, -16
    308 ; N64-NEXT:    move $5, $4
    309 ; N64-NEXT:    lui $1, 1
    310 ; N64-NEXT:    daddu $1, $sp, $1
    311 ; N64-NEXT:    sd $4, -8($1)
    312 ; N64-NEXT:    daddiu $16, $sp, 8
    313 ; N64-NEXT:    ori $6, $zero, 65520
    314 ; N64-NEXT:    jal memcpy
    315 ; N64-NEXT:    move $4, $16
    316 ; N64-NEXT:    ori $1, $zero, 65456
    317 ; N64-NEXT:    dsubu $sp, $sp, $1
    318 ; N64-NEXT:    daddiu $5, $16, 64
    319 ; N64-NEXT:    ori $6, $zero, 65456
    320 ; N64-NEXT:    jal memcpy
    321 ; N64-NEXT:    move $4, $sp
    322 ; N64-NEXT:    ld $11, 64($sp)
    323 ; N64-NEXT:    ld $10, 56($sp)
    324 ; N64-NEXT:    ld $9, 48($sp)
    325 ; N64-NEXT:    ld $8, 40($sp)
    326 ; N64-NEXT:    ld $7, 32($sp)
    327 ; N64-NEXT:    ld $6, 24($sp)
    328 ; N64-NEXT:    ld $5, 16($sp)
    329 ; N64-NEXT:    jal f2
    330 ; N64-NEXT:    ld $4, 8($sp)
    331 ; N64-NEXT:    ori $1, $zero, 65456
    332 ; N64-NEXT:    daddu $sp, $sp, $1
    333 ; N64-NEXT:    lui $1, 1
    334 ; N64-NEXT:    daddu $1, $sp, $1
    335 ; N64-NEXT:    ld $16, 0($1) # 8-byte Folded Reload
    336 ; N64-NEXT:    lui $1, 1
    337 ; N64-NEXT:    daddu $1, $sp, $1
    338 ; N64-NEXT:    ld $ra, 8($1) # 8-byte Folded Reload
    339 ; N64-NEXT:    lui $1, 1
    340 ; N64-NEXT:    daddiu $1, $1, 16
    341 ; N64-NEXT:    jr $ra
    342 ; N64-NEXT:    daddu $sp, $sp, $1
    343 entry:
    344   %a.addr = alloca %struct.S1*, align 4
    345   %byval-temp = alloca %struct.S1, align 4
    346   store %struct.S1* %a, %struct.S1** %a.addr, align 4
    347   %0 = load %struct.S1*, %struct.S1** %a.addr, align 4
    348   %1 = bitcast %struct.S1* %byval-temp to i8*
    349   %2 = bitcast %struct.S1* %0 to i8*
    350   call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %1, i8* align 1 %2, i32 65520, i1 false)
    351   call void @f2(%struct.S1* byval align 4 %byval-temp)
    352   ret void
    353 }
    354 
    355 ; O32-SDAG-LABEL: Initial selection DAG: %bb.0 'g3:entry'
    356 ; O32-SDAG:   t{{.*}}: ch,glue = callseq_start t{{.*}}, TargetConstant:i32<16>
    357 ; O32-SDAG:   t{{.*}}: ch,glue = MipsISD::JmpLink t{{.*}}, TargetExternalSymbol:i32'memcpy'
    358 ; O32-SDAG:   t{{.*}}: ch,glue = callseq_end t{{.*}}, TargetConstant:i32<16>
    359 
    360 ; N32-SDAG-LABEL: Initial selection DAG: %bb.0 'g3:entry'
    361 ; N32-SDAG:   t{{.*}}: ch,glue = callseq_start t{{.*}}, TargetConstant:i32<0>
    362 ; N32-SDAG:   t{{.*}}: ch,glue = MipsISD::JmpLink t{{.*}}, TargetExternalSymbol:i32'memcpy'
    363 ; N32-SDAG:   t{{.*}}: ch,glue = callseq_end t{{.*}}, TargetConstant:i32<0>
    364 
    365 ; N64-SDAG-LABEL: Initial selection DAG: %bb.0 'g3:entry'
    366 ; N64-SDAG:   t{{.*}}: ch,glue = callseq_start t{{.*}}, TargetConstant:i64<0>
    367 ; N64-SDAG:   t{{.*}}: ch,glue = MipsISD::JmpLink t{{.*}}, TargetExternalSymbol:i64'memcpy'
    368 ; N64-SDAG:   t{{.*}}: ch,glue = callseq_end t{{.*}}, TargetConstant:i64<0>
    369 
    370 define dso_local i32 @g3(%struct.S1* %a, %struct.S1* %b) #0 {
    371 ; O32-LABEL: g3:
    372 ; O32:       # %bb.0: # %entry
    373 ; O32-NEXT:    addiu $sp, $sp, -32
    374 ; O32-NEXT:    .cfi_def_cfa_offset 32
    375 ; O32-NEXT:    sw $ra, 28($sp) # 4-byte Folded Spill
    376 ; O32-NEXT:    .cfi_offset 31, -4
    377 ; O32-NEXT:    sw $5, 20($sp)
    378 ; O32-NEXT:    sw $4, 24($sp)
    379 ; O32-NEXT:    jal memcpy
    380 ; O32-NEXT:    ori $6, $zero, 65520
    381 ; O32-NEXT:    addiu $2, $zero, 4
    382 ; O32-NEXT:    lw $ra, 28($sp) # 4-byte Folded Reload
    383 ; O32-NEXT:    jr $ra
    384 ; O32-NEXT:    addiu $sp, $sp, 32
    385 ;
    386 ; N32-LABEL: g3:
    387 ; N32:       # %bb.0: # %entry
    388 ; N32-NEXT:    addiu $sp, $sp, -16
    389 ; N32-NEXT:    .cfi_def_cfa_offset 16
    390 ; N32-NEXT:    sd $ra, 8($sp) # 8-byte Folded Spill
    391 ; N32-NEXT:    .cfi_offset 31, -8
    392 ; N32-NEXT:    sll $1, $5, 0
    393 ; N32-NEXT:    sw $1, 0($sp)
    394 ; N32-NEXT:    sll $1, $4, 0
    395 ; N32-NEXT:    sw $1, 4($sp)
    396 ; N32-NEXT:    jal memcpy
    397 ; N32-NEXT:    ori $6, $zero, 65520
    398 ; N32-NEXT:    addiu $2, $zero, 4
    399 ; N32-NEXT:    ld $ra, 8($sp) # 8-byte Folded Reload
    400 ; N32-NEXT:    jr $ra
    401 ; N32-NEXT:    addiu $sp, $sp, 16
    402 ;
    403 ; N64-LABEL: g3:
    404 ; N64:       # %bb.0: # %entry
    405 ; N64-NEXT:    daddiu $sp, $sp, -32
    406 ; N64-NEXT:    .cfi_def_cfa_offset 32
    407 ; N64-NEXT:    sd $ra, 24($sp) # 8-byte Folded Spill
    408 ; N64-NEXT:    .cfi_offset 31, -8
    409 ; N64-NEXT:    sd $5, 8($sp)
    410 ; N64-NEXT:    sd $4, 16($sp)
    411 ; N64-NEXT:    jal memcpy
    412 ; N64-NEXT:    ori $6, $zero, 65520
    413 ; N64-NEXT:    addiu $2, $zero, 4
    414 ; N64-NEXT:    ld $ra, 24($sp) # 8-byte Folded Reload
    415 ; N64-NEXT:    jr $ra
    416 ; N64-NEXT:    daddiu $sp, $sp, 32
    417 entry:
    418   %a.addr = alloca %struct.S1*, align 4
    419   %b.addr = alloca %struct.S1*, align 4
    420   store %struct.S1* %a, %struct.S1** %a.addr, align 4
    421   store %struct.S1* %b, %struct.S1** %b.addr, align 4
    422   %0 = load %struct.S1*, %struct.S1** %a.addr, align 4
    423   %1 = bitcast %struct.S1* %0 to i8*
    424   %2 = load %struct.S1*, %struct.S1** %b.addr, align 4
    425   %3 = bitcast %struct.S1* %2 to i8*
    426   call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 1 %1, i8* align 1 %3, i32 65520, i1 false)
    427   ret i32 4
    428 }
    429 
    430 declare void @llvm.memcpy.p0i8.p0i8.i32(i8* nocapture writeonly, i8* nocapture readonly, i32, i1) #2
    431