Skip to content

Commit 0f47e3a

Browse files
authored
[LoongArch] Eliminate the redundant sign extension of division (#107971)
If all incoming values of `div.d` are sign-extended and all users only use the lower 32 bits, then convert them to W versions. Fixes: #107946
1 parent 083e25c commit 0f47e3a

File tree

2 files changed

+17
-4
lines changed

2 files changed

+17
-4
lines changed

llvm/lib/Target/LoongArch/LoongArchOptWInstrs.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -637,6 +637,19 @@ static bool isSignExtendedW(Register SrcReg, const LoongArchSubtarget &ST,
637637
break;
638638
}
639639
return false;
640+
// If all incoming values are sign-extended and all users only use
641+
// the lower 32 bits, then convert them to W versions.
642+
case LoongArch::DIV_D: {
643+
if (!AddRegToWorkList(MI->getOperand(1).getReg()))
644+
return false;
645+
if (!AddRegToWorkList(MI->getOperand(2).getReg()))
646+
return false;
647+
if (hasAllWUsers(*MI, ST, MRI)) {
648+
FixableDef.insert(MI);
649+
break;
650+
}
651+
return false;
652+
}
640653
}
641654
}
642655

@@ -651,6 +664,8 @@ static unsigned getWOp(unsigned Opcode) {
651664
return LoongArch::ADDI_W;
652665
case LoongArch::ADD_D:
653666
return LoongArch::ADD_W;
667+
case LoongArch::DIV_D:
668+
return LoongArch::DIV_W;
654669
case LoongArch::LD_D:
655670
case LoongArch::LD_WU:
656671
return LoongArch::LD_W;

llvm/test/CodeGen/LoongArch/ir-instruction/sdiv-udiv-srem-urem.ll

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -191,8 +191,7 @@ define signext i32 @sdiv_si32_ui32_ui32(i32 %a, i32 %b) {
191191
; LA64: # %bb.0: # %entry
192192
; LA64-NEXT: addi.w $a1, $a1, 0
193193
; LA64-NEXT: addi.w $a0, $a0, 0
194-
; LA64-NEXT: div.d $a0, $a0, $a1
195-
; LA64-NEXT: addi.w $a0, $a0, 0
194+
; LA64-NEXT: div.w $a0, $a0, $a1
196195
; LA64-NEXT: ret
197196
;
198197
; LA32-TRAP-LABEL: sdiv_si32_ui32_ui32:
@@ -208,12 +207,11 @@ define signext i32 @sdiv_si32_ui32_ui32(i32 %a, i32 %b) {
208207
; LA64-TRAP: # %bb.0: # %entry
209208
; LA64-TRAP-NEXT: addi.w $a1, $a1, 0
210209
; LA64-TRAP-NEXT: addi.w $a0, $a0, 0
211-
; LA64-TRAP-NEXT: div.d $a0, $a0, $a1
210+
; LA64-TRAP-NEXT: div.w $a0, $a0, $a1
212211
; LA64-TRAP-NEXT: bnez $a1, .LBB5_2
213212
; LA64-TRAP-NEXT: # %bb.1: # %entry
214213
; LA64-TRAP-NEXT: break 7
215214
; LA64-TRAP-NEXT: .LBB5_2: # %entry
216-
; LA64-TRAP-NEXT: addi.w $a0, $a0, 0
217215
; LA64-TRAP-NEXT: ret
218216
entry:
219217
%r = sdiv i32 %a, %b

0 commit comments

Comments
 (0)