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