mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-25 03:30:37 +00:00
Summary: The contents of the HI/LO registers are unpredictable after the execution of the MUL instruction. In addition to implicitly defining these registers in the MUL instruction definition, we have to mark those registers as dead too. Without this the fast register allocator is running out of registers when the MUL instruction is followed by another one that tries to allocate the AC0 register. Based on a patch by Reed Kotler. Reviewers: dsanders, rkotler Subscribers: llvm-commits, rfuhler Differential Revision: http://reviews.llvm.org/D9825 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@238755 91177308-0d34-0410-b5e6-96231b3b80d8
19 lines
617 B
LLVM
19 lines
617 B
LLVM
; RUN: llc < %s -march=mipsel -mcpu=mips32 -O0 \
|
|
; RUN: -fast-isel -mips-fast-isel -relocation-model=pic
|
|
; RUN: llc < %s -march=mipsel -mcpu=mips32r2 -O0 \
|
|
; RUN: -fast-isel -mips-fast-isel -relocation-model=pic
|
|
|
|
; The test is just to make sure it is able to allocate
|
|
; registers for this example. There was an issue with allocating AC0
|
|
; after a mul instruction.
|
|
|
|
declare { i32, i1 } @llvm.smul.with.overflow.i32(i32, i32)
|
|
|
|
define i32 @foo(i32 %a, i32 %b) {
|
|
entry:
|
|
%0 = mul i32 %a, %b
|
|
%1 = call { i32, i1 } @llvm.smul.with.overflow.i32(i32 %0, i32 %b)
|
|
%2 = extractvalue { i32, i1 } %1, 0
|
|
ret i32 %2
|
|
}
|