Skip to content

Commit 126d7ba

Browse files
committed
[Mips] Do not emit instruction teq if divisor is non-zero immediate value in FastISel implementation
Add a check before emitting the teq instruction to check whether the divisor is a non-zero immediate value. Fix #130629.
1 parent e65faed commit 126d7ba

File tree

2 files changed

+47
-1
lines changed

2 files changed

+47
-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: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
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 $sp, $sp, -8
8+
; CHECK-NEXT: sw $4, 4($sp)
9+
; CHECK-NEXT: lw $1, 4($sp)
10+
; CHECK-NEXT: addiu $2, $zero, 1234
11+
; CHECK-NEXT: div $zero, $1, $2
12+
; CHECK-NEXT: mflo $2
13+
; CHECK-NEXT: addiu $sp, $sp, 8
14+
; CHECK-NEXT: jr $ra
15+
; CHECK-NEXT: nop
16+
entry:
17+
%a.addr = alloca i32, align 4
18+
store i32 %a, ptr %a.addr, align 4
19+
%0 = load i32, ptr %a.addr, align 4
20+
%div = sdiv i32 %0, 1234
21+
ret i32 %div
22+
}
23+
24+
define i32 @div_imm_zero(i32 signext %a) nounwind {
25+
; CHECK-LABEL: div_imm_zero:
26+
; CHECK: # %bb.0: # %entry
27+
; CHECK-NEXT: addiu $sp, $sp, -8
28+
; CHECK-NEXT: sw $4, 4($sp)
29+
; CHECK-NEXT: lw $1, 4($sp)
30+
; CHECK-NEXT: addiu $2, $zero, 0
31+
; CHECK-NEXT: div $zero, $1, $zero
32+
; CHECK-NEXT: teq $zero, $zero, 7
33+
; CHECK-NEXT: mflo $2
34+
; CHECK-NEXT: addiu $sp, $sp, 8
35+
; CHECK-NEXT: jr $ra
36+
; CHECK-NEXT: nop
37+
entry:
38+
%a.addr = alloca i32, align 4
39+
store i32 %a, ptr %a.addr, align 4
40+
%0 = load i32, ptr %a.addr, align 4
41+
%div = sdiv i32 %0, 0
42+
ret i32 %div
43+
}

0 commit comments

Comments
 (0)