diff options
-rw-r--r-- | llvm/lib/IR/ConstantFold.cpp | 6 | ||||
-rw-r--r-- | llvm/test/Analysis/ConstantFolding/insertelement.ll | 19 |
2 files changed, 25 insertions, 0 deletions
diff --git a/llvm/lib/IR/ConstantFold.cpp b/llvm/lib/IR/ConstantFold.cpp index f6dbe9b5ea9..bf01f9f2ae6 100644 --- a/llvm/lib/IR/ConstantFold.cpp +++ b/llvm/lib/IR/ConstantFold.cpp @@ -833,6 +833,12 @@ Constant *llvm::ConstantFoldInsertElementInstruction(Constant *Val, ConstantInt *CIdx = dyn_cast<ConstantInt>(Idx); if (!CIdx) return nullptr; + // Do not iterate on scalable vector. The num of elements is unknown at + // compile-time. + VectorType *ValTy = cast<VectorType>(Val->getType()); + if (ValTy->isScalable()) + return nullptr; + unsigned NumElts = Val->getType()->getVectorNumElements(); if (CIdx->uge(NumElts)) return UndefValue::get(Val->getType()); diff --git a/llvm/test/Analysis/ConstantFolding/insertelement.ll b/llvm/test/Analysis/ConstantFolding/insertelement.ll new file mode 100644 index 00000000000..960042acfb4 --- /dev/null +++ b/llvm/test/Analysis/ConstantFolding/insertelement.ll @@ -0,0 +1,19 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt < %s -constprop -S | FileCheck %s + + +define <4 x i32> @insertelement_fixedlength_constant() { +; CHECK-LABEL: @insertelement_fixedlength_constant( +; CHECK-NEXT: ret <4 x i32> <i32 1, i32 undef, i32 undef, i32 undef> +; + %i = insertelement <4 x i32> undef, i32 1, i32 0 + ret <4 x i32> %i +} + +define <vscale x 4 x i32> @insertelement_scalable_constant() { +; CHECK-LABEL: @insertelement_scalable_constant( +; CHECK-NEXT: ret <vscale x 4 x i32> insertelement (<vscale x 4 x i32> undef, i32 1, i32 0) +; + %i = insertelement <vscale x 4 x i32> undef, i32 1, i32 0 + ret <vscale x 4 x i32> %i +} |