1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-26 14:33:02 +02:00
llvm-mirror/test/CodeGen/Mips/Fast-ISel/mul1.ll
Vasileios Kalintiris b637264ad2 [mips][FastISel] Clobber HI0/LO0 registers in MUL instructions.
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
2015-06-01 15:48:09 +00:00

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
}