diff --git a/llvm/lib/IR/ConstantFold.cpp b/llvm/lib/IR/ConstantFold.cpp --- a/llvm/lib/IR/ConstantFold.cpp +++ b/llvm/lib/IR/ConstantFold.cpp @@ -853,6 +853,15 @@ } return CE->getWithOperands(Ops, ValVTy->getElementType(), false, Ops[0]->getType()->getPointerElementType()); + } else if (CE->getOpcode() == Instruction::InsertElement) { + if (const auto *IEIdx = dyn_cast(CE->getOperand(2))) { + if (APSInt::isSameValue(APSInt(IEIdx->getValue()), + APSInt(CIdx->getValue()))) { + return CE->getOperand(1); + } else { + return ConstantExpr::getExtractElement(CE->getOperand(0), CIdx); + } + } } } diff --git a/llvm/test/Transforms/InstSimplify/vscale.ll b/llvm/test/Transforms/InstSimplify/vscale.ll --- a/llvm/test/Transforms/InstSimplify/vscale.ll +++ b/llvm/test/Transforms/InstSimplify/vscale.ll @@ -95,6 +95,22 @@ ret i32 %r } +define i32 @insert_extract_element_same_vec_idx_3() { +; CHECK-LABEL: @insert_extract_element_same_vec_idx_3( +; CHECK-NEXT: ret i32 1 +; + %r = extractelement insertelement ( undef, i32 1, i64 4), i64 4 + ret i32 %r +} + +define i32 @insert_extract_element_same_vec_idx_4() { +; CHECK-LABEL: @insert_extract_element_same_vec_idx_4( +; CHECK-NEXT: ret i32 1 +; + %r = extractelement insertelement ( insertelement ( undef, i32 1, i32 4), i32 2, i64 3), i64 4 + ret i32 %r +} + ; more complicated expressions define @cmp_le_smax_always_true( %x) {