diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -10663,9 +10663,9 @@ bool llvm::isOneOrOneSplat(SDValue N, bool AllowUndefs) { // TODO: may want to use peekThroughBitcast() here. - unsigned BitWidth = N.getScalarValueSizeInBits(); - ConstantSDNode *C = isConstOrConstSplat(N, AllowUndefs); - return C && C->isOne() && C->getValueSizeInBits(0) == BitWidth; + ConstantSDNode *C = + isConstOrConstSplat(N, AllowUndefs, /*AllowTruncation*/ true); + return C && C->isOne(); } bool llvm::isAllOnesOrAllOnesSplat(SDValue N, bool AllowUndefs) { diff --git a/llvm/test/CodeGen/AArch64/add-negative.ll b/llvm/test/CodeGen/AArch64/add-negative.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/AArch64/add-negative.ll @@ -0,0 +1,20 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py +; RUN: llc -verify-machineinstrs -o - %s -mtriple=aarch64-linux-gnu | FileCheck %s + +define <8 x i16> @add_to_sub(<8 x i16> %0, <8 x i16> %1) { +; CHECK-LABEL: add_to_sub: +; CHECK: // %bb.0: +; CHECK-NEXT: adrp x8, .LCPI0_0 +; CHECK-NEXT: ldr q2, [x8, :lo12:.LCPI0_0] +; CHECK-NEXT: cmhi v0.8h, v2.8h, v0.8h +; CHECK-NEXT: cmhi v1.8h, v2.8h, v1.8h +; CHECK-NEXT: sub v0.8h, v0.8h, v1.8h +; CHECK-NEXT: ret + %3 = icmp ult <8 x i16> %0, + %4 = sext <8 x i1> %3 to <8 x i16> + %5 = icmp ult <8 x i16> %1, + %6 = zext <8 x i1> %5 to <8 x i16> + %7 = add nsw <8 x i16> %6, %4 + ret <8 x i16> %7 +} + diff --git a/llvm/test/CodeGen/AArch64/minmax.ll b/llvm/test/CodeGen/AArch64/minmax.ll --- a/llvm/test/CodeGen/AArch64/minmax.ll +++ b/llvm/test/CodeGen/AArch64/minmax.ll @@ -123,10 +123,8 @@ ; CHECK-LABEL: t12: ; CHECK: // %bb.0: ; CHECK-NEXT: cmhi v2.16b, v1.16b, v0.16b -; CHECK-NEXT: movi v3.16b, #1 ; CHECK-NEXT: bif v0.16b, v1.16b, v2.16b -; CHECK-NEXT: and v1.16b, v2.16b, v3.16b -; CHECK-NEXT: add v0.16b, v1.16b, v0.16b +; CHECK-NEXT: sub v0.16b, v0.16b, v2.16b ; CHECK-NEXT: ret %t1 = icmp ugt <16 x i8> %b, %a %t2 = select <16 x i1> %t1, <16 x i8> %a, <16 x i8> %b