[PATCH] D139238: [ARM] IselLowering unsigned overflow to crash using APInt in PerformSHLSimplify
Peter Rong via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Dec 2 17:06:48 PST 2022
Peter created this revision.
Herald added subscribers: hiraditya, kristof.beyls.
Herald added a project: All.
Peter requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
This diff fixes issue https://github.com/llvm/llvm-project/issues/59317
We should check if bitwidth is lower than the shift amount before we subtract them to avoid unsigned overflow.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D139238
Files:
llvm/lib/Target/ARM/ARMISelLowering.cpp
llvm/test/CodeGen/ARM/pr59317.ll
Index: llvm/test/CodeGen/ARM/pr59317.ll
===================================================================
--- /dev/null
+++ llvm/test/CodeGen/ARM/pr59317.ll
@@ -0,0 +1,25 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc -mtriple=arm %s -o - | FileCheck --check-prefix=arm %s
+; RUN: llc -mtriple=armeb %s -o - | FileCheck --check-prefix=armeb %s
+
+define i1 @pr59317(i16 %F) {
+; arm-LABEL: pr59317:
+; arm: @ %bb.0: @ %BB
+; arm-NEXT: sub sp, sp, #8
+; arm-NEXT: mov r0, #0
+; arm-NEXT: add sp, sp, #8
+; arm-NEXT: mov pc, lr
+;
+; armeb-LABEL: pr59317:
+; armeb: @ %bb.0: @ %BB
+; armeb-NEXT: sub sp, sp, #8
+; armeb-NEXT: mov r0, #0
+; armeb-NEXT: add sp, sp, #8
+; armeb-NEXT: mov pc, lr
+BB:
+ %E = extractelement <1 x i16> <i16 -1>, i16 %F
+ %RP = alloca i64, align 8
+ %B = shl i16 %E, %E
+ %C1 = icmp ugt i16 %B, %F
+ ret i1 %C1
+}
Index: llvm/lib/Target/ARM/ARMISelLowering.cpp
===================================================================
--- llvm/lib/Target/ARM/ARMISelLowering.cpp
+++ llvm/lib/Target/ARM/ARMISelLowering.cpp
@@ -13774,6 +13774,8 @@
APInt C1Int = C1ShlC2->getAPIntValue();
// Check that performing a lshr will not lose any information.
+ if (C2Int.getBitWidth() <= C2->getZExtValue())
+ return SDValue();
APInt Mask = APInt::getHighBitsSet(C2Int.getBitWidth(),
C2Int.getBitWidth() - C2->getZExtValue());
if ((C1Int & Mask) != C1Int)
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D139238.479783.patch
Type: text/x-patch
Size: 1513 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20221203/dcfe4540/attachment.bin>
More information about the llvm-commits
mailing list