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 @@ -4531,10 +4531,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()); } @@ -4557,6 +4553,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; } diff --git a/llvm/test/Transforms/InstSimplify/extract-element.ll b/llvm/test/Transforms/InstSimplify/extract-element.ll --- a/llvm/test/Transforms/InstSimplify/extract-element.ll +++ b/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 diff --git a/llvm/test/Transforms/InstSimplify/vscale-inseltpoison.ll b/llvm/test/Transforms/InstSimplify/vscale-inseltpoison.ll --- a/llvm/test/Transforms/InstSimplify/vscale-inseltpoison.ll +++ b/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 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 @@ -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