Skip to content

Commit 307d124

Browse files
authored
[LegalizeTypes][RISCV][LoongArch] Optimize promotion of ucmp. (#101366)
ucmp can be promoted with either sext or zext. RISC-V and LoongArch prefer sext for promoting i32 to i64 unless the inputs are known to be zero extended already. This patch uses the existing SExtOrZExtPromotedOperands function that is used by SETCC promotion to intelligently handle this.
1 parent 3a4c7cc commit 307d124

File tree

3 files changed

+59
-24
lines changed

3 files changed

+59
-24
lines changed

llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2294,12 +2294,15 @@ SDValue DAGTypeLegalizer::PromoteIntOp_Shift(SDNode *N) {
22942294
}
22952295

22962296
SDValue DAGTypeLegalizer::PromoteIntOp_CMP(SDNode *N) {
2297-
SDValue LHS = N->getOpcode() == ISD::UCMP
2298-
? ZExtPromotedInteger(N->getOperand(0))
2299-
: SExtPromotedInteger(N->getOperand(0));
2300-
SDValue RHS = N->getOpcode() == ISD::UCMP
2301-
? ZExtPromotedInteger(N->getOperand(1))
2302-
: SExtPromotedInteger(N->getOperand(1));
2297+
SDValue LHS = N->getOperand(0);
2298+
SDValue RHS = N->getOperand(1);
2299+
2300+
if (N->getOpcode() == ISD::SCMP) {
2301+
LHS = SExtPromotedInteger(LHS);
2302+
RHS = SExtPromotedInteger(RHS);
2303+
} else {
2304+
SExtOrZExtPromotedOperands(LHS, RHS);
2305+
}
23032306

23042307
return SDValue(DAG.UpdateNodeOperands(N, LHS, RHS), 0);
23052308
}

llvm/test/CodeGen/LoongArch/ucmp.ll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ define i8 @ucmp.8.16(i16 zeroext %x, i16 zeroext %y) nounwind {
2626
define i8 @ucmp.8.32(i32 %x, i32 %y) nounwind {
2727
; CHECK-LABEL: ucmp.8.32:
2828
; CHECK: # %bb.0:
29-
; CHECK-NEXT: bstrpick.d $a1, $a1, 31, 0
30-
; CHECK-NEXT: bstrpick.d $a0, $a0, 31, 0
29+
; CHECK-NEXT: addi.w $a1, $a1, 0
30+
; CHECK-NEXT: addi.w $a0, $a0, 0
3131
; CHECK-NEXT: sltu $a2, $a0, $a1
3232
; CHECK-NEXT: sltu $a0, $a1, $a0
3333
; CHECK-NEXT: sub.d $a0, $a0, $a2
@@ -71,8 +71,8 @@ define i8 @ucmp.8.128(i128 %x, i128 %y) nounwind {
7171
define i32 @ucmp.32.32(i32 %x, i32 %y) nounwind {
7272
; CHECK-LABEL: ucmp.32.32:
7373
; CHECK: # %bb.0:
74-
; CHECK-NEXT: bstrpick.d $a1, $a1, 31, 0
75-
; CHECK-NEXT: bstrpick.d $a0, $a0, 31, 0
74+
; CHECK-NEXT: addi.w $a1, $a1, 0
75+
; CHECK-NEXT: addi.w $a0, $a0, 0
7676
; CHECK-NEXT: sltu $a2, $a0, $a1
7777
; CHECK-NEXT: sltu $a0, $a1, $a0
7878
; CHECK-NEXT: sub.d $a0, $a0, $a2

llvm/test/CodeGen/RISCV/ucmp.ll

Lines changed: 46 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,8 @@ define i8 @ucmp.8.32(i32 %x, i32 %y) nounwind {
4848
;
4949
; RV64I-LABEL: ucmp.8.32:
5050
; RV64I: # %bb.0:
51-
; RV64I-NEXT: slli a1, a1, 32
52-
; RV64I-NEXT: srli a1, a1, 32
53-
; RV64I-NEXT: slli a0, a0, 32
54-
; RV64I-NEXT: srli a0, a0, 32
51+
; RV64I-NEXT: sext.w a1, a1
52+
; RV64I-NEXT: sext.w a0, a0
5553
; RV64I-NEXT: sltu a2, a0, a1
5654
; RV64I-NEXT: sltu a0, a1, a0
5755
; RV64I-NEXT: sub a0, a0, a2
@@ -164,10 +162,44 @@ define i32 @ucmp.32.32(i32 %x, i32 %y) nounwind {
164162
;
165163
; RV64I-LABEL: ucmp.32.32:
166164
; RV64I: # %bb.0:
167-
; RV64I-NEXT: slli a1, a1, 32
168-
; RV64I-NEXT: srli a1, a1, 32
169-
; RV64I-NEXT: slli a0, a0, 32
170-
; RV64I-NEXT: srli a0, a0, 32
165+
; RV64I-NEXT: sext.w a1, a1
166+
; RV64I-NEXT: sext.w a0, a0
167+
; RV64I-NEXT: sltu a2, a0, a1
168+
; RV64I-NEXT: sltu a0, a1, a0
169+
; RV64I-NEXT: sub a0, a0, a2
170+
; RV64I-NEXT: ret
171+
%1 = call i32 @llvm.ucmp(i32 %x, i32 %y)
172+
ret i32 %1
173+
}
174+
175+
define i32 @ucmp.32.32_sext(i32 signext %x, i32 signext %y) nounwind {
176+
; RV32I-LABEL: ucmp.32.32_sext:
177+
; RV32I: # %bb.0:
178+
; RV32I-NEXT: sltu a2, a0, a1
179+
; RV32I-NEXT: sltu a0, a1, a0
180+
; RV32I-NEXT: sub a0, a0, a2
181+
; RV32I-NEXT: ret
182+
;
183+
; RV64I-LABEL: ucmp.32.32_sext:
184+
; RV64I: # %bb.0:
185+
; RV64I-NEXT: sltu a2, a0, a1
186+
; RV64I-NEXT: sltu a0, a1, a0
187+
; RV64I-NEXT: sub a0, a0, a2
188+
; RV64I-NEXT: ret
189+
%1 = call i32 @llvm.ucmp(i32 %x, i32 %y)
190+
ret i32 %1
191+
}
192+
193+
define i32 @ucmp.32.32_zext(i32 zeroext %x, i32 zeroext %y) nounwind {
194+
; RV32I-LABEL: ucmp.32.32_zext:
195+
; RV32I: # %bb.0:
196+
; RV32I-NEXT: sltu a2, a0, a1
197+
; RV32I-NEXT: sltu a0, a1, a0
198+
; RV32I-NEXT: sub a0, a0, a2
199+
; RV32I-NEXT: ret
200+
;
201+
; RV64I-LABEL: ucmp.32.32_zext:
202+
; RV64I: # %bb.0:
171203
; RV64I-NEXT: sltu a2, a0, a1
172204
; RV64I-NEXT: sltu a0, a1, a0
173205
; RV64I-NEXT: sub a0, a0, a2
@@ -179,13 +211,13 @@ define i32 @ucmp.32.32(i32 %x, i32 %y) nounwind {
179211
define i32 @ucmp.32.64(i64 %x, i64 %y) nounwind {
180212
; RV32I-LABEL: ucmp.32.64:
181213
; RV32I: # %bb.0:
182-
; RV32I-NEXT: beq a1, a3, .LBB6_2
214+
; RV32I-NEXT: beq a1, a3, .LBB8_2
183215
; RV32I-NEXT: # %bb.1:
184216
; RV32I-NEXT: sltu a4, a1, a3
185217
; RV32I-NEXT: sltu a0, a3, a1
186218
; RV32I-NEXT: sub a0, a0, a4
187219
; RV32I-NEXT: ret
188-
; RV32I-NEXT: .LBB6_2:
220+
; RV32I-NEXT: .LBB8_2:
189221
; RV32I-NEXT: sltu a4, a0, a2
190222
; RV32I-NEXT: sltu a0, a2, a0
191223
; RV32I-NEXT: sub a0, a0, a4
@@ -204,15 +236,15 @@ define i32 @ucmp.32.64(i64 %x, i64 %y) nounwind {
204236
define i64 @ucmp.64.64(i64 %x, i64 %y) nounwind {
205237
; RV32I-LABEL: ucmp.64.64:
206238
; RV32I: # %bb.0:
207-
; RV32I-NEXT: beq a1, a3, .LBB7_2
239+
; RV32I-NEXT: beq a1, a3, .LBB9_2
208240
; RV32I-NEXT: # %bb.1:
209241
; RV32I-NEXT: sltu a4, a1, a3
210242
; RV32I-NEXT: sltu a0, a3, a1
211-
; RV32I-NEXT: j .LBB7_3
212-
; RV32I-NEXT: .LBB7_2:
243+
; RV32I-NEXT: j .LBB9_3
244+
; RV32I-NEXT: .LBB9_2:
213245
; RV32I-NEXT: sltu a4, a0, a2
214246
; RV32I-NEXT: sltu a0, a2, a0
215-
; RV32I-NEXT: .LBB7_3:
247+
; RV32I-NEXT: .LBB9_3:
216248
; RV32I-NEXT: sub a0, a0, a4
217249
; RV32I-NEXT: srai a1, a0, 31
218250
; RV32I-NEXT: ret

0 commit comments

Comments
 (0)