Skip to content

Commit f21da38

Browse files
RKSimonyuxuanchen1997
authored andcommitted
[DAG] ComputeNumSignBits - subo_carry(x,x,c) -> bitwidth 'allsignbits' (#99935)
Summary: Handle cases where the subo_carry is subtracting the same operand (=zero) - so only the subtraction of the 0/1 carry bit is affecting the result, giving a 0/-1 allsignbits value. Noticed while improving ABDS/ABDU expansion. Test Plan: Reviewers: Subscribers: Tasks: Tags: Differential Revision: https://phabricator.intern.facebook.com/D60251058
1 parent 6667bc9 commit f21da38

File tree

4 files changed

+14
-14
lines changed

4 files changed

+14
-14
lines changed

llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4705,14 +4705,18 @@ unsigned SelectionDAG::ComputeNumSignBits(SDValue Op, const APInt &DemandedElts,
47054705
return 1; // Early out.
47064706
Tmp2 = ComputeNumSignBits(Op.getOperand(1), DemandedElts, Depth + 1);
47074707
return std::min(Tmp, Tmp2);
4708+
case ISD::SSUBO_CARRY:
4709+
case ISD::USUBO_CARRY:
4710+
// sub_carry(x,x,c) -> 0/-1 (sext carry)
4711+
if (Op.getResNo() == 0 && Op.getOperand(0) == Op.getOperand(1))
4712+
return VTBits;
4713+
[[fallthrough]];
47084714
case ISD::SADDO:
47094715
case ISD::UADDO:
47104716
case ISD::SADDO_CARRY:
47114717
case ISD::UADDO_CARRY:
47124718
case ISD::SSUBO:
47134719
case ISD::USUBO:
4714-
case ISD::SSUBO_CARRY:
4715-
case ISD::USUBO_CARRY:
47164720
case ISD::SMULO:
47174721
case ISD::UMULO:
47184722
if (Op.getResNo() != 1)

llvm/test/CodeGen/AArch64/neon-abd.ll

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -332,8 +332,6 @@ define <2 x i64> @uabd_2d(<2 x i64> %a, <2 x i64> %b) #0 {
332332
; CHECK-NEXT: ngc x9, xzr
333333
; CHECK-NEXT: subs x10, x10, x11
334334
; CHECK-NEXT: ngc x11, xzr
335-
; CHECK-NEXT: asr x9, x9, #63
336-
; CHECK-NEXT: asr x11, x11, #63
337335
; CHECK-NEXT: eor x8, x8, x9
338336
; CHECK-NEXT: eor x10, x10, x11
339337
; CHECK-NEXT: sub x8, x8, x9

llvm/test/CodeGen/ARM/neon_vabd.ll

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -340,20 +340,20 @@ define <2 x i64> @uabd_2d(<2 x i64> %a, <2 x i64> %b) {
340340
; CHECK-NEXT: sbcs r2, r3, r12
341341
; CHECK-NEXT: sbcs r3, r1, #0
342342
; CHECK-NEXT: sbc r3, r1, #0
343-
; CHECK-NEXT: eor r0, r0, r3, asr #31
344-
; CHECK-NEXT: eor r2, r2, r3, asr #31
345-
; CHECK-NEXT: subs r0, r0, r3, asr #31
346-
; CHECK-NEXT: sbc r2, r2, r3, asr #31
343+
; CHECK-NEXT: eor r0, r0, r3
344+
; CHECK-NEXT: eor r2, r2, r3
345+
; CHECK-NEXT: subs r0, r0, r3
346+
; CHECK-NEXT: sbc r2, r2, r3
347347
; CHECK-NEXT: subs r3, r4, lr
348348
; CHECK-NEXT: sbcs r6, r5, r6
349349
; CHECK-NEXT: vmov.32 d1[0], r0
350350
; CHECK-NEXT: sbcs r5, r1, #0
351351
; CHECK-NEXT: sbc r1, r1, #0
352-
; CHECK-NEXT: eor r3, r3, r1, asr #31
353-
; CHECK-NEXT: subs r0, r3, r1, asr #31
352+
; CHECK-NEXT: eor r3, r3, r1
353+
; CHECK-NEXT: subs r0, r3, r1
354354
; CHECK-NEXT: vmov.32 d0[0], r0
355-
; CHECK-NEXT: eor r0, r6, r1, asr #31
356-
; CHECK-NEXT: sbc r0, r0, r1, asr #31
355+
; CHECK-NEXT: eor r0, r6, r1
356+
; CHECK-NEXT: sbc r0, r0, r1
357357
; CHECK-NEXT: vmov.32 d1[1], r2
358358
; CHECK-NEXT: vmov.32 d0[1], r0
359359
; CHECK-NEXT: pop {r4, r5, r6, pc}

llvm/test/CodeGen/X86/abdu.ll

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,6 @@ define i64 @abd_ext_i64(i64 %a, i64 %b) nounwind {
289289
; X86-NEXT: movl $0, %esi
290290
; X86-NEXT: sbbl %esi, %esi
291291
; X86-NEXT: sbbl %ecx, %ecx
292-
; X86-NEXT: sarl $31, %ecx
293292
; X86-NEXT: xorl %ecx, %edx
294293
; X86-NEXT: xorl %ecx, %eax
295294
; X86-NEXT: subl %ecx, %eax
@@ -325,7 +324,6 @@ define i64 @abd_ext_i64_undef(i64 %a, i64 %b) nounwind {
325324
; X86-NEXT: movl $0, %esi
326325
; X86-NEXT: sbbl %esi, %esi
327326
; X86-NEXT: sbbl %ecx, %ecx
328-
; X86-NEXT: sarl $31, %ecx
329327
; X86-NEXT: xorl %ecx, %edx
330328
; X86-NEXT: xorl %ecx, %eax
331329
; X86-NEXT: subl %ecx, %eax

0 commit comments

Comments
 (0)