diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp --- a/llvm/lib/Analysis/InstructionSimplify.cpp +++ b/llvm/lib/Analysis/InstructionSimplify.cpp @@ -4857,6 +4857,14 @@ if (Value *Elt = findScalarElement(Vec, IdxC->getZExtValue())) return Elt; } else { + // extractelt x, (insertelt y, elt, n), n -> elt + // If the possibly-variable indices are trivially known to be equal + // (because they are the same operand) then use the value that was + // inserted directly. + auto *IE = dyn_cast(Vec); + if (IE && IE->getOperand(2) == Idx) + return IE->getOperand(1); + // The index is not relevant if our vector is a splat. if (Value *Splat = getSplatValue(Vec)) return Splat; diff --git a/llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp b/llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp --- a/llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp @@ -474,11 +474,6 @@ if (auto *I = dyn_cast(SrcVec)) { if (auto *IE = dyn_cast(I)) { - // If the possibly-variable indices are trivially known to be equal - // (because they are the same operand) then use the value that was - // inserted directly. - if (IE->getOperand(2) == Index) - return replaceInstUsesWith(EI, IE->getOperand(1)); // instsimplify already handled the case where the indices are constants // and equal by value, if both are constants, they must not be the same // value, extract from the pre-inserted value instead. diff --git a/llvm/test/Transforms/InstCombine/vector-inseltextelt.ll b/llvm/test/Transforms/InstSimplify/vector-inseltextelt.ll rename from llvm/test/Transforms/InstCombine/vector-inseltextelt.ll rename to llvm/test/Transforms/InstSimplify/vector-inseltextelt.ll --- a/llvm/test/Transforms/InstCombine/vector-inseltextelt.ll +++ b/llvm/test/Transforms/InstSimplify/vector-inseltextelt.ll @@ -1,5 +1,5 @@ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py -; RUN: opt < %s -passes=instcombine -S | FileCheck %s +; RUN: opt < %s -passes=instsimplify -S | FileCheck %s ; extracting a just-inserted element should yield the original value define float @constant_index(<4 x float> %x, float %val) {