[llvm] ee31a4a - [ARM] IselLowering unsigned overflow to crash using APInt in PerformSHLSimplify
Peter Rong via llvm-commits
llvm-commits at lists.llvm.org
Tue Dec 6 09:58:33 PST 2022
Author: Peter Rong
Date: 2022-12-06T09:58:27-08:00
New Revision: ee31a4a7029f2f6fda5f416e7eb67ca3907d9e36
URL: https://github.com/llvm/llvm-project/commit/ee31a4a7029f2f6fda5f416e7eb67ca3907d9e36
DIFF: https://github.com/llvm/llvm-project/commit/ee31a4a7029f2f6fda5f416e7eb67ca3907d9e36.diff
LOG: [ARM] IselLowering unsigned overflow to crash using APInt in PerformSHLSimplify
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.
Reviewed By: dmgreen
Differential Revision: https://reviews.llvm.org/D139238
Added:
llvm/test/CodeGen/ARM/pr59317.ll
Modified:
llvm/lib/Target/ARM/ARMISelLowering.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Target/ARM/ARMISelLowering.cpp b/llvm/lib/Target/ARM/ARMISelLowering.cpp
index c76b2bac718d2..a27afc5723da3 100644
--- a/llvm/lib/Target/ARM/ARMISelLowering.cpp
+++ b/llvm/lib/Target/ARM/ARMISelLowering.cpp
@@ -13773,10 +13773,13 @@ static SDValue PerformSHLSimplify(SDNode *N,
APInt C2Int = C2->getAPIntValue();
APInt C1Int = C1ShlC2->getAPIntValue();
+ unsigned C2Width = C2Int.getBitWidth();
+ if (C2Int.uge(C2Width))
+ return SDValue();
+ uint64_t C2Value = C2Int.getZExtValue();
// Check that performing a lshr will not lose any information.
- APInt Mask = APInt::getHighBitsSet(C2Int.getBitWidth(),
- C2Int.getBitWidth() - C2->getZExtValue());
+ APInt Mask = APInt::getHighBitsSet(C2Width, C2Width - C2Value);
if ((C1Int & Mask) != C1Int)
return SDValue();
diff --git a/llvm/test/CodeGen/ARM/pr59317.ll b/llvm/test/CodeGen/ARM/pr59317.ll
new file mode 100644
index 0000000000000..ebe80b3899b3f
--- /dev/null
+++ b/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
+}
More information about the llvm-commits
mailing list