[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
Mon Dec 5 11:05:04 PST 2022


Peter updated this revision to Diff 480167.
Peter marked an inline comment as done.
Peter added a comment.

Update and remove getZExtValue()


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D139238/new/

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
@@ -13772,10 +13772,13 @@
 
   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();
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D139238.480167.patch
Type: text/x-patch
Size: 1710 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20221205/72961fd1/attachment.bin>


More information about the llvm-commits mailing list