Skip to content

Commit 194da37

Browse files
authored
[Mips] Do not emit instruction teq if divisor is non-zero immediate value in FastISel implementation (llvm#135768)
Add a check before emitting the teq instruction to check whether the divisor is a non-zero immediate value. Fix llvm#130629.
1 parent 5bad5d8 commit 194da37

File tree

2 files changed

+33
-1
lines changed

2 files changed

+33
-1
lines changed

llvm/lib/Target/Mips/MipsFastISel.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1947,7 +1947,10 @@ bool MipsFastISel::selectDivRem(const Instruction *I, unsigned ISDOpcode) {
19471947
return false;
19481948

19491949
emitInst(DivOpc).addReg(Src0Reg).addReg(Src1Reg);
1950-
emitInst(Mips::TEQ).addReg(Src1Reg).addReg(Mips::ZERO).addImm(7);
1950+
if (!isa<ConstantInt>(I->getOperand(1)) ||
1951+
dyn_cast<ConstantInt>(I->getOperand(1))->isZero()) {
1952+
emitInst(Mips::TEQ).addReg(Src1Reg).addReg(Mips::ZERO).addImm(7);
1953+
}
19511954

19521955
Register ResultReg = createResultReg(&Mips::GPR32RegClass);
19531956
if (!ResultReg)
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2+
; RUN: llc < %s -march=mipsel -mcpu=mips32 -O0 -relocation-model=pic | FileCheck %s
3+
4+
define i32 @div_imm_non_zero(i32 signext %a) nounwind {
5+
; CHECK-LABEL: div_imm_non_zero:
6+
; CHECK: # %bb.0: # %entry
7+
; CHECK-NEXT: addiu $1, $zero, 1234
8+
; CHECK-NEXT: div $zero, $4, $1
9+
; CHECK-NEXT: mflo $2
10+
; CHECK-NEXT: jr $ra
11+
; CHECK-NEXT: nop
12+
entry:
13+
%div = sdiv i32 %a, 1234
14+
ret i32 %div
15+
}
16+
17+
define i32 @div_imm_zero(i32 signext %a) nounwind {
18+
; CHECK-LABEL: div_imm_zero:
19+
; CHECK: # %bb.0: # %entry
20+
; CHECK-NEXT: addiu $1, $zero, 0
21+
; CHECK-NEXT: div $zero, $4, $zero
22+
; CHECK-NEXT: teq $zero, $zero, 7
23+
; CHECK-NEXT: mflo $2
24+
; CHECK-NEXT: jr $ra
25+
; CHECK-NEXT: nop
26+
entry:
27+
%div = sdiv i32 %a, 0
28+
ret i32 %div
29+
}

0 commit comments

Comments
 (0)