mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-26 14:33:02 +02:00
b637264ad2
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 llvm-svn: 238755
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
|
|
}
|