mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-11-03 14:21:30 +00:00
[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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@238755 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
18
test/CodeGen/Mips/Fast-ISel/mul1.ll
Normal file
18
test/CodeGen/Mips/Fast-ISel/mul1.ll
Normal file
@@ -0,0 +1,18 @@
|
||||
; 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
|
||||
}
|
||||
Reference in New Issue
Block a user