[PATCH] D93825: [AArch64] Fix legalization of i128 ctpop without neon
Nikita Popov via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Sat Dec 26 12:37:51 PST 2020
nikic created this revision.
nikic added reviewers: paulwalker-arm, sdesmalen, david-arm.
Herald added subscribers: danielkiss, hiraditya, kristof.beyls.
nikic requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
If neon is disabled, LowerCTPOP will return `SDValue()` to indicate that normal legalization will be used. However, ReplaceNodeResults does not check for this and pushes the empty SDValue() onto the result vector, which will subsequently result in a crash.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D93825
Files:
llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
llvm/test/CodeGen/AArch64/ctpop-nonean.ll
Index: llvm/test/CodeGen/AArch64/ctpop-nonean.ll
===================================================================
--- /dev/null
+++ llvm/test/CodeGen/AArch64/ctpop-nonean.ll
@@ -0,0 +1,36 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc -mtriple=aarch64-none-linux-gnu -mattr=-neon < %s | FileCheck %s
+
+declare i128 @llvm.ctpop.i128(i128)
+
+define i128 @ctpop_i128(i128 %i) {
+; CHECK-LABEL: ctpop_i128:
+; CHECK: // %bb.0:
+; CHECK-NEXT: lsr x8, x1, #1
+; CHECK-NEXT: and x8, x8, #0x5555555555555555
+; CHECK-NEXT: sub x8, x1, x8
+; CHECK-NEXT: lsr x10, x0, #1
+; CHECK-NEXT: and x10, x10, #0x5555555555555555
+; CHECK-NEXT: and x11, x8, #0x3333333333333333
+; CHECK-NEXT: lsr x8, x8, #2
+; CHECK-NEXT: sub x10, x0, x10
+; CHECK-NEXT: and x8, x8, #0x3333333333333333
+; CHECK-NEXT: add x8, x11, x8
+; CHECK-NEXT: and x11, x10, #0x3333333333333333
+; CHECK-NEXT: lsr x10, x10, #2
+; CHECK-NEXT: and x10, x10, #0x3333333333333333
+; CHECK-NEXT: add x10, x11, x10
+; CHECK-NEXT: add x8, x8, x8, lsr #4
+; CHECK-NEXT: add x10, x10, x10, lsr #4
+; CHECK-NEXT: mov x9, #72340172838076673
+; CHECK-NEXT: and x8, x8, #0xf0f0f0f0f0f0f0f
+; CHECK-NEXT: and x10, x10, #0xf0f0f0f0f0f0f0f
+; CHECK-NEXT: mul x8, x8, x9
+; CHECK-NEXT: mul x9, x10, x9
+; CHECK-NEXT: lsr x9, x9, #56
+; CHECK-NEXT: add x0, x9, x8, lsr #56
+; CHECK-NEXT: mov x1, xzr
+; CHECK-NEXT: ret
+ %c = call i128 @llvm.ctpop.i128(i128 %i)
+ ret i128 %c
+}
Index: llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
===================================================================
--- llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
+++ llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
@@ -15905,7 +15905,8 @@
return;
case ISD::CTPOP:
- Results.push_back(LowerCTPOP(SDValue(N, 0), DAG));
+ if (SDValue Result = LowerCTPOP(SDValue(N, 0), DAG))
+ Results.push_back(Result);
return;
case AArch64ISD::SADDV:
ReplaceReductionResults(N, Results, DAG, ISD::ADD, AArch64ISD::SADDV);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D93825.313755.patch
Type: text/x-patch
Size: 2098 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20201226/f5414855/attachment.bin>
More information about the llvm-commits
mailing list