Index: llvm/lib/Analysis/InstructionSimplify.cpp =================================================================== --- llvm/lib/Analysis/InstructionSimplify.cpp +++ llvm/lib/Analysis/InstructionSimplify.cpp @@ -4528,10 +4528,6 @@ if (auto *CIdx = dyn_cast(Idx)) return ConstantExpr::getExtractElement(CVec, CIdx); - // The index is not relevant if our vector is a splat. - if (auto *Splat = CVec->getSplatValue()) - return Splat; - if (Q.isUndefValue(Vec)) return UndefValue::get(VecVTy->getElementType()); } @@ -4554,6 +4550,10 @@ return Splat; if (Value *Elt = findScalarElement(Vec, IdxC->getZExtValue())) return Elt; + } else { + // The index is not relevant if our vector is a splat. + if (Value *Splat = getSplatValue(Vec)) + return Splat; } return nullptr; } Index: llvm/test/Transforms/InstSimplify/extract-element.ll =================================================================== --- llvm/test/Transforms/InstSimplify/extract-element.ll +++ llvm/test/Transforms/InstSimplify/extract-element.ll @@ -62,10 +62,7 @@ define i32 @extractelement_splat_variable_index(i32 %v, i32 %index) { ; CHECK-LABEL: @extractelement_splat_variable_index( -; CHECK-NEXT: [[IN:%.*]] = insertelement <3 x i32> poison, i32 [[V:%.*]], i32 0 -; CHECK-NEXT: [[SPLAT:%.*]] = shufflevector <3 x i32> [[IN]], <3 x i32> poison, <3 x i32> zeroinitializer -; CHECK-NEXT: [[R:%.*]] = extractelement <3 x i32> [[SPLAT]], i32 [[INDEX:%.*]] -; CHECK-NEXT: ret i32 [[R]] +; CHECK-NEXT: ret i32 [[V:%.*]] ; %in = insertelement <3 x i32> poison, i32 %v, i32 0 %splat = shufflevector <3 x i32> %in, <3 x i32> poison, <3 x i32> zeroinitializer Index: llvm/test/Transforms/InstSimplify/vscale-inseltpoison.ll =================================================================== --- llvm/test/Transforms/InstSimplify/vscale-inseltpoison.ll +++ llvm/test/Transforms/InstSimplify/vscale-inseltpoison.ll @@ -210,10 +210,7 @@ define i32 @extractelement_splat_variable_index(i32 %v, i32 %idx) { ; CHECK-LABEL: @extractelement_splat_variable_index( -; CHECK-NEXT: [[IN:%.*]] = insertelement poison, i32 [[V:%.*]], i32 0 -; CHECK-NEXT: [[SPLAT:%.*]] = shufflevector [[IN]], undef, zeroinitializer -; CHECK-NEXT: [[R:%.*]] = extractelement [[SPLAT]], i32 [[IDX:%.*]] -; CHECK-NEXT: ret i32 [[R]] +; CHECK-NEXT: ret i32 [[V:%.*]] ; %in = insertelement poison, i32 %v, i32 0 %splat = shufflevector %in, undef, zeroinitializer Index: llvm/test/Transforms/InstSimplify/vscale.ll =================================================================== --- llvm/test/Transforms/InstSimplify/vscale.ll +++ llvm/test/Transforms/InstSimplify/vscale.ll @@ -210,10 +210,7 @@ define i32 @extractelement_splat_variable_index(i32 %v, i32 %idx) { ; CHECK-LABEL: @extractelement_splat_variable_index( -; CHECK-NEXT: [[IN:%.*]] = insertelement undef, i32 [[V:%.*]], i32 0 -; CHECK-NEXT: [[SPLAT:%.*]] = shufflevector [[IN]], undef, zeroinitializer -; CHECK-NEXT: [[R:%.*]] = extractelement [[SPLAT]], i32 [[IDX:%.*]] -; CHECK-NEXT: ret i32 [[R]] +; CHECK-NEXT: ret i32 [[V:%.*]] ; %in = insertelement undef, i32 %v, i32 0 %splat = shufflevector %in, undef, zeroinitializer