Before this patch, redundant COPY couldn't be removed for the following case: ``` $R0 = OP ... ... // Read of %R0 $R1 = COPY killed $R0 ``` This patch adds support for tracking the users of the source register during backward propagation, so that we can remove the redundant COPY in the above case and optimize it to: ``` $R1 = OP ... ... // Replace all uses of %R0 with $R1 ```
123 lines
4.7 KiB
LLVM
123 lines
4.7 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
|
|
|
; RUN: llc -march=mips -verify-machineinstrs \
|
|
; RUN: < %s | FileCheck %s -check-prefix=MIPS32
|
|
; RUN: llc -march=mips -verify-machineinstrs -relocation-model=pic \
|
|
; RUN: < %s | FileCheck %s -check-prefix=MIPS32-PIC
|
|
; RUN: llc -march=mips64 -verify-machineinstrs \
|
|
; RUN: < %s | FileCheck %s -check-prefix=MIPS64
|
|
; RUN: llc -march=mips64 -verify-machineinstrs -relocation-model=pic \
|
|
; RUN: < %s | FileCheck %s -check-prefix=MIPS64-PIC
|
|
; RUN: llc -march=mips -verify-machineinstrs -mattr=+micromips \
|
|
; RUN: < %s | FileCheck %s -check-prefix=MIPS32-MM
|
|
; RUN: llc -march=mips -verify-machineinstrs -relocation-model=pic -mattr=+micromips \
|
|
; RUN: < %s | FileCheck %s -check-prefix=MIPS32-MM-PIC
|
|
|
|
; Test that checks ABI for _mcount calls.
|
|
|
|
define void @foo() {
|
|
; MIPS32-LABEL: foo:
|
|
; MIPS32: # %bb.0: # %entry
|
|
; MIPS32-NEXT: addiu $sp, $sp, -24
|
|
; MIPS32-NEXT: .cfi_def_cfa_offset 24
|
|
; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill
|
|
; MIPS32-NEXT: .cfi_offset 31, -4
|
|
; MIPS32-NEXT: move $1, $ra
|
|
; MIPS32-NEXT: jal _mcount
|
|
; MIPS32-NEXT: addiu $sp, $sp, -8
|
|
; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload
|
|
; MIPS32-NEXT: jr $ra
|
|
; MIPS32-NEXT: addiu $sp, $sp, 24
|
|
;
|
|
; MIPS32-PIC-LABEL: foo:
|
|
; MIPS32-PIC: # %bb.0: # %entry
|
|
; MIPS32-PIC-NEXT: lui $2, %hi(_gp_disp)
|
|
; MIPS32-PIC-NEXT: addiu $2, $2, %lo(_gp_disp)
|
|
; MIPS32-PIC-NEXT: addiu $sp, $sp, -24
|
|
; MIPS32-PIC-NEXT: .cfi_def_cfa_offset 24
|
|
; MIPS32-PIC-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill
|
|
; MIPS32-PIC-NEXT: .cfi_offset 31, -4
|
|
; MIPS32-PIC-NEXT: addu $gp, $2, $25
|
|
; MIPS32-PIC-NEXT: lw $25, %call16(_mcount)($gp)
|
|
; MIPS32-PIC-NEXT: move $1, $ra
|
|
; MIPS32-PIC-NEXT: .reloc ($tmp0), R_MIPS_JALR, _mcount
|
|
; MIPS32-PIC-NEXT: $tmp0:
|
|
; MIPS32-PIC-NEXT: jalr $25
|
|
; MIPS32-PIC-NEXT: addiu $sp, $sp, -8
|
|
; MIPS32-PIC-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload
|
|
; MIPS32-PIC-NEXT: jr $ra
|
|
; MIPS32-PIC-NEXT: addiu $sp, $sp, 24
|
|
;
|
|
; MIPS64-LABEL: foo:
|
|
; MIPS64: # %bb.0: # %entry
|
|
; MIPS64-NEXT: daddiu $sp, $sp, -16
|
|
; MIPS64-NEXT: .cfi_def_cfa_offset 16
|
|
; MIPS64-NEXT: sd $ra, 8($sp) # 8-byte Folded Spill
|
|
; MIPS64-NEXT: .cfi_offset 31, -8
|
|
; MIPS64-NEXT: move $1, $ra
|
|
; MIPS64-NEXT: jal _mcount
|
|
; MIPS64-NEXT: nop
|
|
; MIPS64-NEXT: ld $ra, 8($sp) # 8-byte Folded Reload
|
|
; MIPS64-NEXT: jr $ra
|
|
; MIPS64-NEXT: daddiu $sp, $sp, 16
|
|
;
|
|
; MIPS64-PIC-LABEL: foo:
|
|
; MIPS64-PIC: # %bb.0: # %entry
|
|
; MIPS64-PIC-NEXT: daddiu $sp, $sp, -16
|
|
; MIPS64-PIC-NEXT: .cfi_def_cfa_offset 16
|
|
; MIPS64-PIC-NEXT: sd $ra, 8($sp) # 8-byte Folded Spill
|
|
; MIPS64-PIC-NEXT: sd $gp, 0($sp) # 8-byte Folded Spill
|
|
; MIPS64-PIC-NEXT: .cfi_offset 31, -8
|
|
; MIPS64-PIC-NEXT: .cfi_offset 28, -16
|
|
; MIPS64-PIC-NEXT: lui $1, %hi(%neg(%gp_rel(foo)))
|
|
; MIPS64-PIC-NEXT: daddu $1, $1, $25
|
|
; MIPS64-PIC-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(foo)))
|
|
; MIPS64-PIC-NEXT: ld $25, %call16(_mcount)($gp)
|
|
; MIPS64-PIC-NEXT: move $1, $ra
|
|
; MIPS64-PIC-NEXT: .reloc .Ltmp0, R_MIPS_JALR, _mcount
|
|
; MIPS64-PIC-NEXT: .Ltmp0:
|
|
; MIPS64-PIC-NEXT: jalr $25
|
|
; MIPS64-PIC-NEXT: nop
|
|
; MIPS64-PIC-NEXT: ld $gp, 0($sp) # 8-byte Folded Reload
|
|
; MIPS64-PIC-NEXT: ld $ra, 8($sp) # 8-byte Folded Reload
|
|
; MIPS64-PIC-NEXT: jr $ra
|
|
; MIPS64-PIC-NEXT: daddiu $sp, $sp, 16
|
|
;
|
|
; MIPS32-MM-LABEL: foo:
|
|
; MIPS32-MM: # %bb.0: # %entry
|
|
; MIPS32-MM-NEXT: addiu $sp, $sp, -24
|
|
; MIPS32-MM-NEXT: .cfi_def_cfa_offset 24
|
|
; MIPS32-MM-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill
|
|
; MIPS32-MM-NEXT: .cfi_offset 31, -4
|
|
; MIPS32-MM-NEXT: move $1, $ra
|
|
; MIPS32-MM-NEXT: jal _mcount
|
|
; MIPS32-MM-NEXT: addiu $sp, $sp, -8
|
|
; MIPS32-MM-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload
|
|
; MIPS32-MM-NEXT: jr $ra
|
|
; MIPS32-MM-NEXT: addiu $sp, $sp, 24
|
|
;
|
|
; MIPS32-MM-PIC-LABEL: foo:
|
|
; MIPS32-MM-PIC: # %bb.0: # %entry
|
|
; MIPS32-MM-PIC-NEXT: lui $2, %hi(_gp_disp)
|
|
; MIPS32-MM-PIC-NEXT: addiu $2, $2, %lo(_gp_disp)
|
|
; MIPS32-MM-PIC-NEXT: addiu $sp, $sp, -24
|
|
; MIPS32-MM-PIC-NEXT: .cfi_def_cfa_offset 24
|
|
; MIPS32-MM-PIC-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill
|
|
; MIPS32-MM-PIC-NEXT: .cfi_offset 31, -4
|
|
; MIPS32-MM-PIC-NEXT: addu $gp, $2, $25
|
|
; MIPS32-MM-PIC-NEXT: lw $25, %call16(_mcount)($gp)
|
|
; MIPS32-MM-PIC-NEXT: move $1, $ra
|
|
; MIPS32-MM-PIC-NEXT: .reloc ($tmp0), R_MICROMIPS_JALR, _mcount
|
|
; MIPS32-MM-PIC-NEXT: $tmp0:
|
|
; MIPS32-MM-PIC-NEXT: jalr $25
|
|
; MIPS32-MM-PIC-NEXT: addiu $sp, $sp, -8
|
|
; MIPS32-MM-PIC-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload
|
|
; MIPS32-MM-PIC-NEXT: jr $ra
|
|
; MIPS32-MM-PIC-NEXT: addiu $sp, $sp, 24
|
|
entry:
|
|
call void @_mcount()
|
|
ret void
|
|
}
|
|
|
|
declare void @_mcount()
|