forked from OSchip/llvm-project
[mips] Check the register class before replacing materializations of zero with $zero in microMIPS.
Summary: The microMIPS register class GPRMM16 does not contain the $zero register. However, MipsSEDAGToDAGISel::replaceUsesWithZeroReg() would replace uses of the $dst register: [d]addiu, $dst, $zero, 0 with the $zero register, without checking for membership in the register class of the target machine operand. Reviewers: dsanders Subscribers: llvm-commits, dsanders Differential Revision: http://reviews.llvm.org/D13984 llvm-svn: 251622
This commit is contained in:
parent
83390e45b3
commit
2f412684a9
|
@ -115,6 +115,11 @@ bool MipsSEDAGToDAGISel::replaceUsesWithZeroReg(MachineRegisterInfo *MRI,
|
|||
if (MI->isPHI() || MI->isRegTiedToDefOperand(OpNo) || MI->isPseudo())
|
||||
continue;
|
||||
|
||||
// Also, we have to check that the register class of the operand
|
||||
// contains the zero register.
|
||||
if (!MRI->getRegClass(MO.getReg())->contains(ZeroReg))
|
||||
continue;
|
||||
|
||||
MO.setReg(ZeroReg);
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,8 @@
|
|||
; RUN: llc -march=mips -mcpu=mips32r2 -mattr=+micromips,+nooddspreg -O0 < %s | FileCheck %s
|
||||
|
||||
; CHECK: addiu $[[R0:[0-9]+]], $zero, 0
|
||||
; CHECK: subu16 $2, $[[R0]], ${{[0-9]+}}
|
||||
define i32 @foo() {
|
||||
%1 = sub i32 0, undef
|
||||
ret i32 %1
|
||||
}
|
Loading…
Reference in New Issue