Skip to content

Commit 427f8b0

Browse files
committed
Fix unassigned add handling in aarch64
1 parent 691b97c commit 427f8b0

File tree

2 files changed

+20
-3
lines changed

2 files changed

+20
-3
lines changed

llvm/lib/Target/AArch64/AArch64ISelLowering.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5711,13 +5711,17 @@ SDValue AArch64TargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op,
57115711
case Intrinsic::aarch64_neon_urhadd:
57125712
case Intrinsic::aarch64_neon_shadd:
57135713
case Intrinsic::aarch64_neon_uhadd: {
5714+
bool IsUnsignedAdd = IntNo == Intrinsic::aarch64_neon_uhadd;
57145715
bool IsSignedAdd = (IntNo == Intrinsic::aarch64_neon_srhadd ||
57155716
IntNo == Intrinsic::aarch64_neon_shadd);
57165717
bool IsRoundingAdd = (IntNo == Intrinsic::aarch64_neon_srhadd ||
57175718
IntNo == Intrinsic::aarch64_neon_urhadd);
5718-
unsigned Opcode = IsSignedAdd
5719-
? (IsRoundingAdd ? ISD::AVGCEILS : ISD::AVGFLOORS)
5720-
: (IsRoundingAdd ? ISD::AVGCEILU : ISD::AVGFLOORU);
5719+
unsigned Opcode;
5720+
if (IsUnsignedAdd) {
5721+
Opcode = IsRoundingAdd ? ISD::AVGCEILU : ISD::AVGFLOORU;
5722+
} else {
5723+
Opcode = IsRoundingAdd ? ISD::AVGCEILS : ISD::AVGFLOORS;
5724+
}
57215725
return DAG.getNode(Opcode, dl, Op.getValueType(), Op.getOperand(1),
57225726
Op.getOperand(2));
57235727
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
; RUN: llc -mtriple=aarch64-unknown-linux-gnu < %s | FileCheck %s
2+
3+
define <8 x i16> @uhadd_in_disguise(<8 x i16> %a0, <8 x i16> %a1) {
4+
; CHECK-LABEL: uhadd_in_disguise:
5+
; CHECK: and
6+
; CHECK-NEXT: uhadd
7+
; CHECK-NEXT: ret
8+
%m0 = and <8 x i16> %a0, <i16 510, i16 510, i16 510, i16 510, i16 510, i16 510, i16 510, i16 510>
9+
%m1 = and <8 x i16> %a1, <i16 510, i16 510, i16 510, i16 510, i16 510, i16 510, i16 510, i16 510>
10+
%r = call <8 x i16> @llvm.aarch64.neon.shadd.v8i16(<8 x i16> %m0, <8 x i16> %m1)
11+
ret <8 x i16> %r
12+
}
13+
declare <8 x i16> @llvm.aarch64.neon.shadd.v8i16(<8 x i16>, <8 x i16>)

0 commit comments

Comments
 (0)