diff --git a/llvm/lib/Target/ARM/ARMISelLowering.cpp b/llvm/lib/Target/ARM/ARMISelLowering.cpp --- a/llvm/lib/Target/ARM/ARMISelLowering.cpp +++ b/llvm/lib/Target/ARM/ARMISelLowering.cpp @@ -13773,10 +13773,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(); diff --git a/llvm/test/CodeGen/ARM/pr59317.ll b/llvm/test/CodeGen/ARM/pr59317.ll new file mode 100644 --- /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 %F + %RP = alloca i64, align 8 + %B = shl i16 %E, %E + %C1 = icmp ugt i16 %B, %F + ret i1 %C1 +}