Skip to content

Commit 750247b

Browse files
committed
[ARM] Fix APInt assert for CSNEG known bits.
Use APInt::getAllOnes(32), to avoid the assert when constructing an APInt from -1.
1 parent 74003f1 commit 750247b

File tree

2 files changed

+17
-2
lines changed

2 files changed

+17
-2
lines changed

llvm/lib/Target/ARM/ARMISelLowering.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20138,8 +20138,8 @@ void ARMTargetLowering::computeKnownBitsForTargetNode(const SDValue Op,
2013820138
else if (Op.getOpcode() == ARMISD::CSINV)
2013920139
std::swap(KnownOp1.Zero, KnownOp1.One);
2014020140
else if (Op.getOpcode() == ARMISD::CSNEG)
20141-
KnownOp1 = KnownBits::mul(
20142-
KnownOp1, KnownBits::makeConstant(APInt(32, -1)));
20141+
KnownOp1 = KnownBits::mul(KnownOp1,
20142+
KnownBits::makeConstant(APInt::getAllOnes(32)));
2014320143

2014420144
Known = KnownOp0.intersectWith(KnownOp1);
2014520145
break;

llvm/test/CodeGen/Thumb2/csel.ll

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -364,3 +364,18 @@ entry:
364364
%t = xor i32 %s, %spec.select
365365
ret i32 %t
366366
}
367+
368+
define i32 @test_known_bits(i32 %a, i32 %b) {
369+
; CHECK-LABEL: test_known_bits:
370+
; CHECK: @ %bb.0: @ %entry
371+
; CHECK-NEXT: movs r2, #1
372+
; CHECK-NEXT: cmp r0, #0
373+
; CHECK-NEXT: cneg r0, r2, mi
374+
; CHECK-NEXT: add r0, r1
375+
; CHECK-NEXT: bx lr
376+
entry:
377+
%c = icmp slt i32 %a, 0
378+
%s = select i1 %c, i32 -1, i32 1
379+
%t = add i32 %s, %b
380+
ret i32 %t
381+
}

0 commit comments

Comments
 (0)