Skip to content

Commit 8fa06ea

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 8fa06ea

File tree

2 files changed

+27
-1
lines changed

2 files changed

+27
-1
lines changed

llvm/lib/Target/Mips/MipsFastISel.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1947,7 +1947,11 @@ 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+
(isa<ConstantInt>(I->getOperand(1)) &&
1952+
dyn_cast<ConstantInt>(I->getOperand(1))->isZero())) {
1953+
emitInst(Mips::TEQ).addReg(Src1Reg).addReg(Mips::ZERO).addImm(7);
1954+
}
19511955

19521956
Register ResultReg = createResultReg(&Mips::GPR32RegClass);
19531957
if (!ResultReg)
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
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+
}

0 commit comments

Comments
 (0)