Changeset View
Changeset View
Standalone View
Standalone View
llvm/test/CodeGen/AArch64/avoid-zero-copy.mir
# Check that we can remove the redundant save of constant registers such as $wzr | # Check that we can remove the redundant save of constant registers such as $wzr | ||||
# RUN: llc -mtriple=aarch64-unknown-linux %s -start-before=machine-cp -o - | FileCheck %s --check-prefix ASM | # RUN: llc -mtriple=aarch64-unknown-linux %s -start-before=machine-cp -o - | FileCheck %s --check-prefix ASM | ||||
# RUN: llc -mtriple=aarch64-unknown-linux %s -run-pass=machine-cp -o - | FileCheck %s | # RUN: llc -mtriple=aarch64-unknown-linux %s -run-pass=machine-cp -o - | FileCheck %s | ||||
--- | | --- | | ||||
target triple = "aarch64-unknown-linux" | target triple = "aarch64-unknown-linux" | ||||
declare i32 @bar(i32) nounwind | declare i32 @bar(i32) nounwind | ||||
define i32 @foo() nounwind { | define i32 @foo() nounwind { | ||||
; ASM-LABEL: foo: | ; ASM-LABEL: foo: | ||||
; ASM: // %bb.0: | ; ASM: // %bb.0: | ||||
; ASM-NEXT: stp x30, x19, [sp, #-16]! // 16-byte Folded Spill | ; ASM-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill | ||||
; ASM-NEXT: mov w0, wzr | ; ASM-NEXT: mov w0, wzr | ||||
; ASM-NEXT: mov w19, wzr | |||||
; ASM-NEXT: bl bar | ; ASM-NEXT: bl bar | ||||
; ASM-NEXT: mov w0, w19 | ; ASM-NEXT: mov w0, wzr | ||||
; ASM-NEXT: ldp x30, x19, [sp], #16 // 16-byte Folded Reload | ; ASM-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload | ||||
; ASM-NEXT: ret | ; ASM-NEXT: ret | ||||
call i32 @bar(i32 0) | call i32 @bar(i32 0) | ||||
ret i32 0 | ret i32 0 | ||||
} | } | ||||
... | ... | ||||
--- | --- | ||||
name: foo | name: foo | ||||
body: | | body: | | ||||
bb.0 (%ir-block.0): | bb.0 (%ir-block.0): | ||||
; CHECK-LABEL: name: foo | ; CHECK-LABEL: name: foo | ||||
; CHECK: ADJCALLSTACKDOWN 0, 0, implicit-def dead $sp, implicit $sp | ; CHECK: ADJCALLSTACKDOWN 0, 0, implicit-def dead $sp, implicit $sp | ||||
; CHECK-NEXT: renamable $w19 = COPY $wzr | |||||
; CHECK-NEXT: $w0 = COPY $wzr | ; CHECK-NEXT: $w0 = COPY $wzr | ||||
; CHECK-NEXT: BL @bar, csr_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit $w0, implicit-def $sp, implicit-def $w0 | ; CHECK-NEXT: BL @bar, csr_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit $w0, implicit-def $sp, implicit-def $w0 | ||||
; CHECK-NEXT: ADJCALLSTACKUP 0, 0, implicit-def dead $sp, implicit $sp | ; CHECK-NEXT: ADJCALLSTACKUP 0, 0, implicit-def dead $sp, implicit $sp | ||||
; CHECK-NEXT: $w0 = COPY killed renamable $w19 | ; CHECK-NEXT: $w0 = COPY $wzr | ||||
; CHECK-NEXT: RET_ReallyLR implicit $w0 | ; CHECK-NEXT: RET_ReallyLR implicit $w0 | ||||
ADJCALLSTACKDOWN 0, 0, implicit-def dead $sp, implicit $sp | ADJCALLSTACKDOWN 0, 0, implicit-def dead $sp, implicit $sp | ||||
renamable $w19 = COPY $wzr | renamable $w19 = COPY $wzr | ||||
$w0 = COPY renamable $w19 | $w0 = COPY renamable $w19 | ||||
BL @bar, csr_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit $w0, implicit-def $sp, implicit-def $w0 | BL @bar, csr_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit $w0, implicit-def $sp, implicit-def $w0 | ||||
ADJCALLSTACKUP 0, 0, implicit-def dead $sp, implicit $sp | ADJCALLSTACKUP 0, 0, implicit-def dead $sp, implicit $sp | ||||
$w0 = COPY killed renamable $w19 | $w0 = COPY killed renamable $w19 | ||||
RET_ReallyLR implicit $w0 | RET_ReallyLR implicit $w0 | ||||
... | ... |