diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp --- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp +++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp @@ -13363,6 +13363,15 @@ auto Mask = SVI->getShuffleMask(); + // Sanity check if all the indices are in range. + // If mask is `undef`, `Mask` may contain uninitialized integers and cause OOB + // later. + for (unsigned Idx : Mask) { + if (Idx >= VecTy->getNumElements() * 2) { + return false; + } + } + Type *PtrTy = UseScalable ? STVTy->getElementType()->getPointerTo(SI->getPointerAddressSpace()) diff --git a/llvm/test/CodeGen/AArch64/aarch64-shuffle-undef.ll b/llvm/test/CodeGen/AArch64/aarch64-shuffle-undef.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/AArch64/aarch64-shuffle-undef.ll @@ -0,0 +1,27 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py +; RUN: llc -mtriple=aarch64-linux-gnu < %s | FileCheck %s + +target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128" +target triple = "aarch64-unknown-linux-gnu" + +define void @f() { +; CHECK-LABEL: f: +; CHECK: // %bb.0: // %BB +; CHECK-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill +; CHECK-NEXT: .cfi_def_cfa_offset 16 +; CHECK-NEXT: mov x29, sp +; CHECK-NEXT: .cfi_def_cfa w29, 16 +; CHECK-NEXT: .cfi_offset w30, -8 +; CHECK-NEXT: .cfi_offset w29, -16 +; CHECK-NEXT: sub x9, sp, #112 +; CHECK-NEXT: and sp, x9, #0xffffffffffffffc0 +; CHECK-NEXT: mov sp, x29 +; CHECK-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload +; CHECK-NEXT: ret +BB: + %A2 = alloca <32 x i16>, align 64 + %B = urem <32 x i16> , + %S = shufflevector <32 x i16> %B, <32 x i16> %B, <32 x i32> undef + store <32 x i16> %S, <32 x i16>* %A2, align 64 + ret void +}