Skip to content

Commit

Permalink
[mips] Check the register class before replacing materializations of …
Browse files Browse the repository at this point in the history
…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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@251622 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
Vasileios Kalintiris authored and Vasileios Kalintiris committed Oct 29, 2015
1 parent 0b88d3e commit 8bbd2ff
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 0 deletions.
5 changes: 5 additions & 0 deletions lib/Target/Mips/MipsSEISelDAGToDAG.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down
8 changes: 8 additions & 0 deletions test/CodeGen/Mips/micromips-zero-mat-uses.ll
Original file line number Diff line number Diff line change
@@ -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
}

0 comments on commit 8bbd2ff

Please sign in to comment.